将Tensorflow变量存储在类中

时间:2017-05-29 20:23:43

标签: python machine-learning tensorflow deep-learning lstm

我正在努力开发自己的深度学习库,以增强我的知识并获得一些经验。我正在使用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在这里你可以找到整个代码。

我正在使用算法:http://deeplearning.net/tutorial/lstm.html

0 个答案:

没有答案