限制Keras中图层的输出值

时间:2017-06-14 20:00:42

标签: keras keras-layer

我在下面的代码中定义了我的MLP。我想提取layer_2的值。

def gater(self):
    dim_inputs_data = Input(shape=(self.train_dim[1],))
    dim_svm_yhat = Input(shape=(3,))
    layer_1 = Dense(20,
                    activation='sigmoid')(dim_inputs_data)
    layer_2 = Dense(3, name='layer_op_2',
                    activation='sigmoid', use_bias=False)(layer_1)
    layer_3 = Dot(1)([layer_2, dim_svm_yhat])
    out_layer = Dense(1, activation='tanh')(layer_3)
    model = Model(input=[dim_inputs_data, dim_svm_yhat], output=out_layer)
    adam = optimizers.Adam(lr=0.01)
    model.compile(loss='mse', optimizer=adam, metrics=['accuracy'])
    return model

假设layer_2的输出低于矩阵形式

0.1 0.7 0.8
0.1 0.8 0.2
0.1 0.5 0.5
....

我想在下面提供给layer_3而不是上面的

0 0 1
0 1 0
0 1 0

基本上,我希望将第一个最大值转换为1,将其他值转换为0。 如何在keras中实现这一目标?。

2 个答案:

答案 0 :(得分:1)

谁来决定输出值的范围?

神经网络中任何层的输出范围取决于该层使用的激活函数。例如,如果您使用tanh作为激​​活函数,则输出值将限制为[-1,1](并且这些值是连续的,请检查如何从[-inf,+inf]映射这些值(输入为x轴)到[-1,+1](y轴上的输出)here,了解这一步非常重要)

您应该做的是添加一个自定义激活函数,该函数将您的值限制为阶跃函数,即[-inf,+ inf]的值为1或0,并将其应用于该层。

我怎么知道要使用哪个功能?

您需要创建满足所有需求(输入到输出映射)的y=some_function并将其转换为Python代码,就像这样:

from keras import backend as K

def binaryActivationFromTanh(x, threshold) :

    # convert [-inf,+inf] to [-1, 1]
    # you can skip this step if your threshold is actually within [-inf, +inf]

    activated_x = K.tanh(x)

    binary_activated_x = activated_x > threshold

    # cast the boolean array to float or int as necessary
    # you shall also cast it to Keras default
    # binary_activated_x = K.cast_to_floatx(binary_activated_x)

    return binary_activated_x

完成自定义激活功能后,您可以像使用

x = Input(shape=(1000,))
y = Dense(10, activation=binaryActivationFromTanh)(x)

现在测试这些值,看看是否获得了预期的值。您现在可以将其放入更大的神经网络中。

强烈 不鼓励添加新层以限制输出,除非它仅用于激活(如keras.layers.LeakyReLU)。

答案 1 :(得分:0)

在两者之间使用Numpy。以下是随机矩阵的示例:

  a = np.random.random((5, 5)) # simulate random value output of your layer
  result = (a == a.max(axis=1)[:,None]).astype(int)

另见此主题:Numpy: change max in each row to 1, all other numbers to 0

您可以输入result作为下一层的输入。

要包装Numpy计算,您可以使用Lambda图层。请参阅此处的示例:https://keras.io/layers/core/#lambda

编辑:

建议不起作用。我只是回答是为了保留相关评论。