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

Posted

技术标签:

【中文标题】如何确保部分输入不参与训练神经网络?【英文标题】: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 也符合我的需要。但是,没有回答:(

【问题讨论】:

【参考方案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 虚拟层。总而言之,我对您的回答感到满意。

以上是关于如何确保部分输入不参与训练神经网络?的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow学习教程------过拟合

模型不收敛的原因

训练部分网络

自编码器

神经网络为啥需要训练多轮运动

用TensorFlow搭建网络训练验证并测试