Tensorflow 如何确保训练神经网络时不涉及部分输入?

Tensorflow 如何确保训练神经网络时不涉及部分输入?,tensorflow,keras,neural-network,tf.keras,Tensorflow,Keras,Neural Network,Tf.keras,我正在使用tensorflow后端的keras中的人工神经网络执行回归学习 我的输入形状是[100,3]([样本数,特征数])。 我的输出形状是[100,3]([样本数量,输出数量]) 我想在每个输入样本旁边传递一个4维数据(该数据的形状将为[100,4]),以便我可以访问它来编写自定义损失函数。我不想让它参与培训过程 大概是这样的: def wrapper(input_tensor): def custom_loss(y_true, y_pred): return bi

我正在使用tensorflow后端的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将四维数据作为网络的额外输入。 -问题是,我无法将四维数据传递给自定义损失函数,而不将其包含在训练过程中

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


我想,即使是这个问题——也符合我的需要。但是,没有回答:(

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

感谢您的回复。我会尝试一下。您能指定如何将输入_2传递给自定义损失函数吗?损失函数中的
y_pred
值将是一个数组,其中包含
output
input_2
感谢您的回复。但是,我发现有多种方法可以将其传递给自定义损失函数如果我们想使用模型进行推理-我们应该在输入_2和输入_3之间使用lambda虚拟层。总之,我对你的答案很满意。