说,我有一个卷积层的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层
答案 0 :(得分:2)
您可以使用Softmax
层并将axis参数设置为最后一个轴(即-1
),以在该轴上应用softmax:
from keras.layers import Softmax
soft_out = Softmax(axis=-1)(conv_out)
请注意,默认情况下,axis
参数设置为-1
,因此您甚至不需要传递该参数。