'Constructor.
:param rbm_layers: list containing the hidden units for each layer
:param finetune_loss_func: Loss function for the softmax layer.
string, default [\'softmax_cross_entropy\', \'mse\']
:param finetune_dropout: dropout parameter
:param finetune_learning_rate: learning rate for the finetuning.
float, default 0.001
:param finetune_act_func: activation function for the finetuning phase
:param finetune_opt: optimizer for the finetuning phase
:param finetune_num_epochs: Number of epochs for the finetuning.
int, default 20
:param finetune_batch_size: Size of each mini-batch for the finetuning.
int, default 20
:param do_pretrain: True: uses variables from pretraining,
False: initialize new variables.'

def __init__(self, rbm_layers, name='dbn', do_pretrain=False, rbm_num_epochs=[10], rbm_gibbs_k=[1], rbm_gauss_visible=False, rbm_stddev=0.1, rbm_batch_size=[10], rbm_learning_rate=[0.01], finetune_dropout=1, finetune_loss_func='softmax_cross_entropy', finetune_act_func=tf.nn.sigmoid, finetune_opt='sgd', finetune_learning_rate=0.001, finetune_num_epochs=10, finetune_batch_size=20, momentum=0.5):

    SupervisedModel.__init__(self, name)
    self.loss_func = finetune_loss_func
    self.learning_rate = finetune_learning_rate
    self.opt = finetune_opt
    self.num_epochs = finetune_num_epochs
    self.batch_size = finetune_batch_size
    self.momentum = momentum
    self.dropout = finetune_dropout
    self.loss = Loss(self.loss_func)
    self.trainer = Trainer(finetune_opt, learning_rate=finetune_learning_rate, momentum=momentum)
    self.do_pretrain = do_pretrain
    self.layers = rbm_layers
    self.finetune_act_func = finetune_act_func
    self.encoding_w_ = []
    self.encoding_b_ = []
    self.softmax_W = None
    self.softmax_b = None
    rbm_params = {'num_epochs': rbm_num_epochs, 'gibbs_k': rbm_gibbs_k, 'batch_size': rbm_batch_size, 'learning_rate': rbm_learning_rate}
    for p in rbm_params:
        if (len(rbm_params[p]) != len(rbm_layers)):
            rbm_params[p] = [rbm_params[p][0] for _ in rbm_layers]
    self.rbms = []
    self.rbm_graphs = []
    for (l, layer) in enumerate(rbm_layers):
        rbm_str = ('rbm-' + str((l + 1)))
        if ((l == 0) and rbm_gauss_visible):
            self.rbms.append(rbm.RBM(name=((self.name + '-') + rbm_str), num_hidden=layer, learning_rate=rbm_params['learning_rate'][l], num_epochs=rbm_params['num_epochs'][l], batch_size=rbm_params['batch_size'][l], gibbs_sampling_steps=rbm_params['gibbs_k'][l], visible_unit_type='gauss', stddev=rbm_stddev))
        else:
            self.rbms.append(rbm.RBM(name=((self.name + '-') + rbm_str), num_hidden=layer, learning_rate=rbm_params['learning_rate'][l], num_epochs=rbm_params['num_epochs'][l], batch_size=rbm_params['batch_size'][l], gibbs_sampling_steps=rbm_params['gibbs_k'][l]))
        self.rbm_graphs.append(tf.Graph())
