首页 > 解决方案 > 带有 Keras 的 Tf.Dataset 返回 ValueError

问题描述

将 Tensorflow 数据集传递到 Keras 的 model.fit 函数时,获取与形状相关的 ValueError。

我的数据集的 X_train 具有形状(100 个样本 x 62 个特征)并且 Y_train 是(100 个样本 x 1 个标签

可重现的代码如下:

import numpy as np
from tensorflow.keras import layers, Sequential, optimizers
from tensorflow.data import Dataset

num_samples = 100
num_features = 62
num_labels = 1
batch_size = 32
steps_per_epoch = int(num_samples/batch_size)

X_train = np.random.rand(num_samples,num_features)
Y_train = np.random.rand(num_samples, num_labels)

final_dataset = Dataset.from_tensor_slices((X_train, Y_train))

model = Sequential()
model.add(layers.Dense(256, activation='relu',input_shape=(num_features,)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(num_labels, activation='softmax'))
model.compile(optimizer=optimizers.Adam(0.001), loss='categorical_crossentropy',metrics=['accuracy'])

history = model.fit(final_dataset,epochs=10,batch_size=batch_size,steps_per_epoch = steps_per_epoch)

错误是:

ValueError: Error when checking input: expected dense_input to have shape (62,) but got array with shape (1,)

为什么dense_input得到一个形状为(1,)的数组?我清楚地传递了一个 X_train 形状(n_samples,n_features)。

有趣的是,如果我将批处理(某个数字)函数应用于数据集,错误就会消失,但似乎我遗漏了一些东西。

标签: tensorflowkerastensorflow-datasets

解决方案


这是一种预期的行为。

使用 Tensorflow Dataset 时,不应batch_size在“模型”的拟合方法中指定。相反,正如您提到的,您必须使用带有 tensorflow 数据集的函数生成批次。

如文档中所述

batch_size:整数或无。每次梯度更新的样本数。如果未指定,batch_size 将默认为 32。如果您的数据是符号张量、数据集、数据集迭代器、生成器或 keras.utils.Sequence 实例(因为它们生成批次)的形式,请不要指定 batch_size

因此,经典行为就像您所做的那样:使用数据集生成批次。如果您想执行多个时期,
也可以使用。repeat另一方面,.fit您必须指定steps_per_epoch以指示一个时期有多少批次以及epochs您的时期数。


推荐阅读