Keras:是否有任何解决方法可在不使用Lamda层的情况下拆分中间层的输出?

时间:2018-12-19 07:05:40

标签: machine-learning keras keras-layer tensor softmax

说,我有一个卷积层的10x10x4中间输出,我需要将其拆分为100 1x1x4的体积,并在每一个上应用softmax,以从网络中获得100个输出。有没有不用Lambda层就可以完成此任务的方法?在这种情况下,Lambda层的问题在于,这种简单的拆分任务需要在正向传递过程中通过lambda层进行100次传递,这对于我的实际使用而言使网络性能非常慢。请提出一种更快的方法。

编辑:在提出问题之前,我已经尝试过Softmax + Reshape方法。使用这种方法,我将获得一个10x10x4矩阵,将其重塑为100x4张量,并使用Reshape作为输出。我真正需要的是一个具有100个不同输出的多输出网络。在我的应用程序中,不可能对10x10矩阵进行联合优化,但是通过在Lambda层上使用具有100种不同输出的网络,可以获得良好的效果。

以下是我使用Keras功能API的方法的代码段:

具有Lambda层(缓慢,可根据需要提供100个张量的形状(无,4个)):

# Assume conv_output is output from a convolutional layer with shape (None, 10, 10,4)
preds = []
for i in range(10):
    for j in range(10):
        y = Lambda(lambda x, i,j: x[:, i, j,:],  arguments={'i': i,'j':j})(conv_output)
        preds.append(Activation('softmax',name='predictions_' + str(i*10+j))(y))

model = Model(inputs=img, outputs=preds, name='model')
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(),
              metrics=['accuracy']

使用Softmax + Reshape(快速,但具有形状张量(无,100、4))

# Assume conv_output is output from a convolutional layer with shape (None, 10, 10,4)
y = Softmax(name='softmax', axis=-1)(conv_output)
preds = Reshape([100, 4])(y)
model = Model(inputs=img, outputs=preds, name='model')
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(),
              metrics=['accuracy']

我不认为在第二种情况下可以对100个输出中的每一个进行单独优化(可能有人可以将其视为学习联合分布,而我需要像第一种情况那样学习边际) 。请让我知道是否有任何方法可以更快地完成第一个代码片段中的Lambda层

1 个答案:

答案 0 :(得分:2)

您可以使用Softmax层并将axis参数设置为最后一个轴(即-1),以在该轴上应用softmax:

from keras.layers import Softmax

soft_out = Softmax(axis=-1)(conv_out)

请注意,默认情况下,axis参数设置为-1,因此您甚至不需要传递该参数。