【问题标题】:Resizing layer in Tensorflow crashes because of different picture shapes由于图片形状不同,在 Tensorflow 中调整图层大小会崩溃
【发布时间】:2021-07-02 05:54:12
【问题描述】:

我是 TensorFlow 新手。我有不同图像大小的图像分类问题。在documentation 中,我了解到在模型内部而不是在dataset.map() 函数中调整大小是多么有益。

我像这样批处理我的数据集:

ds_train = ds_train\
    .batch(BATCH_SIZE)\
    .prefetch(tf.data.experimental.AUTOTUNE)

我的模型很简单:

base_model = tf.keras.applications.ResNet50V2(
        include_top=True, weights=None, input_tensor=None, input_shape=(224,224,3),
        pooling=None, classes=NUM_CLASSES, classifier_activation='softmax')
seed = 42
model = tf.keras.Sequential([
    tf.keras.Input(shape=(None, None, 3)),
    tf.keras.layers.experimental.preprocessing.Resizing(224, 224),
    tf.keras.layers.experimental.preprocessing.Rescaling(1./255),
    tf.keras.layers.experimental.preprocessing.RandomFlip(mode='horizontal_and_vertical', seed=seed),
    base_model
])

这给了我错误: InvalidArgumentError: Cannot add tensor to the batch: number of elements does not match. Shapes are: [tensor]: [95,116,3], [batch]: [108,112,3]。如何将调整大小层与批处理一起使用?

【问题讨论】:

    标签: python tensorflow keras deep-learning tensorflow2.0


    【解决方案1】:

    错误是您不能批量处理不同大小的元素。不幸的是,没有办法解决这个问题。该文档指定模型内部的预处理在推理时很有用(即当您调用 model.predict() 时)。

    这样做的主要好处是它使您的模型可移植 [...] 当所有数据预处理都是模型的一部分时,其他人可以加载和使用您的模型,而无需了解每个预计特征将被编码和规范化。您的推理模型将能够处理原始图像或原始结构化数据,并且不需要模型的用户了解例如用于文本的标记化方案,用于分类特征的索引方案,图像像素值是归一化为 [-1, +1] 还是 [0, 1] 等。

    在训练期间,如果您想使用大于 1 的批量大小,如果图像大小不同,您需要自己进行预处理。你可以通过tf.data.Dataset.map() 做到这一点。

    【讨论】:

    • 好的,所以在模型中调整map() 的大小在这里有意义吗?我还发现了这个 GH 问题:github.com/tensorflow/tensorflow/issues/45053
    • 如果要传递一批图像,可以。调整大小层将处于休眠状态,直到您将其与不同大小的单张图片一起使用
    猜你喜欢
    • 1970-01-01
    • 2016-05-14
    • 2015-08-06
    • 2020-01-26
    • 2012-08-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2016-04-13
    相关资源
    最近更新 更多