最重要的是我得到了这个错误,我已经看到了一些关于它的帖子,但似乎没有什么是正确的。
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版本。