【发布时间】:2021-01-14 06:42:55
【问题描述】:
我正在尝试创建一个具有两个回归输出、一个分数和一个置信度的卷积神经网络。我冻结了它们共有的层,希望增加置信度输出不会改变分数,但在我的实验中它有。对于只有分数的模型,我使用 Xception 并添加了一个简单的GlobalAveragePooling2D 和Dense(512) 层,然后输出一个数字。
base_model = Xception(input_shape=(224, 224, 3), weights='imagenet', include_top=False)
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(512, activation='relu')(x)
predictions = Dense(1, activation='sigmoid')(x)
model = Model(inputs=base_model.input, outputs=predictions)
for layer in base_model.layers:
layer.trainable = False
optimizer = Adam(learning_rate=learning_rate)
model.compile(loss='mae', optimizer=optimizer, metrics=['mse','mae'], run_eagerly=True)
model.summary() 的结尾是这样的:
当我拟合它时,模型会产生很好的结果。
但是当我尝试添加第二个输出时,第一个输出的结果变得更糟。新模型通过元组进行训练,其中第一个数字与第一个模型相同,第二个数字是置信度值。该模型与上述模型非常相似。
base_model = Xception(input_shape=(224, 224, 3), weights='imagenet', include_top=False)
x = base_model.output
x = GlobalAveragePooling2D()(x)
score_x = Dense(512, activation='relu')(x)
score_out = Dense(1, activation='sigmoid', name='score_model')(score_x)
confidence_x = Dense(512, activation='relu')(x)
confidence_out = Dense(1, name='confidence_model')(confidence_x)
model = Model(inputs=base_model.input, outputs=[score_out, confidence_out])
for layer in base_model.layers:
layer.trainable = False
losses = {'score_model': 'mae', 'confidence_model': 'mae'}
loss_weights = {'score_model': 1, 'confidence_model': 1}
model.compile(loss=losses, loss_weights=loss_weights, optimizer=optimizer, metrics=['mse','mae'], run_eagerly=True)
当我查看model.summary() 时,它的可训练参数是之前模型的两倍,这正是我所期望的。到目前为止,一切对我来说都是正确的。
但是当我训练这个模型时,分数的表现要差得多。我在想它会是一样的(在随机变化范围内)。在第一个 epoch 之后,第一个模型的损失约为 0.125。第二个模型的score_model_loss 约为 0.554。显然我并没有完全分离模型。我错过了什么?
【问题讨论】:
-
你的优化过程没有分离。优化两个目标比优化一个目标更难。
-
我能想到两件事.. 1) 仔细检查基本模型层是否确实冻结在
model和 2) 尝试设置loss_weights['confidence_model'] = 0.看看这是否会使事情变得更好(如果是这样,请尝试仅缓慢增加它) -
如果目标不是一起优化它们,只构建 2 个单独的模型是否有意义?
-
@AkshaySehgal 为了提高效率我想让一个模型同时产生两个输出。
-
缩小一点,我不知道您的具体应用,但我永远不会尝试将置信度/方差拟合为点估计(MSE、MAE、...)。相反,我会使用像 KL-divergence 这样的目标。联合拟合均值和方差。
标签: python tensorflow keras conv-neural-network