Python 用keras同时训练两个网络

Python 用keras同时训练两个网络,python,tensorflow,keras,Python,Tensorflow,Keras,假设有人想用同一个数据集同时训练两个稍有不同的网络。 一种方法是通过函数API:。 以下是它如何在一个简单的体系结构上工作(只有两个具有相同输入/输出的多层密集网络): 但是,我不能绝对确定这是否正确,是否有办法在Keras上正确执行。用于优化网络的总损耗将是两个损耗的总和,这将在两个网络之间造成干扰。 有人能告诉我这是对的还是错的,以及是否有一种方法可以同时独立地训练网络?我看不出你的方法有任何错误。假设有两个网络分别具有损失函数L1和L2。当使用组合损耗函数时,L=L1+L2,Lwrt的梯度

假设有人想用同一个数据集同时训练两个稍有不同的网络。 一种方法是通过函数API:。 以下是它如何在一个简单的体系结构上工作(只有两个具有相同输入/输出的多层密集网络):

但是,我不能绝对确定这是否正确,是否有办法在Keras上正确执行。用于优化网络的总损耗将是两个损耗的总和,这将在两个网络之间造成干扰。
有人能告诉我这是对的还是错的,以及是否有一种方法可以同时独立地训练网络?我看不出你的方法有任何错误。假设有两个网络分别具有损失函数
L1
L2
。当使用组合损耗函数时,
L=L1+L2
L
wrt的梯度。
N1
中的参数
w
L1
wrt的梯度相同
w
当且仅当
L2
不依赖于
w
。这同样适用于
N2
中的任何参数
w

因此,当您使用基于梯度的方法(如RMSprop)使用组合损失函数优化网络
N1
N2
时,您应该得到与单独优化
N1
N2
相同的更新,因为您的两个网络具有不同的参数(即,它们不共享重量)

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))