tensorflow 2.1和tf.data.Dataset的model.fit ValueError:尝试转换TensorSpec值

时间:2020-02-27 21:38:20

标签: tensorflow keras

我已经使用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的内部了解不足,无法理解这是否是预期的事情。

对于可能发生这种情况的任何想法或解决方法,将不胜感激。

1 个答案:

答案 0 :(得分:1)

问题似乎是Keras无法处理嵌套字典。如果将词典展平,则它可以解决错误。例如:

{
    'contextual_one_hot': ...,
    'contextual_multi_hot': ...,
    'contextual_dense': ...,
    'sequential_one_hot': ...,
    'sequential_multi_hot': ...,
    'sequential_one_hot': ...,
    'sequential_dense': ...
}