如何保证一部分输入不参与神经网络的训练?
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
,但没有将其用作任何层的参数。我直接将它传递给 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
__________________________________________________________________________________________________
我正在使用带有张量流后端的 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
,但没有将其用作任何层的参数。我直接将它传递给 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
__________________________________________________________________________________________________