2017-04-08 193 views
0

我使用flow_from_directory从目录上传图片。
它是这样完成的:Keras和ImageGenerator输出黑色图像

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() 

enter image description here

好了,但我看过Udacity课程约tensorflow和理解通过减去均值和除以标准偏差来集中输入数据非常有用。
所以我修改

train_datagen = ImageDataGenerator(rescale=1./255) 

train_datagen = ImageDataGenerator(samplewise_center=True, 
            samplewise_std_normalization=True, 
            rescale=1./255) 

这里是输出:
enter image description here

出于某种原因,我装都是黑色的所有图像,他们numpy的阵列只是零。我的问题是:
为什么?

+0

有两个问题:1.图像的大小是多少? 2.如果是三通道图像,是否所有通道都相同(我强烈怀疑是这种情况)? –

+0

尺寸为64 * 160,图像灰度并有1个通道。 flow_from_directory中的Colormode也设置为“灰度”。 –

回答

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_centerfeaturewise_std_normalization设置为true来完成此操作。