在具有Functional API的Keras模型中,我需要使用ImageDataGenerator调用fit_generator来训练增强图像数据 . 问题是我的模型有两个输出:我想要预测的掩码和二进制值我显然只想增加输入和掩码输出而不是二进制值 . 我怎样才能做到这一点?
下面的例子可能是不言自明的! '虚拟'模型需要1个输入(图像),它输出2个值 . 该模型计算每个输出的MSE .
x = Convolution2D(8, 5, 5, subsample=(1, 1))(image_input) x = Activation('relu')(x) x = Flatten()(x) x = Dense(50, W_regularizer=l2(0.0001))(x) x = Activation('relu')(x) output1 = Dense(1, activation='linear', name='output1')(x) output2 = Dense(1, activation='linear', name='output2')(x) model = Model(input=image_input, output=[output1, output2]) model.compile(optimizer='adam', loss={'output1': 'mean_squared_error', 'output2': 'mean_squared_error'})
下面的功能生成批次以在训练期间为模型提供信息 . 它需要训练数据 x 和标签 y ,其中y = [y1,y2]
x
y
batch_generator(x, y, batch_size): ....transform images ....generate batch batch of size: batch_size yield(X_batch, {'output1': y1, 'output2': y2} ))
最后,我们调用fit_generator()
model.fit_generator(batch_generator(X_train, y_train, batch_size))
如果你已经分离了掩码和二进制值,你可以尝试这样的事情:
generator = ImageDataGenerator(rotation_range=5., width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True, vertical_flip=True) def generate_data_generator(generator, X, Y1, Y2): genX = generator.flow(X, seed=7) genY1 = generator.flow(Y1, seed=7) while True: Xi = genX.next() Yi1 = genY1.next() Yi2 = function(Y2) yield Xi, [Yi1, Yi2]
因此,对输入和掩码 with the same seed 使用相同的生成器来定义相同的操作 . 您可以根据需要更改二进制值(Y2) . 然后,调用fit_generator():
model.fit_generator(generate_data_generator(generator, X, Y1, Y2), epochs=epochs)
实现这一目标的最佳方法似乎是创建一个新的生成器类,扩展Keras提供的类,解析数据,仅增加图像并产生所有输出 .
3 回答
下面的例子可能是不言自明的! '虚拟'模型需要1个输入(图像),它输出2个值 . 该模型计算每个输出的MSE .
下面的功能生成批次以在训练期间为模型提供信息 . 它需要训练数据
x
和标签y
,其中y = [y1,y2]最后,我们调用fit_generator()
如果你已经分离了掩码和二进制值,你可以尝试这样的事情:
因此,对输入和掩码 with the same seed 使用相同的生成器来定义相同的操作 . 您可以根据需要更改二进制值(Y2) . 然后,调用fit_generator():
实现这一目标的最佳方法似乎是创建一个新的生成器类,扩展Keras提供的类,解析数据,仅增加图像并产生所有输出 .