Keras ImageDataGenerator 未按预期工作
Keras ImageDataGenerator not working as expected
我正在尝试根据文档中的 [this example][1]
使用 Keras 构建一个自动编码器。因为我的数据很大,所以我想用一个生成器来避免加载到内存中。
我的模型看起来像:
model = Sequential()
model.add(Convolution2D(16, 3, 3, activation='relu', border_mode='same', input_shape=(3, 256, 256)))
model.add(MaxPooling2D((2, 2), border_mode='same'))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(MaxPooling2D((2, 2), border_mode='same'))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(MaxPooling2D((2, 2), border_mode='same'))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(UpSampling2D((2, 2)))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(UpSampling2D((2, 2)))
model.add(Convolution2D(16, 3, 3, activation='relu'))
model.add(UpSampling2D((2, 2)))
model.add(Convolution2D(1, 3, 3, activation='sigmoid', border_mode='same'))
model.compile(optimizer='adadelta', loss='binary_crossentropy')
我的发电机:
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory('IMAGE DIRECTORY', color_mode='rgb', class_mode='binary', batch_size=32, target_size=(256, 256))
然后拟合模型:
model.fit_generator(
train_generator,
samples_per_epoch=1,
nb_epoch=1,
verbose=1,
)
我收到这个错误:
异常:检查模型目标时出错:预期 convolution2d_76 有 4 个维度,但得到形状为 (32, 1)
的数组
这看起来像是我的批次大小而不是样本大小。我做错了什么?
错误很可能是由于 class_mode='binary'
。它使生成器生成二进制 类,因此输出的形状为 (batch_size, 1)
,而您的模型生成四维输出(因为最后一层是卷积)。
我猜你希望你的标签是图像本身。根据flow_from_directory
的来源和它使用的DirectoryIterator
,仅仅改变class_mode
是不可能的。一个可能的解决方案是:
train_generator_ = train_datagen.flow_from_directory('IMAGE DIRECTORY', color_mode='rgb', class_mode=None, batch_size=32, target_size=(256, 256))
def train_generator():
for x in train_iterator_:
yield x, x
请注意,我将 class_mode
设置为 None
。它使生成器 return 只是 image
而不是 tuple(image, label)
。然后我定义了一个新的生成器,return 将图像作为输入和标签。
我正在尝试根据文档中的 [this example][1]
使用 Keras 构建一个自动编码器。因为我的数据很大,所以我想用一个生成器来避免加载到内存中。
我的模型看起来像:
model = Sequential()
model.add(Convolution2D(16, 3, 3, activation='relu', border_mode='same', input_shape=(3, 256, 256)))
model.add(MaxPooling2D((2, 2), border_mode='same'))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(MaxPooling2D((2, 2), border_mode='same'))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(MaxPooling2D((2, 2), border_mode='same'))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(UpSampling2D((2, 2)))
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same'))
model.add(UpSampling2D((2, 2)))
model.add(Convolution2D(16, 3, 3, activation='relu'))
model.add(UpSampling2D((2, 2)))
model.add(Convolution2D(1, 3, 3, activation='sigmoid', border_mode='same'))
model.compile(optimizer='adadelta', loss='binary_crossentropy')
我的发电机:
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory('IMAGE DIRECTORY', color_mode='rgb', class_mode='binary', batch_size=32, target_size=(256, 256))
然后拟合模型:
model.fit_generator(
train_generator,
samples_per_epoch=1,
nb_epoch=1,
verbose=1,
)
我收到这个错误:
异常:检查模型目标时出错:预期 convolution2d_76 有 4 个维度,但得到形状为 (32, 1)
的数组这看起来像是我的批次大小而不是样本大小。我做错了什么?
错误很可能是由于 class_mode='binary'
。它使生成器生成二进制 类,因此输出的形状为 (batch_size, 1)
,而您的模型生成四维输出(因为最后一层是卷积)。
我猜你希望你的标签是图像本身。根据flow_from_directory
的来源和它使用的DirectoryIterator
,仅仅改变class_mode
是不可能的。一个可能的解决方案是:
train_generator_ = train_datagen.flow_from_directory('IMAGE DIRECTORY', color_mode='rgb', class_mode=None, batch_size=32, target_size=(256, 256))
def train_generator():
for x in train_iterator_:
yield x, x
请注意,我将 class_mode
设置为 None
。它使生成器 return 只是 image
而不是 tuple(image, label)
。然后我定义了一个新的生成器,return 将图像作为输入和标签。