我目前正在尝试在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
'''
然后我定义此自定义损失:
'''
def my_custom_loss(model, x, y_true, layer_name):
# Get intermediate layer's output
get_layer_output = K.function([model.layers[0].input][model.get_layer(layer_name).output]) # Layer Output Function
y_pred = get_layer_output(x)[0]
# Calculate loss using y_true and y_pred...
return loss
'''
但是这将引发错误。因此,为了实现基于中间层的损耗计算,我创建了一个与我所解释的相同的子模型,其中所述层充当其最终层(输出层),然后对其进行常规训练:
'''
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
'''
但是现在我需要计算两个单独的损失,一个用于倒数第二层,另一个用于最后一层,然后将它们同时(在每批处理之后)应用于模型,因此子模型方法实际上不起作用不再。
答案 0 :(得分:0)
您可以使用Funcitonal API来执行此操作。在功能性API中,每个层都是变量,您可以在完成模型时简单地定义多个输出。
此处有更多信息:https://www.tensorflow.org/alpha/guide/keras/functional