我使用flow_from_directory从目录上传图片。
它是这样完成的:
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'Dataset/train',
target_size=(image_rows, image_cols),
batch_size=batch_size,
color_mode='grayscale',
class_mode='categorical',
classes=classes)
然后我就像这样检查加载的图像:
import matplotlib.pyplot as plt
p = train_generator.next()
plt.imshow(p[0][0][:,:,0], cmap='gray')
plt.show()
好的,但是我已经看过关于张量流的Udacity课程,并且明白通过减去平均值并除以标准差来对输入数据进行居中是非常有用的。
所以我修改了
train_datagen = ImageDataGenerator(rescale=1./255)
到
train_datagen = ImageDataGenerator(samplewise_center=True,
samplewise_std_normalization=True,
rescale=1./255)
出于某种原因,我加载的所有图像都是黑色的,它们的numpy数组仅为零。
我的问题是:
为什么?
答案 0 :(得分:1)
自设置color_mode = grayscale
后,您的图片尺寸将为64 x 160 x 1
(请参阅here)。当您进行样本中心化时,它将沿着通道轴执行(请参阅here)。平均矩阵将与图像相同,因为平均值是沿通道轴计算的。您可以在Python中按如下方式对此进行测试:
img = np.random.randint(0,10,(5,5,1))
print np.squeeze(np.mean(img, axis=2, keepdims=True)) # channels last
img -= np.mean(img, axis=2, keepdims=True)
print np.squeeze(img) # should be all zeros
在此之后,您进行采样方式平均减法,这只是将每个像素除以一个小数字(1e-7
),以避免被零除。这仍将img
中的所有元素保留为零。
可以采取哪些措施来解决此问题?
不要进行样本规范化,而是考虑在整个数据集上进行。您可以将featurewise_center
和featurewise_std_normalization
设置为true来执行此操作。
答案 1 :(得分:0)
我已经解决了删除 ImageDataGenerator 中的缩放功能的问题。
发件人:
train_datagen = ImageDataGenerator(rescale=1./255)
收件人:
train_datagen = ImageDataGenerator()