首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否应该在角角的测试图像上使用重标度?

是否应该在角角的测试图像上使用重标度?
EN

Data Science用户
提问于 2021-10-23 11:48:30
回答 1查看 1.1K关注 0票数 0

我对这个话题有点困惑。我已经为猫狗图像分类建立了一个CNN架构,大约6000张猫图像和6000张狗图像,我正在预测测试图像。我在我的层中使用了Rescaling()

代码语言:javascript
运行
复制
inputs = layers.Input(shape=(256, 256) + (3,))
x = layers.Rescaling(1.0/255)(inputs)

我的问题是,我们应该在测试图像上使用重新标度,然后为predict()提供数据吗?

说一张我在模型中输入的猫的图片。当我预测的测试图像没有重新标度,它给我100%的猫和狗的概率0%。但是当我重新标定图像时

代码语言:javascript
运行
复制
img_array = keras.preprocessing.image.img_to_array(img)
img_array = img_array/255 # Rescaling
img_array = tf.expand_dims(img_array, 0)  # Create batch axis

在给图像喂食之前,它给了我大约78%的猫和21%的狗。

假设我有一个狗的图像,没有重新标度就能得到0.03%的猫和99.97%的狗,再标得到78%的猫和21%的狗。

EN

回答 1

Data Science用户

回答已采纳

发布于 2021-10-28 08:48:39

根据原始Keras示例的说法:

代码语言:javascript
运行
复制
def make_model(input_shape, num_classes):
    inputs = keras.Input(shape=input_shape)
    # Image augmentation block
    x = data_augmentation(inputs)

    # Entry block
    x = layers.Rescaling(1.0 / 255)(x) ### first layer is a rescaling layer ###
    x = layers.Conv2D(32, 3, strides=2, padding="same")(x)
    x = layers.BatchNormalization()(x)
    x = layers.Activation("relu")(x)

    x = layers.Conv2D(64, 3, padding="same")(x)
    x = layers.BatchNormalization()(x)
    x = layers.Activation("relu")(x)

    previous_block_activation = x  # Set aside residual

    for size in [128, 256, 512, 728]:
        x = layers.Activation("relu")(x)
        x = layers.SeparableConv2D(size, 3, padding="same")(x)
        x = layers.BatchNormalization()(x)

        x = layers.Activation("relu")(x)
        x = layers.SeparableConv2D(size, 3, padding="same")(x)
        x = layers.BatchNormalization()(x)

        x = layers.MaxPooling2D(3, strides=2, padding="same")(x)

        # Project residual
        residual = layers.Conv2D(size, 1, strides=2, padding="same")(
            previous_block_activation
        )
        x = layers.add([x, residual])  # Add back residual
        previous_block_activation = x  # Set aside next residual

    x = layers.SeparableConv2D(1024, 3, padding="same")(x)
    x = layers.BatchNormalization()(x)
    x = layers.Activation("relu")(x)

    x = layers.GlobalAveragePooling2D()(x)
    if num_classes == 2:
        activation = "sigmoid"
        units = 1
    else:
        activation = "softmax"
        units = num_classes

    x = layers.Dropout(0.5)(x)
    outputs = layers.Dense(units, activation=activation)(x)
    return keras.Model(inputs, outputs)

该模型在第一层中包含了一个重标度层,并自行对每个输入(无论是在火车组还是在测试集中)进行重新标度。所以每件事都会被重新标度,和它应该做的一样。因此,model.predict()确实会重新调整输入的标度。

注意,从技术上讲,重标度并不是图像的重标度,而是作为一个规范化过程,以便将范围[0, 255]中的像素值转换为范围[0, 1.0]中的浮动值,这是神经网络更“自然”的输入。

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/103422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档