【问题标题】:How to make sure that a part of input is not involved in training the neural network?如何确保部分输入不参与训练神经网络?
【发布时间】:2020-05-11 12:31:58
【问题描述】:

我正在使用带有 tensorflow 后端的 keras 中的人工神经网络进行回归学习。

我的输入形状是 [100,3]([no of samples,no of features])。
我的输出形状是 [100,3] ([no of samples,no of outputs])。

我想在每个输入样本旁边传递一个 4 维数据(此数据的形状将是 [100,4]),以便我可以访问它来编写自定义损失函数。我不希望它参与培训过程。

类似这样的:

def wrapper(input_tensor):
    def custom_loss(y_true, y_pred):
        return binary_crossentropy(y_true, y_pred) + mean(last 4 elements of the input_tensor)
    return custom_loss

我对函数式 API 以及如何将 keras 与多个输入和多个输出一起使用来训练网络进行了大量研究。但是,由于我不希望它参与训练阶段并且仍然需要传递到自定义损失函数 - 我认为它不会达到我的目的。

我解决这个问题的直觉:
1. 将 4 维数据附加到输入,在训练网络时屏蔽这 4 个输入神经元,仅将输入层的一部分(不包括最后 4 个元素)传递到下一层。 - 问题是,我认为我们不能像这样掩盖神经元。
2. 使用功能 API 将 4 维数据作为网络的附加输入。 - 问题是,我无法将 4 维数据传递给自定义损失函数,而不涉及到训练过程。

谁能帮我解决这个问题? 如果需要任何额外信息,请告诉我。

我认为,即使是这个问题 - How to use part of inputs for training but rest for loss function in Keras 也符合我的需要。但是,没有回答:(

【问题讨论】:

    标签: tensorflow keras neural-network tf.keras


    【解决方案1】:

    这可以通过 Keras 的功能 API 轻松完成。例如:

    from tensorflow.keras import Model
    from tensorflow.keras.layers import *
    
    input_1 = Input((3,))
    input_2 = Input((4,))
    
    output = Dense(100)(input_1)
    output = Dense(100)(output)
    
    model = Model(inputs=[input_1, input_2], outputs=[output, input_2])
    model.summary()
    

    请注意,我定义了input_2,但没有将其用作任何层的参数。我直接将它传递给Modeloutputs参数。

    这个模型的总结是:

    Model: "model_1"
    __________________________________________________________________________________________________
    Layer (type)                    Output Shape         Param #     Connected to                     
    ==================================================================================================
    input_3 (InputLayer)            [(None, 3)]          0                                            
    __________________________________________________________________________________________________
    dense_1 (Dense)                 (None, 100)          400         input_3[0][0]                    
    __________________________________________________________________________________________________
    dense_2 (Dense)                 (None, 100)          10100       dense_1[0][0]                    
    __________________________________________________________________________________________________
    input_4 (InputLayer)            [(None, 4)]          0                                            
    ==================================================================================================
    Total params: 10,500
    Trainable params: 10,500
    Non-trainable params: 0
    __________________________________________________________________________________________________
    

    【讨论】:

    • 感谢您的回复。我会试试的。
    • 您能指定如何将 input_2 传递给自定义损失函数吗?
    • 损失函数中的y_pred值将是一个包含outputinput_2的数组
    • 感谢您的回复。但是,我发现有多种方法可以将其传递给自定义损失函数。如果我们想使用模型进行推理 - 我们应该在 input_2 和 input_3 之间使用 lambda 虚拟层。总而言之,我对您的回答感到满意。
    猜你喜欢
    • 2019-09-15
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2018-11-26
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多