Получение последнего вывода dynamic_rnn в TensorFlow сломало модель - PullRequest
0 голосов
/ 27 октября 2018

Итак, я возился с моделью TF, в которой есть эта часть:

outputs, _  = tf.nn.dynamic_rnn(
                            rnn_cell,
                            embeddings,
                            dtype=tf.float32,
                            swap_memory=True,
                            sequence_length=num_tels_triggered)

 # (batch_size, max_num_tel * LSTM_SIZE)
 outputs = tf.layers.flatten(outputs)
 output_dropout = tf.layers.dropout(outputs, rate=dropout_rate, training=training, name="rnn_output_dropout")

 fc1 = tf.layers.dense(inputs=output_dropout, units=1024, kernel_regularizer=tf.contrib.layers.l2_regularizer(scale=0.004), name="fc1")

Теперь этот код получает все выходные данные LSTM и объединяет их вместе.Я не хотел этого, но вместо этого я хотел только получить последний вывод LSTM.Поэтому я изменил это так:

_, final_state = tf.nn.dynamic_rnn(
                        rnn_cell,
                        embeddings,
                        dtype=tf.float32,
                        swap_memory=True,
                        sequence_length=num_tels_triggered,
                        time_major = True)

output_rnn = final_state.h # last output of the sequence
output_dropout = tf.layers.dropout(output_rnn, rate=dropout_rate, training=training, name="rnn_output_dropout")

fc1 = tf.layers.dense(inputs=output_dropout, units=1024, kernel_regularizer=tf.contrib.layers.l2_regularizer(scale=0.004), name="fc1")

Увы, когда я тренирую модель, я получаю страшную ошибку:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [4] vs. [16]
 [[Node: gradients/softmax_cross_entropy_loss/Mul_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _device="/job:localhost/replica:0/task:0/device:GPU:0"](gradients/softmax_cross_entropy_loss/Mul_grad/Shape, gradients/softmax_cross_entropy_loss/Mul_grad/Shape_1)]]
 [[Node: ConstantFoldingCtrl/softmax_cross_entropy_loss/assert_broadcastable/AssertGuard/Switch_0/_472 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_375_C...d/Switch_0", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

Я замечаю, что я действительно смущен, потому что внесенные мной изменениябыло чрезвычайно локальным: если мое понимание верно, оно не должно было изменить формы выходов сети или иметь какие-либо другие побочные эффекты.

Может ли кто-нибудь дать мне правдоподобную гипотезу о побочных эффектах этого изменения?Правильно ли я в том, что формы тензоров вниз по течению не должны были измениться?Эффективно ли мои изменения выполняют то, что я хочу (только после подачи последнего вывода LSTM в плотный слой)?

...