from keras.models import Modelfrom keras.models import Inputfrom keras.layers import Densea = Input(shape=(3,))b = Dense(2, use_bias=False)(a)model = Model(inputs=a, outputs=b)
假设上述代码中Dense
层的权重为[[2, 3], [3, 1], [-1, 1]]
。如果我们将[[2, 1, 3]]
作为输入传递给model
,那么输出将是:
但我想对Dense
层的每一行应用Softmax函数,这样输出将是:
我该如何实现这一点?
回答:
实现你所需功能的一种方法是通过子类化Dense
层并重写其call
方法来定义一个自定义层:
from keras import backend as Kclass CustomDense(Dense): def __init__(self, units, **kwargs): super(CustomDense, self).__init__(units, **kwargs) def call(self, inputs): output = K.dot(inputs, K.softmax(self.kernel, axis=-1)) if self.use_bias: output = K.bias_add(output, self.bias, data_format='channels_last') if self.activation is not None: output = self.activation(output) return output
测试以确保它工作正常:
model = Sequential()model.add(CustomDense(2, use_bias=False, input_shape=(3,)))model.compile(loss='mse', optimizer='adam')import numpy as npw = np.array([[2,3], [3,1], [1,-1]])inp = np.array([[2,1,3]])model.layers[0].set_weights([w])print(model.predict(inp))# output[[4.0610714 1.9389288]]
使用numpy验证结果:
soft_w = np.exp(w) / np.sum(np.exp(w), axis=-1, keepdims=True)print(np.dot(inp, soft_w))[[4.06107115 1.93892885]]