TensorFlow 1.8中RNNCell变量无需手动复用?版本差异及困惑
关于TensorFlow中RNN变量复用的疑问解答
这个问题其实涉及到TensorFlow不同版本对RNN变量管理的优化,以及RNNCell变量共享的正确方式,我来帮你理清其中的逻辑:
1. 不同TensorFlow版本的自动复用差异
你观察到的两种截然不同的结果,核心是TensorFlow版本对RNN变量作用域的优化:
- 在TensorFlow r0.12这类旧版本中,RNNCell的变量并不会自动复用。当你在同一个
tf.variable_scope下多次调用cell的__call__方法时,每次都会尝试创建新的变量,所以必须手动添加if time_step > 0: tf.get_variable_scope().reuse_variables()来告诉框架“复用已有的变量”,否则就会抛出你遇到的错误:ValueError: Variable Model/RNN/MultiRNNCell/Cell0/BasicLSTMCell/Linear/Matrix already exists, disallowed.
- 而在你实验的较新版本中,TensorFlow对RNN的变量管理做了优化:当你在同一个变量作用域内,循环调用同一个RNNCell实例时,框架会自动检测并复用已创建的变量,无需手动调用
reuse_variables()。你打印tf.all_variables()看到没有重复变量,就是这个优化在起作用。
2. 同一作用域创建多个RNNCell对象不共享变量的原因
你提到的“同一变量作用域中创建多个RNNCell对象,每个对象都会创建自己的变量”是正常现象,因为:
每个RNNCell实例都是一个独立的变量容器——哪怕在同一个作用域下,只要你新建了一个RNNCell对象(比如重复执行cell = BasicLSTMCell(...)),就会生成一套全新的变量。
如果想要共享变量,正确的姿势是复用同一个RNNCell实例,而不是创建多个对象。比如你原来代码中的循环逻辑:先创建好一个cell对象,然后在循环里反复调用这个cell的__call__方法,这样才能实现变量共享。
总结一下
- 新版本TensorFlow对RNN变量复用做了简化,循环调用同一个cell实例时,无需手动设置复用,框架自动处理;
- 要实现RNN变量共享,必须复用同一个cell实例,创建多个cell对象必然会生成独立的变量集合。
内容的提问来源于stack exchange,提问作者Joey
相关产品推荐
相关产品推荐

