我目前正在使用ImageNet数据集,你可能知道它非常大。
我已经将其从.tar文件预处理成了tfrecord文件。
我目前使用以下方式加载数据集:
train, val = tfds.load(*)
所以我有两个tfds:train和val。
然后我使用以下代码调整它们:
def resize_with_crop(image, label): i = image i = tf.cast(i, tf.float32) i = tf.image.resize_with_crop_or_pad(i, 224, 224) i = tf.keras.applications.mobilenet_v2.preprocess_input(i) return (i, label)# 预处理图像train = train.map(resize_with_crop)val = val.map(resize_with_crop)
这些步骤是我从这里学到的。
当我尝试拟合我的模型时,d = model.fit(train, validation_data=val,...)
,其中第一层的形状为(None, 224, 224, 3),我收到了以下错误:ValueError: Input 0 of layer conv2d is incompatible with the layer: expected ndim=4, found ndim=3
我认为这个问题是因为模型一次只接收一张图像(因此没有4D形状)。我无法将数据集保存在内存中以重构为(None, 224, 224, 3),就像处理cifar-10数据集那样。
我的问题是,现在图像的形式为(224, 224, 3),如何将它们用于期望4D形状的TensorFlow模型,而我无法在内存中重塑数据集?
或者,有没有办法调整tfds的形状,使其作为模型的输入?
我不确定我是否完全理解tfds,这就是我遇到这个问题的根本原因。此外,我确信标签也会引起问题(因为它们是整数),那么如何重新构造tfds的标签,使其为模型的一热编码?
回答:
tfds.load
返回一个tf.data.Dataset
对象。因此,你可以对返回的值执行任何与TensorFlow数据集相关的操作。
输入的4D数据通常期望为(batch_size, Hight, Width, Channel)
。所以,如果你的图像形状为(224,224,3),你需要对它们进行批处理,以便添加批次维度,以符合模型的期望。
要对数据集进行批处理,只需使用.batch(batch_size)
:
train = train.batch(32)val = val.batch(32)