Это известное ограничение (например, обсуждаемое здесь ).Проблема в том, что каждый экземпляр ячейки создает внутреннюю переменную для весов.Размерность этой переменной определяется скрытым размером (128
в вашем случае) и размером ввода, который получает этот экземпляр ячейки (512
).Когда вы используете одну и ту же ячейку несколько раз , вы должны убедиться, что ввод одинаков во всех случаях.
Рассмотрим пример кода:
import tensorflow as tf
cell1 = tf.contrib.rnn.BasicLSTMCell(128,reuse=False, name = "cell1")
cell2 = tf.contrib.rnn.BasicLSTMCell(128,reuse=False,name = "cell2")
multi = tf.contrib.rnn.MultiRNNCell([cell1, cell1] )
init = multi.zero_state(64, tf.float32)
output,state = multi(tf.ones([64,512]),init)
Входыдля двух ячеек в multi
будут [..., 640]
и [..., 256]
, потому что 640=512+128
(ячейка получает вход как от предыдущей ячейки, так и от входной последовательности).Следовательно, матрица весов внутри них будет [640, 512]
и [256, 512]
(512
здесь на самом деле 128*4
, а не размер ввода).
Но вы используете тот же экземпляр ячейки!Tensorflow пытается сопоставить уже имеющуюся матрицу с новым входом и завершается неудачей.С другой стороны, когда вы используете разные экземпляры, tenorflow может создавать разные матрицы для разных слоев и правильно обрабатывать фигуры.