tensorflow - 带有 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)。
有趣的是,如果我将批处理(某个数字)函数应用于数据集,错误就会消失,但似乎我遗漏了一些东西。
解决方案
这是一种预期的行为。
使用 Tensorflow Dataset 时,不应batch_size
在“模型”的拟合方法中指定。相反,正如您提到的,您必须使用带有 tensorflow 数据集的函数生成批次。
如文档中所述
batch_size:整数或无。每次梯度更新的样本数。如果未指定,batch_size 将默认为 32。如果您的数据是符号张量、数据集、数据集迭代器、生成器或 keras.utils.Sequence 实例(因为它们生成批次)的形式,请不要指定 batch_size。
因此,经典行为就像您所做的那样:使用数据集生成批次。如果您想执行多个时期,
也可以使用。repeat
另一方面,.fit
您必须指定steps_per_epoch
以指示一个时期有多少批次以及epochs
您的时期数。
推荐阅读
- java - JVM_Read 持续消耗 CPU
- julia - 使用字符串选择函数和/或变量 (Julia)
- git - git svn clone,只包含最后n个版本
- r - Error: No tidy method for objects of class LDA_VEM§
- mysql - 获取从属状态时的 MySQL ER_SPECIFIC_ACCESS_DENIED_ERROR
- java - How to sign with RSASSA-PSS in Java correctly?
- python - Enumerating dataframe based on a column
- c# - 自动将 JSON 属性映射到 C# 属性
- javascript - 更改 SMTP 用户密码的自动化
- javascript - 如何从右到左匹配 React Router 路径