'Constructor.
:param layers: list containing the hidden units for each layer
:param finetune_loss_func: Loss function for the softmax layer.
string, default [\'cross_entropy\', \'mse\']
:param finetune_dropout: dropout parameter
:param finetune_learning_rate: learning rate for the finetuning.
float, default 0.001
:param finetune_enc_act_func: activation function for the encoder
finetuning phase
:param finetune_dec_act_func: activation function for the decoder
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, layers, name='srbm', num_epochs=[10], batch_size=[10], learning_rate=[0.01], gibbs_k=[1], loss_func=['mse'], momentum=0.5, finetune_dropout=1, finetune_loss_func='cross_entropy', finetune_enc_act_func=[tf.nn.relu], finetune_dec_act_func=[tf.nn.sigmoid], finetune_opt='sgd', finetune_learning_rate=0.001, regcoef=0.0005, finetune_num_epochs=10, noise=['gauss'], stddev=0.1, finetune_batch_size=20, do_pretrain=False, tied_weights=False, regtype=['none'], finetune_regtype='none'):

    expanded_args = utilities.expand_args(**locals())
    UnsupervisedModel.__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.regtype = finetune_regtype
    self.regcoef = regcoef
    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 = layers
    self.tied_weights = tied_weights
    self.finetune_enc_act_func = expanded_args['finetune_enc_act_func']
    self.finetune_dec_act_func = expanded_args['finetune_dec_act_func']
    self.input_ref = None
    self.encoding_w_ = []
    self.encoding_b_ = []
    self.decoding_w = []
    self.decoding_b = []
    self.reconstruction = None
    self.rbms = []
    self.rbm_graphs = []
    for (l, layer) in enumerate(layers):
        rbm_str = ('rbm-' + str((l + 1)))
        new_rbm = rbm.RBM(name=((self.name + '-') + rbm_str), loss_func=expanded_args['loss_func'][l], visible_unit_type=expanded_args['noise'][l], stddev=stddev, num_hidden=expanded_args['layers'][l], learning_rate=expanded_args['learning_rate'][l], gibbs_sampling_steps=expanded_args['gibbs_k'][l], num_epochs=expanded_args['num_epochs'][l], batch_size=expanded_args['batch_size'][l], regtype=expanded_args['regtype'][l])
        self.rbms.append(new_rbm)
        self.rbm_graphs.append(tf.Graph())
