我已经使用Keras和Tensorflow 1.x一段时间了,但是我正在尝试学习并更新到tensorflow 2.1(尤其是tf.data.Dataset
s)。我可以成功创建一个tfrecords文件并使用tf.data.TFRecordDataset
加载它。解析项目并进行其他一些预处理(例如规范化)后,数据集将返回一个元组,其元数据是包含各种输入(x
)张量的字典,其元数据是目标的单个值/张量(y
个值。
我可以通过使用tf.GradientTape()
手动迭代数据集来训练模型。但是,当我尝试使用model.fit
训练模型时,第一次使用输入时,模型的call
方法内部会引发以下异常。
ValueError: Attempt to convert a value (TensorSpec(shape=(16, 278, 136), dtype=tf.float32, name=None)) with an unsupported type (<class 'tensorflow.python.framework.tensor_spec.TensorSpec'>) to a Tensor.
如果在尝试使用它们之前在call
方法内部打印输入,它将显示该类型为TensorSpec而不是Tensor(暂时在输入字典中有多个占位符):>
{
'contextual': {'one_hot': {}, 'multi_hot': {}, 'dense': {}},
'sequential': {
'one_hot': {},
'multi_hot': {},
'dense': TensorSpec(shape=(16, 278, 136), dtype=tf.float32, name=None)
}
}
尽管如此,我对Tensorflow的内部了解不足,无法理解这是否是预期的事情。
对于可能发生这种情况的任何想法或解决方法,将不胜感激。
答案 0 :(得分:1)
问题似乎是Keras无法处理嵌套字典。如果将词典展平,则它可以解决错误。例如:
{
'contextual_one_hot': ...,
'contextual_multi_hot': ...,
'contextual_dense': ...,
'sequential_one_hot': ...,
'sequential_multi_hot': ...,
'sequential_one_hot': ...,
'sequential_dense': ...
}