ValueError: Trying to share variable rnn/multi_rnn_cell/cell_0/lstm_cell/kernel

ValueError: Trying to share variable 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).

版本: 张量流 1.2.1 Python3.5.4

此处的变体似乎不起作用:

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

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

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

您看到的形状是每个单元格的内核大小,至少是它们应该的大小。 LSTM 内核可以看作大小为 n + m x 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])