9

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

我的两个问题是:

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

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

我可以从 TensorFlow 中得到“可训练变量”,问题是它们似乎每个 LSTM 节点只有一个偏差值,我见过的大多数模型都包括记忆单元、输入和输出。

4

1 回答 1

9

在内部,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 个线性变换从头开始实现它也很容易。

于 2015-12-17T17:26:12.430 回答