密集层无法识别输入形状,即使它应该识别

  • 本文关键字:识别 python tensorflow keras
  • 更新时间 :
  • 英文 :


最重要的是我得到了这个错误,我已经看到了一些关于它的帖子,但似乎没有什么是正确的。

ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

我使用tf.data.Dataset作为输入,它在字典中产生可变长度的输出。我使用的是.padded_batch,一切都按预期进行了填充。

每个样本都有点像{'seq_feature1': [1, 2, 3], 'seq_feature2': [5, 6], 'feature': 10}(在批处理和填充填充之前(——在我的网络中,每个seq_feature都使用tf.keras.layers.Embedding嵌入,然后连接并通过LSTM,然后再次连接到另一个嵌入的特征(无时间维度(,然后进入一个密集层,在那里一切都出错了。

这就是我的前向传递的样子(模型是作为子类实现的,所以这是call方法的一部分(:

# self.embedding1 & 2 & 3 are tf.keras.layers.Embedding
embedded_seq1 = self.embedding1(inputs['seq_feature1'])  # (batch_size, seq_len, emb_dim1)
embedded_seq2 = self.embedding2(inputs['seq_feature2'])  # (batch_size, seq_len, emb_dim2)
embedded_feat = tf.squeeze(self.embedding3(inputs['feature']))  # (batch_size, emb_dim3)
# project and pass through LSTM
x = tf.concat([embedded_seq1, embedded_seq2], axis=-1)
x = self.dense1(x)  # <-- Works as expected, (batch_size, seq_len, dense1_units)
x = self.lstm(x)  # (batch_size, lstm_units)
# concat pass through Dense
x = tf.concat([x, embedded_feat, axis=-1)  # (batch_size, lstm_units + emb_dim3)
# ERROR GETS THROWN HERE
x = self.dense2(x)

最后一行抛出前面提到的ValueError,这没有任何意义。我可以计算输入的最后一个维度,并使用热切的执行和逐层运行来验证它(这是有效的,只有在一次运行时错误才会失败(。

我在这里错过了什么?

*实际代码在LSTM中使用掩码,但与后期无关我猜


编辑

如果我显式调用self.dense2.build(tf.TensorShape([None, <the_number_i_can_calculate_but_tf_cant>])),我可以避免这个错误,但由于我可以使用lstm_units + emb_dim3轻松计算它,所以它仍然是一个错误,我不明白为什么会发生

可能会触发此错误,因为生成器的输出形状没有传递到模型的第一层,在您的情况下是嵌入层。我也遇到过类似的问题,我用变通方法解决了这个问题。对于每个输入,您应该手动初始化形状:

my_model._layers[0]._batch_input_shape= my_geneartor.element_spec[0].shape
my_model = tf.keras.models.model_from_json(my_model.to_json()) #rebuilding the model

它适用于tf 2.1版本。

相关内容

  • 没有找到相关文章

最新更新