输出层正则化实现

时间:2019-09-05 06:09:18

标签: keras neural-network deep-learning constraints regularized

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

edit:关于我要执行的操作以及原因的详细说明。 我正在建立的理论模型是这样的: Theoretical Model 我正在将第一个网络的输出馈入第二个网络的输入,以及加性高斯噪声。 我希望施加的约束是第一个NN(g)的输出。为什么?在没有限制的情况下,网络尽可能将输入映射到输出,以使附加噪声尽可能小。没错,这个 是最佳的编码函数g,但这不是很有趣:)因此,我希望对第一个NN(g)的输出施加约束。更具体地说,约束作用在函数的总功效上:integration {fX(x)* g(x)^ 2 dx}。但这可以或多或少地简化为类似于我先前描述的函数-g(3)+ g(4)<10。更具体地说,对于某些采样输入i,该函数为sum {fX(x)* g(i)^ 2 * dx)

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(尽管显然没有区别)。 要注意的重要事项是输入暗淡1,输出暗淡1(图中的x和y)以及中间的高斯噪声。这些隐藏的层现在不是很有趣,我将在稍后对其进行优化。 在此模型中,我希望对名为编码器输出的(据说)隐藏层的输出施加约束。希望这可以澄清一些事情。

1 个答案:

答案 0 :(得分: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文档中有一个简单的自定义正则化示例。