在神经元子集上应用 softmax
Apply softmax on a subset of neurons
我正在 Keras 中构建一个卷积网络,它将多个 类 分配给图像。鉴于图像具有 9
个兴趣点,可以用三种方式之一进行分类,我想添加 27
个具有 softmax 激活的输出神经元,它将计算每个连续三重神经元的概率。
可以吗?我知道我可以简单地添加一个大的 softmax 层,但这会导致所有输出神经元的概率分布对于我的应用来说太宽泛了。
在最简单的实现中,您可以重塑数据,您将得到与您描述的完全相同的结果:"probability for each consecutive triplet"。
你使用 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)
我正在 Keras 中构建一个卷积网络,它将多个 类 分配给图像。鉴于图像具有 9
个兴趣点,可以用三种方式之一进行分类,我想添加 27
个具有 softmax 激活的输出神经元,它将计算每个连续三重神经元的概率。
可以吗?我知道我可以简单地添加一个大的 softmax 层,但这会导致所有输出神经元的概率分布对于我的应用来说太宽泛了。
在最简单的实现中,您可以重塑数据,您将得到与您描述的完全相同的结果:"probability for each consecutive triplet"。
你使用 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)