首页 > 解决方案 > ValueError:尝试共享变量 rnn/multi_rnn_cell/cell_0/lstm_cell/kernel

问题描述

代码:

import tensorflow as tf
from tensorflow.python.ops import rnn_cell

cell = rnn_cell.LSTMCell(64, state_is_tuple=True)
multi_layer_cell = tf.nn.rnn_cell.MultiRNNCell([cell for i in range(2)])
x = tf.placeholder("float", [None, 10, 1])
output, state = tf.nn.dynamic_rnn(multi_layer_cell, x, dtype = tf.float32)

错误:

ValueError: Trying to share variable rnn/multi_rnn_cell/cell_0/lstm_cell/kernel, but specified shape (128, 256) and found shape (65, 256).

版本:Tensorflow 1.2.1 Python 3.5.4

这里的变体似乎不起作用:ValueError: Trying to share variable rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel

标签: python-3.xtensorflowlstmrnn

解决方案


问题是您正在制作重复两次相同对象的列表

multi_layer_cell = tf.nn.rnn_cell.MultiRNNCell([cell for i in range(2)])

cell 不仅为多层单元指定参数,还直接使用对象。但是,对于您的神经网络,您的第一个单元格会将大小为 1 的输入映射到 64,然后您的第二个单元格会将 64 映射到 64。

您看到的形状是每个单元格的内核大小,至少它们应该是什么。LSTM 内核可以被视为大小 n + mx 4m,其中 n 是输入大小,m 是状态大小。因子 4 来自于有 4 个需要矩阵权重的门这一事实。n + m 来自于将输入 -> 门转换堆叠在状态 -> 门转换之上。例如,在您的第一个单元格中,n = 1 和 m = 64,因此您会看到大小 (65, 256),这显然不适用于需要大小为 (128, 256) 的内核的第二个单元格(因为 64 + 64 = 128 不是 65)。

要解决此问题,只需制作两个不同的单元格对象:

cell_1 = rnn_cell.LSTMCell(64, state_is_tuple=True)
cell_2 = rnn_cell.LSTMCell(64, state_is_tuple=True)
multi_layer_cell = tf.nn.rnn_cell.MultiRNNCell([cell_1,cell_2])

推荐阅读