我对这个话题有点困惑。我已经为猫狗图像分类建立了一个CNN架构,大约6000张猫图像和6000张狗图像,我正在预测测试图像。我在我的层中使用了Rescaling()
。
inputs = layers.Input(shape=(256, 256) + (3,))
x = layers.Rescaling(1.0/255)(inputs)
我的问题是,我们应该在测试图像上使用重新标度,然后为predict()
提供数据吗?
说一张我在模型中输入的猫的图片。当我预测的测试图像没有重新标度,它给我100%的猫和狗的概率0%。但是当我重新标定图像时
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%的狗。
发布于 2021-10-28 08:48:39
根据原始Keras示例的说法:
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]中的浮动值,这是神经网络更“自然”的输入。
https://datascience.stackexchange.com/questions/103422
复制相似问题