【问题标题】:Translating a TensorFlow LSTM into synapticjs将 TensorFlow LSTM 翻译成 synapticjs
【发布时间】:2016-03-23 07:44:58
【问题描述】:
我正在努力在已经训练过的 TensorFlow 基本 LSTM 和可以在浏览器中运行的 javascript 版本之间实现一个接口。问题是,在我读过的所有文献中,LSTM 都被建模为迷你网络(仅使用连接、节点和门),而 TensorFlow 似乎还有很多事情要做。
我的两个问题是:
TensorFlow 模型能否轻松转化为更传统的神经网络结构?
有没有实用的方法将 TensorFlow 提供的可训练变量映射到这个结构?
我可以从 TensorFlow 中获取“可训练变量”,问题是它们似乎每个 LSTM 节点只有一个偏差值,而我见过的大多数模型都包含记忆单元的多个偏差,输入和输出。
【问题讨论】:
标签:
machine-learning
neural-network
tensorflow
lstm
tensorboard
【解决方案1】:
在内部,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 个线性变换从头开始实现它也很容易。