Итак, я возился с моделью 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 в плотный слой)?