比方说,一个人想要同时使用相同的数据集训练两个略有不同的网络。 一种方法是通过功能性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上是否有正确的方法。用于优化网络的总损失将为这两个损耗,在两个网络之间造成干扰。 有人可以告诉您这是对是错,以及是否有一种方法可以同时独立地训练网络?
答案 0 :(得分:1)
我认为您的方法没有任何问题。假设您有两个网络N1
和N2
,它们分别具有损耗函数L1
和L2
。使用组合损失函数L=L1+L2
时,L
的梯度为wrt。 w
中的参数N1
与L1
wrt的梯度相同。 w
当且仅当L2
不依赖w
时。同样的情况适用于w
中的任何参数N2
。
因此,当您使用组合损耗函数以基于梯度的方法(例如RMSprop)优化网络N1
和N2
时,应该获得与优化{ {1}}和N1
是独立的,因为您的两个网络具有不同的参数(即它们不共享权重)。