如何使用张量流数据集 (TDFS) 作为张量流模型的输入?

Posted

技术标签:

【中文标题】如何使用张量流数据集 (TDFS) 作为张量流模型的输入?【英文标题】:How can I use a tensorflow data set (TDFS) as an input for a tensorflow model? 【发布时间】:2021-10-07 08:47:10 【问题描述】:

我目前正在处理 ImageNet 数据集,您可能知道它非常大。

我已将其从 .tar 文件预处理为 tfrecord 文件。

我目前正在使用:

train, val = tfds.load(*)

所以我有两个 tfd: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)

我从here关注。

在我尝试拟合我的模型后,d = model.fit(train, validation_data=val,...) 第一层具有形状(无、224、224、3),我收到错误:ValueError: Input 0 of layer conv2d is incompatible with the layer: expected ndim=4, found ndim=3

这个问题(我相信)是因为模型一次只有一张图像(所以它没有 4d 形状。我无法将数据集保存在内存中以将其重组为(无、224、224、 3)就像我对 cifar-10 数据集所做的那样)。

我的问题是,现在图像的格式为 (224, 224, 3),我如何将它们与期望 4d 形状但我无法在内存中重塑数据集的 tensorflow 模型一起使用?

或者有没有办法调整 tfds 的形状,使其作为模型的输入?

我不确定我是否完全了解 tfds,这就是我遇到此问题的原因。此外,我确信标签会导致问题(因为它们是整数),那么如何将 tfds 标签重构为模型的热编码?

【问题讨论】:

批量处理你的数据:train = train.map(resize_with_crop).batch(32) 和 val 也是如此。 @Kaveh 非常感谢。另外,您对标签的一种热编码有什么建议吗? 你可以使用to_categorical from Tensorflow or OneHotEncoder from Scikit-Learn or get_dummies from Pandas,但是如果你使用@,你不需要one-hot编码987654333@ 作为损失函数。 【参考方案1】:

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)

【讨论】:

以上是关于如何使用张量流数据集 (TDFS) 作为张量流模型的输入?的主要内容,如果未能解决你的问题,请参考以下文章

张量流 LSTM 模型中的 NaN 损失

如何从带有向量列的 DataFrame 创建张量流数据集?

计算张量流损失时的几何平均值

张量流对象检测训练中的标签文件

保存和打开张量流数据集

杀死张量流实例后如何“重置”张量板数据