2

我正在使用 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。更具体地说,对于一些采样输入 i,函数是 sum { fX(x) * g(i)^2 * dx } < max_power。这就是问题所在,现在这是我尝试实现它的方式:

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 个(尽管显然没有区别)。导入要注意的是输入dim 1,输出dim 1(图中的x和y),以及中间的高斯噪声。隐藏层现在不是很有趣,稍后我会对其进行优化。在这个模型中,我希望对名为encoder_output 的(假定的)隐藏层的输出施加约束。希望这可以澄清事情。

4

1 回答 1

2

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

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 文档中有一个自定义正则化器的简单示例。

于 2019-09-05T07:34:08.307 回答