用keras同时训练两个网络

时间:2018-07-08 10:04:39

标签: python tensorflow keras

比方说,一个人想要同时使用相同的数据集训练两个略有不同的网络。 一种方法是通过功能性API:https://keras.io/getting-started/functional-api-guide/。 这是在简单架构(仅两个具有相同输入/输出的多层密集网络)上的工作方式:

same_input = Input(shape=(n_feat, ), name='input')

x = Dense(n_feat//2, kernel_initializer='uniform', activation='relu')(same_input)
x = Dense(n_feat//128, kernel_initializer='uniform', activation='elu')(x)
x = Dropout(dropout_val)(x)
x = BatchNormalization()(x)
x = Dense(n_feat//256, kernel_initializer='uniform', activation='relu')(x)
x_out = Dense(out_dim, kernel_initializer='normal', name='output_x')(x)

y = Dense(n_feat//2, kernel_initializer='uniform', activation='relu')(same_input)
y = Dropout(dropout_val)(y)
y = Dense(n_feat//128, kernel_initializer='uniform', activation='elu')(y)
.... (some difference)
y = Dropout(dropout_val)(y)
y = BatchNormalization()(y)
y_out = Dense(out_dim, kernel_initializer='uniform', name='output_y')(y)


model = Model(inputs=same_input, 
             outputs=[x_out, y_out])

model.compile(optimizer='rmsprop',
              loss={'output_x': 'mean_squared_error',
                   'output_y': 'mean_absolute_error'},
              loss_weights={'output_x': 1,
                            'output_y': 1.})

model.fit({'input': X},
         {'output_x': Y, 'output_x': Y},
         epochs=fit_pars['num_ep'],
         batch_size=b_size,
         validation_split=valid_split,
         callbacks=callbacks,
         verbose=2)

network_predict = np.array(model.predict(X_test, batch_size=b_size))

但是,我不确定这是否正确,以及在Keras上是否有正确的方法。用于优化网络的总损失将为这两个损耗,在两个网络之间造成干扰。 有人可以告诉您这是对是错,以及是否有一种方法可以同时独立地训练网络?

1 个答案:

答案 0 :(得分:1)

我认为您的方法没有任何问题。假设您有两个网络N1N2,它们分别具有损耗函数L1L2。使用组合损失函数L=L1+L2时,L的梯度为wrt。 w中的参数N1L1 wrt的梯度相同。 w当且仅当L2不依赖w时。同样的情况适用于w中的任何参数N2

因此,当您使用组合损耗函数以基于梯度的方法(例如RMSprop)优化网络N1N2时,应该获得与优化{ {1}}和N1是独立的,因为您的两个网络具有不同的参数(即它们不共享权重)。