Tensorflow - веса моделей Seq2Seq загружены неправильно - PullRequest
0 голосов
/ 05 сентября 2018

Я работаю над encoder-decoder чат-ботом, который состоит из embedding layer, двух слоев LSTM и fully connected layer поверх декодера.

После загрузки checkpoint file значение loss становится намного выше, чем в прошлый раз, когда я сохранял модель, и результаты бот-чата, как и ожидалось, намного хуже. И все же модель не вернулась в исходное состояние. Это означает, что если я сохранил модель, когда у нее было 2,4 потери, она будет загружаться с 4-5 потерями вместо 10 (это потеря, которая была у модели до того, как она начала изучаться).

Кроме того, модель учится намного быстрее после загрузки весов, что наводит меня на мысль, что некоторые веса были загружены успешно, а некоторые - нет.

Я использую этот код для построения модели и загрузки checkpoint в функцию __init__:

self.__gather_data()        
self.__build_model()    
tf.global_variables_initializer().run(session=self.sess)        
self.saver = tf.train.Saver(tf.global_variables())
try:
    self.saver.restore(self.sess, self.checkpoint_path)
except:
    print('Starting from scratch.')

Вот как я строю модель в функции __build_model:

# placeholders
with tf.variable_scope(self.scope + '-placeholders'):       
    self.inputs = tf.placeholder(tf.int32,[None, self.input_length], name='inputs')
    self.outputs = tf.placeholder(tf.int32, [None, None], name='outputs')
    self.targets = tf.placeholder(tf.int32, [None, None], name='targets')   

# embedding
with tf.variable_scope(self.scope + 'embedding'):
    self.input_embedding = tf.Variable(tf.ones((self.vocab_size, self.embed_size)))
    self.output_embedding = tf.Variable(tf.ones((self.vocab_size, self.embed_size)))
    input_embed = tf.nn.embedding_lookup(self.input_embedding, self.inputs)
    output_embed = tf.nn.embedding_lookup(self.output_embedding, self.outputs)

# encoder
with tf.variable_scope(self.scope + '-encoder'):
    lstm_enc_1 = tf.contrib.rnn.LSTMCell(self.hidden_size, reuse=tf.AUTO_REUSE)
    lstm_enc_2 = tf.contrib.rnn.LSTMCell(self.hidden_size, reuse=tf.AUTO_REUSE)
    _, last_state = tf.nn.dynamic_rnn(tf.contrib.rnn.MultiRNNCell(cells=[lstm_enc_1, lstm_enc_2]), inputs=input_embed, dtype=tf.float32)

# decoder
with tf.variable_scope(self.scope + '-decoder'):
    lstm_dec_1 = tf.contrib.rnn.LSTMCell(self.hidden_size, reuse=tf.AUTO_REUSE) 
    lstm_dec_2 = tf.contrib.rnn.LSTMCell(self.hidden_size, reuse=tf.AUTO_REUSE) 
    dec_outputs, _ = tf.nn.dynamic_rnn(tf.contrib.rnn.MultiRNNCell(cells=[lstm_dec_1, lstm_dec_2]), inputs=output_embed, initial_state=last_state, dtype=tf.float32)            
    self.logits = tf.contrib.layers.fully_connected(dec_outputs, num_outputs=self.vocab_size, activation_fn=None, reuse=tf.AUTO_REUSE, scope='fully_connected')

# loss and optimizer
with tf.variable_scope(self.scope + '-optimizing'):
    self.loss = tf.contrib.seq2seq.sequence_loss(self.logits, self.targets, tf.ones([self.batch_size, self.input_length]))
    self.optimizer = tf.train.RMSPropOptimizer(0.001).minimize(self.loss)

И я использую эту функцию для сохранения веса во время тренировки:

self.saver.save(self.sess, self.checkpoint_path)
...