如何确保部分输入不参与训练神经网络?
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
,但没有将其用作任何层的参数。我直接将它传递给Model
的outputs
参数。
这个模型的总结是:
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
值将是一个包含output
和input_2
的数组
感谢您的回复。但是,我发现有多种方法可以将其传递给自定义损失函数。如果我们想使用模型进行推理 - 我们应该在 input_2 和 input_3 之间使用 lambda 虚拟层。总而言之,我对您的回答感到满意。以上是关于如何确保部分输入不参与训练神经网络?的主要内容,如果未能解决你的问题,请参考以下文章