我想使用tf.data.Dataset
类填充数据
from tensorflow_core.python.keras.datasets import cifar10
(train_images, train_labels), (test_images, test_labels) = cifar10.load_data()
train_dataset = tf.data.Dataset.from_tensor_slices((train_images, train_labels))
test_dataset = tf.data.Dataset.from_tensor_slices((test_images, test_labels))
我这样做是为了在管道中使用Dataset
。
进一步利用Dataset
的其他功能。
我正在这样定义我的模型
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPool2D((2, 2)))
# more layers
但是当我打电话训练模型时
model.fit(train_dataset, epochs=10, validation_data=test_dataset, callbacks=[ cp_callback])
我遇到错误
ValueError:检查输入时出错:预期conv2d_input具有4维,但数组的形状为(32,32,3)
DataSet
?Tensorflow教程(https://www.tensorflow.org/tutorials/load_data/numpy)没有涵盖这种情况,我无法找到可以帮助我解决问题的解释。
答案 0 :(得分:1)
应将批处理生成器以任意批处理大小添加到数据集中。基于Tensorflow的文档here,batch
函数:
将此数据集的连续元素合并为批。 结果元素的组件将具有一个额外的外部 维度,该维度将为
batch_size
(或最后一个为N % batch_size
如果batch_size
不除以输入元素N
的数量 且drop_remainder
是False
)。如果您的程序取决于 具有相同外部尺寸的批次,应设置drop_remainder
True
的参数以防止生成较小的批次。
假设您的批量大小为16
。然后:
my_batch_size =16
train_dataset = tf.data.Dataset.from_tensor_slices((train_images, train_labels))
test_dataset = tf.data.Dataset.from_tensor_slices((test_images, test_labels))
# Shapes of data are (32,32,3) here
train_dataset.batch(my_batch_size)
test_dataset.batch(my_batch_size)
# Shapes of data are (None,32,32,3) or (16,32,32,3) here
然后您可以训练模型。