我目前正在使用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)
# Preprocess the images
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),我怎么能使用它们与一个张sorflow模型,期望一个4d形状,但我不能在内存中重塑数据集?
或者有一种方法来调整tfds的形状,使其作为模型的输入?
我不确定我完全理解tfds,这就是为什么我有这个问题。此外,我确信标签会导致问题(因为它们是int型),所以我如何重构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)