gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:32:03 25 4
gpt4 key购买 nike

假设,我有一个卷积层的 10x10x4 中间输出,我需要将其分成 100 个 1x1x4 卷,并对每个卷应用 softmax,以获得 100 个输出网络。有没有办法在不使用 Lambda 层的情况下完成此任务?在这种情况下,Lambda 层的问题是这个简单的分割任务在前向传递过程中需要 100 次通过 lambda 层,这使得网络性能对于我的实际使用来说非常慢。请建议一种更快的方法。

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

以下是我使用 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(速度快,但给出形状张量 (None, 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 层所做的事情

最佳答案

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

from keras.layers import Softmax

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

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

关于machine-learning - Keras:是否有任何解决方法可以在不使用 Lamda 层的情况下分割中间层的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53846161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com