MultiRNN не работает со списком одинаковых ячеек BasicLSTM - PullRequest
0 голосов
/ 01 июня 2018

Следующий код не работает, если используются те же базовые ячейки (cell1, cell1) для MultiRNNCell:

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)

Где этот код работает с (cell1, cell2).Но cell2 совпадает с cell1:

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, cell2] )
init = multi.zero_state(64, tf.float32)
output,state = multi(tf.ones([64,512]),init)

Могу ли я узнать разницу в обоих примерах кода?

Ошибка заключается в следующем:

ValueError: Размеры должны быть равны, но равны 256 и 640 для 'multi_rnn_cell / cell_0 / cell1 / MatMul_1' (op: 'MatMul') с входными формами: [64,256], [640,512].

1 Ответ

0 голосов
/ 02 июня 2018

Это известное ограничение (например, обсуждаемое здесь ).Проблема в том, что каждый экземпляр ячейки создает внутреннюю переменную для весов.Размерность этой переменной определяется скрытым размером (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 может создавать разные матрицы для разных слоев и правильно обрабатывать фигуры.

...