在一组神经元上应用softmax

时间:2017-12-05 04:04:58

标签: keras softmax

我在Keras建立一个卷积网,为图像分配多个类。鉴于该图像具有9个兴趣点,可以按照我想要添加27输出神经元的三种方式之一进行分类,其中softmax激活可以计算每个连续三个神经元的概率。

有可能吗?我知道我可以简单地添加一个大的softmax层,但这会导致所有输出神经元的概率分布,这对我的应用来说太宽泛了。

1 个答案:

答案 0 :(得分:2)

在最天真的实现中,您可以重塑您的数据,您将得到您所描述的内容:“每个连续三元组的概率”。

你输出27个类,形状像(batch_size,27)并重塑它:

model.add(Reshape((9,3)))
model.add(Activation('softmax'))

请注意重塑您的y_true数据。或者在模型中添加另一个重塑形状以恢复原始形式:

model.add(Reshape((27,))

在更详细的解决方案中,您可能会根据他们的位置(如果他们有一个大致静态的位置)分离9个点的兴趣并制作平行路径。例如,假设您的9个位置是均匀间隔的矩形,并且您希望对这些段使用相同的网络和类:

inputImage = Input((height,width,channels))

#supposing the width and height are multiples of 3, for easiness in this example
recHeight = height//3
recWidth = width//3

#create layers here without calling them
someConv1 = Conv2D(...)
someConv2 = Conv2D(...)
flatten = Flatten()
classificator = Dense(..., activation='softmax')

outputs = []
for i in range(3):
    for j in range(3):
        fromH = i*recHeight
        toH = fromH + recHeight
        fromW = j*recWidth
        toW = fromW + recWidth
        imagePart = Lambda(
                           lambda x: x[:,fromH:toH, fromW:toW,:], 
                           output_shape=(recHeight,recWidth,channels)
                          )(inputImage)

        #using the same net and classes for all segments
        #if this is not true, create new layers here instead of using the same
        output = someConv1(imagePart)
        output = someConv2(output)
        output = flatten(output)
        output = classificator(output)
        outputs.append(output)

outputs = Concatenate()(outputs)

model = Model(inputImage,outputs)