Keras 输出层正则化实现

Keras 输出层正则化实现,keras,neural-network,deep-learning,constraints,regularized,Keras,Neural Network,Deep Learning,Constraints,Regularized,我正在使用keras构建一个NN模型,我希望对它施加一个约束,它不(直接)与权重有关。非常感谢您的帮助/为我指出一些相关的关键字以供查找。我希望施加的约束有点复杂,但可以通过以下方式简化:我希望对网络的某些输入的输出施加约束。为了简单起见,假设约束看起来像NN(3)+NN(4)

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

编辑:更详细地解释我想做什么以及为什么。 我建立的理论模型是: 我将第一个网络的输出和加性高斯噪声一起输入第二个网络的输入。
我希望对第一个NN(g)的输出施加约束。为什么?在没有约束的情况下,网络将输入映射到尽可能高的输出,以使附加噪声尽可能不重要。正确地说,这是最佳编码函数g,但它不是很有趣:),所以我希望对第一个NN(g)的输出施加一个约束。更具体地说,约束条件是函数的总幂:积分{fX(x)*g(x)^2 dx}。但这或多或少可以简化为一个类似于我前面描述的函数-g(3)+g(4)您可以使用具有共享权重层的多输入/多输出模型。例如,模型可以如下所示:

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

嗨,eric,谢谢你的帮助!我编辑了我原来的帖子,对我想做的事情做了更详细的解释。你的答案是一个有趣的方法,我还不确定我是否能将它与我的需要结合起来,但它并不像我想象的那么直接。在阅读我的详细解释后,如果你认为它可以用于我的问题,请告诉我。谢谢如果我理解正确,您的约束取决于g()的输入和输出?如果是这种情况,可以在如下顺序模型中使用连接层:
reg\u layer=concatenate([input\u layer,g\u output],activity\u regularizer=my\u regularizer)
。然后实现一个类似于的正则化器,其中x[0]是网络输入,x[1]是g的输出。然后,您可以在正则化器中实现约束,而不再在网络中使用此concat层。要处理dg和dx,您可能还可以使用
Add()([x,K.constant(epsilon)])
层,并在定义epsilon后在其上执行
g()
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)