使用 Keras 的 flow_from_directory 和 FCNN
using Keras' flow_from_directory with FCNN
我成功地用 Keras 训练了一个用于图像分割的结构神经网络。现在我正在尝试通过对我的图像应用一些数据增强来提高性能。为此,我使用 ImageDataGenerator
然后 flow_from_directory
只将批次加载到内存中(我试过没有,但出现内存错误)。代码示例是:
training_images = np.array(training_images)
training_masks = np.array(training_masks)[:, :, :, 0].reshape(len(training_masks), 400, 400, 1)
# generators for data augmentation -------
seed = 1
generator_x = ImageDataGenerator(
featurewise_center=True,
featurewise_std_normalization=True,
rotation_range=180,
horizontal_flip=True,
fill_mode='reflect')
generator_y = ImageDataGenerator(
featurewise_center=False,
featurewise_std_normalization=False,
rotation_range=180,
horizontal_flip=True,
fill_mode='reflect')
generator_x.fit(training_images, augment=True, seed=seed)
generator_y.fit(training_masks, augment=True, seed=seed)
image_generator = generator_x.flow_from_directory(
'data',
target_size=(400, 400),
class_mode=None,
seed=seed)
mask_generator = generator_y.flow_from_directory(
'masks',
target_size=(400, 400),
class_mode=None,
seed=seed)
train_generator = zip(image_generator, mask_generator)
model = unet(img_rows, img_cols)
model.fit_generator(train_generator, steps_per_epoch=int(len(training_images)/4), epochs=1)
然而,当我 运行 代码时,出现以下错误(我使用的是 Tensorflow 后端):
InvalidArgumentError (see above for traceback): Incompatible shapes: [14400000] vs. [4800000]
[[Node: loss/out_loss/mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](loss/out_loss/Reshape, loss/out_loss/Reshape_1)]]
在错误中它抱怨不兼容的形状 14400000 (400x400x9) 与 4800000 (400x400x3)。我在这里使用自定义损失函数(如果您查看错误,它会说明损失),即 Dice 系数,定义如下:
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2. * intersection + 1.) / (K.sum(y_true_f) + K.sum(y_pred_f) + 1.)
这里我使用 (400,400,3) 个图像和 1 class 个形状 (400,400,1) 的蒙版。我的 NN 的输入定义为 Input((img_rows, img_cols, 3))
,输出为 Conv2D(1, (1, 1), activation='sigmoid', name='out')(conv9)
(但在没有数据增强的情况下进行训练时效果很好)。
出现此错误是因为您正在以 RGB 颜色模式读取遮罩。
flow_from_directory
中的默认color_mode
是'rgb'
。因此,如果不指定 color_mode
,您的掩码将加载到 (batch_size, 400, 400, 3)
数组中。这就是错误消息中 y_true_f
比 y_pred_f
大 3 倍的原因。
要读取灰度蒙版,请使用 color_mode='grayscale'
:
mask_generator = generator_y.flow_from_directory(
'masks',
target_size=(400, 400),
class_mode=None,
color_mode='grayscale',
seed=seed)
我成功地用 Keras 训练了一个用于图像分割的结构神经网络。现在我正在尝试通过对我的图像应用一些数据增强来提高性能。为此,我使用 ImageDataGenerator
然后 flow_from_directory
只将批次加载到内存中(我试过没有,但出现内存错误)。代码示例是:
training_images = np.array(training_images)
training_masks = np.array(training_masks)[:, :, :, 0].reshape(len(training_masks), 400, 400, 1)
# generators for data augmentation -------
seed = 1
generator_x = ImageDataGenerator(
featurewise_center=True,
featurewise_std_normalization=True,
rotation_range=180,
horizontal_flip=True,
fill_mode='reflect')
generator_y = ImageDataGenerator(
featurewise_center=False,
featurewise_std_normalization=False,
rotation_range=180,
horizontal_flip=True,
fill_mode='reflect')
generator_x.fit(training_images, augment=True, seed=seed)
generator_y.fit(training_masks, augment=True, seed=seed)
image_generator = generator_x.flow_from_directory(
'data',
target_size=(400, 400),
class_mode=None,
seed=seed)
mask_generator = generator_y.flow_from_directory(
'masks',
target_size=(400, 400),
class_mode=None,
seed=seed)
train_generator = zip(image_generator, mask_generator)
model = unet(img_rows, img_cols)
model.fit_generator(train_generator, steps_per_epoch=int(len(training_images)/4), epochs=1)
然而,当我 运行 代码时,出现以下错误(我使用的是 Tensorflow 后端):
InvalidArgumentError (see above for traceback): Incompatible shapes: [14400000] vs. [4800000]
[[Node: loss/out_loss/mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](loss/out_loss/Reshape, loss/out_loss/Reshape_1)]]
在错误中它抱怨不兼容的形状 14400000 (400x400x9) 与 4800000 (400x400x3)。我在这里使用自定义损失函数(如果您查看错误,它会说明损失),即 Dice 系数,定义如下:
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2. * intersection + 1.) / (K.sum(y_true_f) + K.sum(y_pred_f) + 1.)
这里我使用 (400,400,3) 个图像和 1 class 个形状 (400,400,1) 的蒙版。我的 NN 的输入定义为 Input((img_rows, img_cols, 3))
,输出为 Conv2D(1, (1, 1), activation='sigmoid', name='out')(conv9)
(但在没有数据增强的情况下进行训练时效果很好)。
出现此错误是因为您正在以 RGB 颜色模式读取遮罩。
flow_from_directory
中的默认color_mode
是'rgb'
。因此,如果不指定 color_mode
,您的掩码将加载到 (batch_size, 400, 400, 3)
数组中。这就是错误消息中 y_true_f
比 y_pred_f
大 3 倍的原因。
要读取灰度蒙版,请使用 color_mode='grayscale'
:
mask_generator = generator_y.flow_from_directory(
'masks',
target_size=(400, 400),
class_mode=None,
color_mode='grayscale',
seed=seed)