我正在尝试使用tensorflow创建循环神经网络。我的代码是这样的:
import tensorflow as tf
rnn_cell = tf.nn.rnn_cell.GRUCell(3)
inputs = [tf.constant([[0, 1]], dtype=tf.float32), tf.constant([[2, 3]], dtype=tf.float32)]
outputs, end = tf.nn.rnn(rnn_cell, inputs, dtype=tf.float32)
现在,一切运行正常。但是,我对实际发生的事情感到困惑。输出尺寸始终是批量大小x rnn单元格隐藏状态的尺寸-它们如何完全独立于输入尺寸?
如果我的理解是正确的,则在每个步骤将输入连接到rnn的隐藏状态,然后乘以权重矩阵(以及其他操作)。这意味着权重矩阵的尺寸需要取决于输入大小,这是不可能的,因为rnn_cell是在声明输入之前创建的!
在看到关于tensorflow的GRU实现的问题的答案后,我意识到了发生了什么。与我的直觉相反,GRUCell构造函数根本不创建任何权重或偏差变量。相反,它创建自己的变量作用域,然后在实际调用时按需实例化变量。Tensorflow的变量作用域机制可确保变量仅创建一次,并在后续对GRU的调用中共享。
我不确定他们为什么决定采用这种相当混乱的实现方式,据我所知,这是没有记载的。对我来说,使用python的对象级变量作用域将tensorflow变量封装在GRUCell本身中似乎更合适,而不是依赖于其他隐式作用域机制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句