是否可以根据输入变量屏蔽神经网络输出变量

Posted

技术标签:

【中文标题】是否可以根据输入变量屏蔽神经网络输出变量【英文标题】:Is it possible to mask Neural Network output variables depending on input variables 【发布时间】:2022-01-08 18:06:46 【问题描述】:

我有一个奇怪的神经网络用例,想了解是否有办法完成我正在尝试做的事情。

我正在尝试训练一个接收 3 个输入变量并输出 96 个连续变量的神经网络。理想情况下,输出应该产生一条连续曲线,但是预期的 y 值有很多随机分布的缺失数据点 (>50%),这会影响模型的训练方式。我知道丢失了哪些数据点,并试图找到一种在反向传播期间忽略这些输出的方法。

例如:

Input = [1,2,3]
Expected Output = [1,2,3,NAN,5,6,7,NAN,...] # NAN is set to 0 for training

目前这是我正在尝试的方法(tensorflow.keras)

in1 = layers.Input(3)
in2 = layers.Input(96) # Array of Bools, =1 if expected output variable is a number, =0 if nan
hidden1 = layers.Dense(37,activation='relu',use_bias=True)(in1)
hidden2 = layers.Dense(37,activation='relu',use_bias=True)(hidden1)
hidden3 = layers.Dense(37,activation='relu',use_bias=True)(hidden2)
hidden3_in2 = layers.concatenate([hidden3,in2])
out = layers.Dense(96)(hidden3_in2)

model = Model(inputs=[in1,in2], outputs=[out])

在 in2 == 0 的地方计算出的预期输出应该是 0,而在其他任何地方都应该是一个大于 0 的数字。当使用模型预测数据时,我将一个 1 的数组插入到 in2 中,表示没有期望值等于 0,因此应该输出一条连续曲线。但是,许多输出变量仍然为 0,这并不理想。

基本上我的问题是:有没有一种在反向传播和/或使用数组计算损失期间屏蔽特定输出的好方法?

提前致谢!

【问题讨论】:

【参考方案1】:

您所要做的就是编写您的自定义损失函数,在其中您从字面上屏蔽损失值。

类似的东西

def my_loss_fn(y_true, y_pred):
    squared_difference = tf.square(y_true - y_pred)
    mask = 1.0 - tf.math.is_nan(y_true)
    return tf.reduce_mean(squared_difference * mask, axis=-1)  # Note the `axis=-1`

model.compile(optimizer='adam', loss=my_loss_fn)

【讨论】:

以上是关于是否可以根据输入变量屏蔽神经网络输出变量的主要内容,如果未能解决你的问题,请参考以下文章

可以在控制台输出中使用Terraform屏蔽变量吗?

BP神经网络

分类神经网络的变量输入

是否可以根据 Keras 中的输入实现层之间的切换?

线性神经网络及其应用神经网络三

线性神经网络及其应用神经网络三