我在下面的代码中定义了我的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中实现这一目标?。
答案 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
建议不起作用。我只是回答是为了保留相关评论。