将TensorFlow的LSTM转换为synapticjs

我正在尝试实现一个接口,将一个已经训练好的TensorFlow基本LSTM模型与可以在浏览器中运行的JavaScript版本连接起来。问题在于,我所阅读的所有文献中,LSTM都被建模为小型网络(仅使用连接、节点和门),而TensorFlow似乎有更多的东西在运作。

我有两个问题:

  1. TensorFlow模型是否可以轻松地转换为更传统的神经网络结构?

  2. 是否有实际的方法将TensorFlow提供的可训练变量映射到这个结构中?

我可以从TensorFlow中提取‘可训练变量’,问题是每个LSTM节点的偏置似乎只有一个值,而我见过的多数模型会为记忆单元、输入和输出包含多个偏置。


回答:

在内部,LSTMCell类为了效率,将LSTM权重存储为一个大矩阵,而不是8个较小的矩阵。将它水平和垂直分割以获得更传统的表示是相当容易的。然而,如果你的库也进行类似的优化,可能会更容易和更有效。

这是BasicLSTMCell的相关代码片段:

concat = linear([inputs, h], 4 * self._num_units, True)# i = input_gate, j = new_input, f = forget_gate, o = output_gatei, j, f, o = array_ops.split(1, 4, concat)

linear函数执行矩阵乘法,将拼接的输入和之前的h状态转换为4个形状为[batch_size, self._num_units]的矩阵。线性变换使用了一个单一的矩阵和偏置变量,这些是你问题中提到的。结果随后被分割成LSTM变换使用的不同门。

如果你想明确地获取每个门的变换,你可以将那个矩阵和偏置分割成4个块。使用4个或8个线性变换从头开始实现它也相当容易。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注