我正在努力开发自己的深度学习库,以增强我的知识并获得一些经验。我正在使用Tensorflow。我完成了完全连接的图层并尝试实现LSTM。我将使用LSTM进行角色级别的笑话生成。
我的问题是,我想在我的LSTM类中存储以前的隐藏状态并更新Tensorflow变量。这在Tensorflow中是否可行?我不确定这是否有效,因为Tensorflow变量是事先初始化的。我已经实现了LSTM,如下所示:
def feed(self, input_tensor):
with self.graph.as_default():
with tf.name_scope(self.name):
i_t = tf.sigmoid(
tf.matmul(input_tensor, self.weights['W_i']) +
tf.matmul(self.hidden_state, self.weights['U_i']) +
self.biases['b_i']
)
C_head_t = tf.tanh(
tf.matmul(input_tensor, self.weights['W_c']) +
tf.matmul(self.hidden_state, self.weights['U_c']) +
self.biases['b_c']
)
f_t = tf.sigmoid(
tf.matmul(input_tensor, self.weights['W_f']) +
tf.matmul(self.hidden_state, self.weights['U_f']) +
self.biases['b_f']
)
next_cell_state = tf.multiply(i_t, C_head_t) + tf.multiply(f_t, self.cell_state)
o_t = tf.sigmoid(
tf.matmul(input_tensor, self.weights['W_o']) +
tf.matmul(self.hidden_state, self.weights['U_o']) +
self.biases['b_o']
)
next_hidden_state = tf.multiply(o_t, tf.tanh(next_cell_state))
self.hidden_state = tf.assign(ref=self.hidden_state, value=next_hidden_state)
self.cell_state = tf.assign(ref=self.cell_state, value=next_cell_state)
tf.summary.histogram('hidden_state', self.hidden_state)
tf.summary.histogram('cell_state', self.cell_state)
for k, v in self.weights.items():
tf.summary.histogram(k, v)
for k, v in self.biases.items():
tf.summary.histogram(k, v)
return next_hidden_state
我形成如下的Tensorflow图:
self.feed_forward = self.input_tensor
for l in self.layers:
self.feed_forward = l.feed(self.feed_forward)
self.loss_opt = self.loss_function(self.feed_forward, self.output_tensor)
self.fit_opt = self.optimizer.minimize(self.loss_opt)
init = tf.global_variables_initializer()
self.sess.run(init)
然后我在会话中运行feed_forward变量来预测,fit_opt变量来更新模型。
我将LSTM层与完全连接的层连接起来。我相信完全连接的图层工作正常,因为我在基本数据集上测试它。 LSTM的隐藏状态输入到完全连接的层。 softmax_cross_entropy用作损失函数,AdamOptimizer用于更新模型。
当我训练LSTM时,我得到了毫无意义的结果。我认为隐藏状态和单元状态更新无法正常工作。调试模型的最佳方法是什么?我通过Tensorboard查看了我的图表和张量直方图。图表看起来很好,直方图会随着时间的推移而更新。
我怀疑以下部分
self.hidden_state = tf.assign(ref=self.hidden_state, value=next_hidden_state)
self.cell_state = tf.assign(ref=self.cell_state, value=next_cell_state)
PS:我使用truncated_normal初始化trensors。单元状态和隐藏状态变量具有trainable = False,其初始值为零向量。
https://github.com/ceteke/MyNN在这里你可以找到整个代码。