输出层正则化实现

output layer regularization implementation

我正在使用 keras 构建 NN 模型,我希望对其施加一个与权重无关(直接)的约束。非常感谢一些帮助/指出一些相关的关键字来查找。我想施加的约束有点复杂,但可以通过以下方式简化:我希望对网络的某些输入的输出施加约束。为了简单起见,假设约束看起来像 NN(3)+NN(4) < 10,其中 NN 是神经网络,可以看作是一个函数。我怎样才能施加这样的约束?非常感谢您在此问题上提供的任何帮助!

编辑:更详细地解释我正在尝试做什么以及为什么。 我正在构建的理论模型是这样的: 我将第一个网络的输出连同加性高斯噪声一起馈入第二个网络的输入。 我希望对第一个 NN (g) 的输出施加约束。为什么?在没有约束的情况下,网络将输入尽可能高地映射到输出,以使加性噪声尽可能微不足道。没错,这个 最优编码函数 g,但它不是很有趣 :) 所以我希望对第一个 NN (g) 的输出施加约束。更具体地说,约束是关于函数的总功率:integral{ fX(x) * g(x)^2 dx }。但这可以或多或少地简化为一个类似于我之前描述的函数 - g(3)+g(4)<10。更具体地说,函数是 sum { fX(x) * g(i)^2 * dx } < max_power,对于一些采样输入 i。 这就是问题所在,现在这是我尝试实现它的方式:

model = Sequential([
        Dense(300, input_dim=1, activation='relu'),
        Dense(300, activation='relu'),
        Dense(1, activation='linear', name=encoder_output),
        GaussianNoise(nvar, name='noise'),
        Dense(300, activation='relu', name=decoder_input),
        Dense(300, activation='relu'),
        Dense(1, activation='linear', name=decoder_output),
    ])

主要是,这应该是单个神经网络,而不是真正的 2(虽然没有明显区别)。 import 需要注意的是输入 dim 1,输出 dim 1(图中的 x 和 y),以及中间的高斯噪声。隐藏层现在不是很有趣,我稍后会优化它们。 在这个模型中,我希望对名为 encoder_output 的(假定的)隐藏层的输出施加约束。希望这能澄清事情。

您可以使用具有共享权重层的多 input/multi 输出模型。例如,该模型可能如下所示:

from keras.layers import Input, Dense, Add
from keras.models import Model

# Shared weights layers
hidden = Dense(10, activation='relu')
nn_output = Dense(1, activation='relu')

x1 = Input(shape=(1,))
h1 = hidden(x1)
y1 = nn_output(h1)

x2 = Input(shape=(1,))
h2 = hidden(x2)
y2 = nn_output(h2)

# Your constraint
# In case it should be more complicated, you can implement
# a custom keras layer
sum = Add()([y1, y2]) 

model = Model(inputs=[x1, x2], outputs=[y1, y2, sum])
model.compile(optimizer='sgd', loss='mse')

X_train_1 = [3,4]
X_train_2 = [4,3]
y_train_1 = [123,456] # your expected output
y_train_2 = [456,123] # your expected output
s = [10,10] # expected sums

model.fit([X_train_1, X_train_2], [y_train_1, y_train_2, s], epochs=10)

如果您没有可用作预期输出的约束的确切值,您可以将其从输出中删除并编写一个将在其上使用的简单自定义正则化器。 Keras 文档中有一个自定义正则化器的简单示例。