我正在努力实现已经过训练的TensorFlow基本LSTM和可以在浏览器中运行的javascript版本之间的接口.问题在于,在我读过的所有文献中,LSTM被建模为迷你网络(仅使用连接,节点和门),而TensorFlow似乎还有很多其他问题.
我有两个问题:
TensorFlow模型能否轻松转换为更传统的神经网络结构?
是否有一种实用的方法来映射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_gate
i, j, f, o = array_ops.split(1, 4, concat)
该linear
函数执行矩阵乘法,将连接输入和先前h
状态转换为4个[batch_size, self._num_units]
形状矩阵.线性变换使用您在问题中引用的单个矩阵和偏差变量.然后将结果分成LSTM变换使用的不同门.
如果您想明确获取每个门的转换,可以将该矩阵拆分为4个块.使用4或8个线性变换从头开始实现它也很容易.