如何使用Tensorflow数据集进行CNN模型训练

时间:2019-11-29 18:39:47

标签: python tensorflow keras

我想使用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)

  • 真正发生了什么?如何在我的Conv2D图层中使用带有input_shape =(32,32,3)的DataSet

Tensorflow教程(https://www.tensorflow.org/tutorials/load_data/numpy)没有涵盖这种情况,我无法找到可以帮助我解决问题的解释。

1 个答案:

答案 0 :(得分:1)

应将批处理生成器以任意批处理大小添加到数据集中。基于Tensorflow的文档herebatch函数:

  

将此数据集的连续元素合并为批。       结果元素的组件将具有一个额外的外部       维度,该维度将为batch_size(或最后一个为N % batch_size       如果batch_size不除以输入元素N的数量       且drop_remainderFalse)。如果您的程序取决于       具有相同外部尺寸的批次,应设置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

然后您可以训练模型。