Keras传入tf.data.Dataset触发层输入应为张量TypeError报错
问题原因
报错核心是两个用法错误:
- 模型直接调用(即
model(xxx)的写法)时,入参必须是和输入层维度匹配的张量/NumPy数组,tf.data.Dataset是数据集迭代器对象,本身不是张量,不能直接传入。 - 你创建的原始
Dataset里存的是(单条特征, 单条标签)的元组,就算手动加了batch打包,整个数据集对象依然包含模型不需要的标签字段,不符合模型输入要求。
解决方法
预览前5条样本预测结果的正确写法
- 先给数据集加预处理,把特征转成浮点型——Dense层默认接收浮点输入,你现在存的int64类型后续训练也会触发类型报错:
def parse_sample(x, y): return tf.cast(x, tf.float32), y train_dataset = tf.data.Dataset.from_tensor_slices((train.values, trainLabel.values)).map(parse_sample) test_dataset = tf.data.Dataset.from_tensor_slices((test.values, testLabel.values)).map(parse_sample) cv_dataset = tf.data.Dataset.from_tensor_slices((val.values, valLabel.values)).map(parse_sample) - 给数据集做批次打包,你要预览5条结果,直接把批大小设为5即可:
preview_batch = train_dataset.batch(5).take(1) - 从批次里取出特征张量传入模型,不要把标签一起传入:
for features, targets in preview_batch: predictions = model(features) print("前5条样本预测结果:\n", predictions)
正式训练的注意点
如果是用model.fit()做正式训练,是支持直接传入tf.data.Dataset对象的,不需要手动取张量喂入,但要提前做好两个配置:
- 训练集要做shuffle打乱、所有数据集要做batch打包
- 数据集的结构保持
(输入特征, 标签)的元组格式即可,和你现在创建的结构一致
示例代码:
# 数据集打乱+分批次 train_dataset = train_dataset.shuffle(buffer_size=1000).batch(32) test_dataset = test_dataset.batch(32) cv_dataset = cv_dataset.batch(32) # 编译模型,最后一层没有加softmax激活,所以损失函数要开from_logits model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) # 直接传入数据集即可启动训练 model.fit(train_dataset, epochs=10, validation_data=cv_dataset)
内容的提问来源于stack exchange,提问作者James tan
相关产品推荐
相关产品推荐

