我注意到Keras作为输出和我自己测试时的准确度下降了大约10%。所以我转载了这个,请看下面的小代码片段。我以两种方式生成输入。输入由Keras ImageGenerator生成(无增强),input2在没有ImageGenerator的情况下生成。
import numpy as np
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator
import os
import pdb
def preprocess(img):
img = image.array_to_img(img)
width, height = img.size
# Crop 48x48px
desired_width, desired_height = 48, 48
if width < 48:
desired_width = width
start_x = np.maximum(0, int((width-desired_width)/2))
img = img.crop((start_x, np.maximum(0, height-desired_height), start_x+desired_width, height))
img = img.resize((48, 48))
img = image.img_to_array(img)
return img / 255.
datagen = ImageDataGenerator(
featurewise_center=False,
featurewise_std_normalization=False,
preprocessing_function=preprocess)
generator = datagen.flow_from_directory(
'numbers_train',
target_size=(48,48),
batch_size=1024, # Only 405 images in directory, so batch always the same
classes=['02'],
shuffle=False,
class_mode='sparse')
inputs, targets = next(generator)
folder = 'numbers_train/02'
files = os.listdir(folder)
files = list(map(lambda x: os.path.join(folder, x), files))
images = []
for f in files:
img = image.load_img(f)
images.append(preprocess(img))
inputs2 = np.asarray(images)
print(np.mean(inputs))
print(np.mean(inputs2))
这给出了两个不同的值,我希望输入和输入2是相同的。
0.403158
0.41354
这导致精度差异约为10%。这里发生了什么?
编辑:这似乎与图像的大小调整有关。在预处理中删除img.resize并在预处理之前在for循环中添加此行,并且平均值相同。但我想要的是调整后的调整大小。
Edit2:所以ImageDataGenerator首先调整大小为(48,48),然后调用预处理函数。我反过来想要它。有人知道这样做的技巧吗?