keras 用了ImageDataGenerator(1.0/255)之后的predict和predict_generator预测结果不一致的问题

用keras写图像分类的代码的时候,我们一般使用imagedatagenerator:

ImageDataGenerator(1.0/255)

示例代码:

test_datagen = ImageDataGenerator(1.0/255)
test_data_dir = './data_v1'
IMAGE_SIZE=(128,128)
batch_size = 32
classes=[]
with open("labels.txt","r") as f:
    for line in f.readlines():
        classes.append(line.strip("\n").split("\t")[0])
        
validation_generator = test_datagen.flow_from_directory(
        test_data_dir,
        target_size=IMAGE_SIZE,
        batch_size=batch_size,
        color_mode="grayscale",
        classes=classes,
        shuffle=False,
        class_mode='categorical',
        seed=42)

但是训练完了之后,我们想predict一张图片,然后你会发现,如果不用imagedatagenerator,预测的结果就不一样:

解决方案

mg_path='data_v1/hippo05/2.jpg'
img = load_img(img_path,color_mode="grayscale",target_size=(img_width,img_height),interpolation='nearest')
img_arr=img_to_array(img).astype('float32')


# img_arr /= 255.
img_arr=np.expand_dims(img_arr,axis=0)  
# print(img_arr.shape)
# output=intermediate_layer_model.predict(img_arr)
# print(output)
# print(output.shape)
print(img_arr.shape)
res=test_datagen.flow(img_arr, batch_size=1)
out2=model.predict(img_arr)
print(out2)
idx=np.argmax(out2)
print(idx)

在处理好图片了之后,调用一下image_datagen就可以了,这个感觉是个trick,所以分享出来

from keras import applications from keras.preprocessing.image import ImageDataGenerator from keras import optimizers from keras.models import Sequential, Model from keras.layers import Dropout, Flatten, Dense img_width, img_height = 256, 256 batch_size = 16 epochs = 50 train_data_dir = 'C:/Users/Z-/Desktop/kaggle/train' validation_data_dir = 'C:/Users/Z-/Desktop/kaggle/test1' OUT_CATAGORIES = 1 nb_train_samples = 2000 nb_validation_samples = 100 base_model = applications.VGG16(weights='imagenet', include_top=False, input_shape=(img_width, img_height, 3)) base_model.summary() for layer in base_model.layers[:15]: layer.trainable = False top_model = Sequential() top_model.add(Flatten(input_shape=base_model.output_shape[1:])) top_model.add(Dense(256, activation='relu')) top_model.add(Dropout(0.5)) top_model.add(Dense(OUT_CATAGORIES, activation='sigmoid')) model = Model(inputs=base_model.input, outputs=top_model(base_model.output)) model.compile(loss='binary_crossentropy', optimizer=optimizers.SGD(learning_rate=0.0001, momentum=0.9), metrics=['accuracy']) train_datagen = ImageDataGenerator(rescale=1. / 255, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1. / 255) train_generator = train_datagen.flow_from_directory( train_data_dir, target_size=(img_height, img_width), batch_size=batch_size, class_mode='binary') validation_generator = test_datagen.flow_from_directory( validation_data_dir, target_size=(img_height, img_width), batch_size=batch_size, class_mode='binary', shuffle=False ) model.fit_generator( train_generator, steps_per_epoch=nb_train_samples / batch_size, epochs=epochs, validation_data=validation_generator, validation_steps=nb_validation_samples / batch_size, verbose=2, workers=12 ) score = model.evaluate_generator(validation_generator, nb_validation_samples / batch_size) scores = model.predict_generator(validation_generator, nb_validation_samples / batch_size)看看这段代码有什么错误
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值