我已经使用(256, 256, 1)
灰度输入和(256, 256, 1)
二进制标签成功地训练了u-net进行细胞分割的特定任务。我在Keras(git rep。here)中使用了zhixuhao的unet实现。我现在想要做的是使用多个灰度层作为输入来训练相同的模型。
[为了使事情变得简单,我们假设要使用2个灰度图像im1
和im2
,每个图像的大小均为(256, 256, 1)
。标签Y
与im1
和im2
相同。我想为模型输入大小为(256, 256, 2)
的输入,其中第三个轴的第一个分量为im1
,第二个为im2
。
为此,我将火车数据生成器更改为:
def MultipleInputGenerator(train_path, sub_path_1, sub_path_2, image_folder='images', mask_folder='masks', batch_size, aug_dict, images_color_mode='grayscale', masks_color_mode='grayscale',
flag_multi_class=False, num_class=2, target_size=(256,256), seed=1):
# Keras generator
image_datagen = ImageDataGenerator(**aug_dict)
mask_datagen = ImageDataGenerator(**aug_dict)
# Multiple input data augmentation
image_generator_1 = image_datagen.flow_from_directory(
sub_path_1,
classes = [image_folder],
class_mode = None,
color_mode = images_color_mode,
target_size = target_size,
batch_size = batch_size,
seed = seed)
image_generator_2 = image_datagen.flow_from_directory(
sub_path_2,
classes = [image_folder],
class_mode = None,
color_mode = images_color_mode,
target_size = target_size,
batch_size = batch_size,
save_to_dir = save_to_dir,
save_prefix = image_save_prefix,
seed = seed)
mask_generator = mask_datagen.flow_from_directory(
train_path,
classes = [mask_folder],
class_mode = None,
color_mode = masks_color_mode,
target_size = target_size,
batch_size = batch_size,
save_to_dir = save_to_dir,
save_prefix = mask_save_prefix,
seed = seed)
train_generator = zip(image_generator_1, image_generator_2, mask_generator)
for (img1, img2, mask) in train_generator:
img1, mask1 = adjustData(img1, mask, flag_multi_class, num_class)
img2, mask2 = adjustData(img2, mask, flag_multi_class, num_class)
yield (np.stack((img1, img2), axis=0), mask1)
adjustData
是辅助函数,用于将数组从[0,255]标准化为[0,1]
如您所见,我试图将灰度阵列堆叠在单个输入中。创建unet模型时,我将输入大小从(256, 256, 1)
更改为(256, 256, 2)
:
train_gen = MultipleInputGenerator(train_folder, sub_path_1, sub_path_2, batch_size, aug_dict=data_gen_args)
model = unet(input_size=(256,256,2))
model.fit_generator(train_gen, steps_per_epoch=train_steps, epochs=epochs)
但是,当启动命令:python3 main.py
时,它开始正确加载数据,但随后却无法训练模型:
Found 224 images belonging to 1 classes.
Epoch 1/2
Found 224 images belonging to 1 classes.
Found 224 images belonging to 1 classes.
Traceback (most recent call last):
File "main.py", line 50, in <module>
model.fit_generator(train_gen, steps_per_epoch=train_steps, epochs=epochs)
File "*/virtenv/env1/lib/python3.6/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "*/virtenv/env1/lib/python3.6/site-packages/keras/engine/training.py", line 1732, in fit_generator
initial_epoch=initial_epoch)
File "*/virtenv/env1/lib/python3.6/site-packages/keras/engine/training_generator.py", line 220, in fit_generator
reset_metrics=False)
File "*/virtenv/env1/lib/python3.6/site-packages/keras/engine/training.py", line 1508, in train_on_batch
class_weight=class_weight)
File "*/virtenv/env1/lib/python3.6/site-packages/keras/engine/training.py", line 579, in _standardize_user_data
exception_prefix='input')
File "*/virtenv/env1/lib/python3.6/site-packages/keras/engine/training_utils.py", line 135, in standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (2, 32, 256, 256, 1)
以32为batch_size。
[除了RGB图像以外,是否有人已经设法通过多层输入来训练unet(或任何其他CNN?还是有人对我如何使事情正常工作有想法?
谢谢。
您的预期输入形状为(32, 256, 256, 2)
,而发电机的输出形状为(2, 32, 256, 256, 1)
。这是因为np.stack
比输入数组增加了一个维度。您可以通过在np.concatenate
[代码块的最后一行]中使用np.stack
而不是train_generator
来解决此问题,如下所示:
yield (np.concatenate((img1, img2), axis=-1), mask1)
希望它会有所帮助。