如何使用keras ImageDataGenerator时应用正常化处于测试阶段的图像?

问题描述 投票:1回答:2

我试图使用训练的模型来预测一个新的形象。我的准确度为95%。但predict_classes总是返回的第一个标签[0]不管我输入。我想其中一个原因是我使用featurewise_center=Truesamplewise_center=TrueImageDataGenerator。我想我应该做我的输入图像同样的事情。但我不能找到什么做这些功能做的形象。

任何建议将受到赞赏。

ImageDataGenerator代码:

train_datagen = ImageDataGenerator(
samplewise_center=True,
rescale=1. / 255,
shear_range=30,
zoom_range=30,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2)

test_datagen = ImageDataGenerator(
samplewise_center=True,
rescale=1. / 255,
shear_range=30,
zoom_range=30,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True)

预测代码(I使用100 * 100 * 3图像来训练模型):

model = load_model('CNN_model.h5')
img = cv2.imread('train/defect/6.png')
img = cv2.resize(img,(100,100))
img = np.reshape(img,[1,100,100,3])
img = img/255.

classes = model.predict_classes(img)

print (classes)

更新11/14:

我改变我的代码来预测像下面的图像。但模式仍然预测同一类,即使我养活,我已经习惯了我的训练模式(并获得95%accuarcy)的图像。有什么我错过了吗?

model = load_model('CNN_model.h5')
img = cv2.imread('train/defect/6.png')
img = cv2.resize(img,(100,100))
img = np.reshape(img,[1,100,100,3])
img = np.array(img, dtype=np.float64) 
img = train_datagen.standardize(img)

classes = model.predict_classes(img)
print(classes)
python machine-learning keras image-preprocessing
2个回答
2
投票

您需要使用standardize()实例的ImageDataGenerator方法。从Keras documentation

规范

standardize(x)

适用正常化配置一批输入。

参数

  • X:输入批次到被归一化。

返回

输入,归一化。

因此,这将是这样的:

img = cv2.imread('train/defect/6.png')
img = cv2.resize(img,(100,100))
img = np.reshape(img,[1,100,100,3])
img = train_datagen.standardize(img)

classes = model.predict_classes(img)

请注意,它会应用缩放以及因此没有必要自己做(即除去img = img/255.)。

此外,请记住,因为你已经设置featurewise_ceneter=True你需要用它来训练前使用fit()发电机的方法:

train_datagen.fit(training_data)

# then use fit_generator method
model.fit_generator(train_datagen, ...)

0
投票

不是一个完整的答案,但一些信息:

从在keras文档中引用this link

# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

# this is the augmentation configuration we will use for testing:
# only rescaling
test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

我想你应该训练做这种方式。然后测试,我认为使用train_datagen.standardize是真实的。


0
投票

我认为这是你用来cv2导入您的图片,因为当你使用cv2.imread,渠道不是“R,G,B”,但“B,G,R”的问题。

例如,

import cv2
from tensorflow.keras.preprocessing import image

bgr = cv2.imread('r.jpg')
rgb = np.array(image.load_img('r.jpg'))
print(bgr[1,1,:],rgb[1,1,:])

结果:

[ 83 113   0] [  0 114  83]
© www.soinside.com 2019 - 2024. All rights reserved.