如何保证一部分输入不参与神经网络的训练?

How to make sure that a part of input is not involved in training the neural network?

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

我的输入形状是 [100,3]([样本数量,特征数量])。
我的输出形状是 [100,3]([样本数量,输出数量])。

我想在每个输入样本旁边传递一个 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 也符合我的需要。但是,没有人回答:(

这可以通过 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
__________________________________________________________________________________________________