TensorFlow中的多输出层神经网络

时间:2019-05-12 09:11:16

标签: python tensorflow neural-network

我目前正在尝试在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

'''

但是现在我需要计算两个单独的损失,一个用于倒数第二层,另一个用于最后一层,然后将它们同时(在每批处理之后)应用于模型,因此子模型方法实际上不起作用不再。

1 个答案:

答案 0 :(得分:0)

您可以使用Funcitonal API来执行此操作。在功能性API中,每个层都是变量,您可以在完成模型时简单地定义多个输出。

此处有更多信息:https://www.tensorflow.org/alpha/guide/keras/functional