将 TensorFlow LSTM 转换为 synapticjs

Translating a TensorFlow LSTM into synapticjs

我正在努力实现已经过训练的 TensorFlow 基本 LSTM 和浏览器中可以 运行 的 javascript 版本之间的接口。问题是,在我读过的所有文献中,LSTM 都被建模为迷你网络(仅使用连接、节点和门),而 TensorFlow 似乎还有很多事情要做。

我有两个问题:

  1. 能否将TensorFlow模型轻松转化为更常规的神经网络结构?

  2. 有没有一种实用的方法可以将TensorFlow给你的可训练变量映射到这个结构中?

我可以从 TensorFlow 中得到 'trainable variables',问题是它们似乎每个 LSTM 节点只有一个偏差值,我见过的大多数模型都会包含几个偏差存储单元,输入和输出。

在内部,为了提高效率,LSTMCell class 将 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 个线性变换从头开始实现它也很容易。