我目前正在尝试在TensorFlow中创建一个神经网络,它有两个输出层。具体来说,我希望网络的倒数第二层同时作为第一输出层,但同时将其输出传递到网络的下一层和最后一层(第二输出层)。我需要这样做,以应用两个不同的自定义损耗(每个输出层一个)。第一个将从倒数第二层开始将其错误反向传播到第一层,而第二个将执行相同的操作,这次从网络的最后一层开始反向传播一个不同的错误。有人知道如何实现这一目标吗?在
我所做的唯一的事情就是将损失函数应用到倒数第二层,并将错误反向传播回第一层。这是通过创建原始模型的完全相同的子模型来实现的,不同之处在于将原始模型的倒数第二层作为其最终层。这样一来,我基本上以正常的方式训练子模型,然后将训练后的权重复制回原始模型。在
这是唯一一种将损失函数应用于模型中间层的方法,因为在损失计算过程中访问中间层的输出是不可微的,因此会抛出一个错误。至少我就是这样想出来的。在
假设我创建了这个模型:
'''
def get_mlp_model(input_shape, num_classes):
# Initialize Model
model = tf.keras.models.Sequential() # Sequential NN
model.add(Dense(units = 1024, activation='relu', input_shape=input_shape, name='fc_1'))
model.add(Dense(units = 1024, activation='relu', name='fc_2'))
model.add(Dense(units = 1024, activation='relu', name='fc_3'))
model.add(Dense(units = 512, activation='relu', name='fc_4'))
model.add(Dense(units = 512, activation='relu', name='fc_5'))
model.add(Dense(units = 512, activation='relu', name='fc_6'))
model.add(Dense(units = num_classes, activation=None, name='fc_7'))
return model
'''
然后我定义这个自定义损失:
'''
^{pr2}$'''
但这会引发一个错误。因此,为了实现基于中间层的损耗计算,我创建了一个与我解释的完全相同的子模型,在该子模型中,该层作为其最后一层(输出层),然后对其进行正常训练:
'''
def my_custom_loss(model, x, y_true):
# Get output Layer Output Function
y_pred = model(x)
# Calculate loss using y_true and y_pred...
return loss
'''
但现在我需要计算两个独立的损失,一个是倒数第二层,另一个是最后一层,并同时将它们应用到模型中(每批处理后),这样子模型方法就不再有效了。在
您可以使用函数API来完成此操作。在函数式API中,每个层都是一个变量,您可以在完成模型时简单地定义多个输出。在
更多信息:https://www.tensorflow.org/alpha/guide/keras/functional
相关问题 更多 >
编程相关推荐