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