我正在对Keras / TensorFlow U-Net进行语义分段故障排除。我不断遇到的一件事是这样的声明....
"现在问题是在你的情况下使用softmax,因为Keras没有 支持每个像素上的softmax。"
这里陈述(以及许多其他地方):Cross Entropy Loss for Semantic Segmentation Keras
它们的典型解决方案是将行和列展开为1d,因此输出(4d)形状的张量(批次,行,列,n_classes)变为3d张量(批次,行*列,n_classes)并应用密集softmax到这一点。
但是这个虚拟的例子让我认为Conv2d层有1x1内核和' softmax'激活 DOES 执行每像素softmax。
我错了吗?
示例:
import numpy as np
np.random.seed(345)
from keras.layers import Input
from keras.models import Model
from keras.layers.convolutional import Conv2D
from keras.initializers import RandomUniform
模拟输入到每像素softmax分类器,在这种情况下为3x3字段,带有5个滤镜
np.random.seed(234)
dummy_input = np.random.random(45).astype('float32')
dummy_input = dummy_input.reshape((1,3,3,5))
构建具有相同随机权重的2个网络(一个线性,一个softmax)
conv_input = Input(shape=(3,3,5,), dtype='float32')
pred_layer_softmax = Conv2D(filters=2, kernel_size=(1,1), strides=(1,1), kernel_initializer=RandomUniform(minval=0., maxval=1.),
padding='valid', data_format='channels_last', activation='softmax')(conv_input)
pred_layer_linear = Conv2D(filters=2, kernel_size=(1,1), strides=(1,1),
padding='valid', data_format='channels_last', activation='linear')(conv_input)
模型
m_softmax = Model(conv_input, pred_layer_softmax)
m_linear = Model(conv_input, pred_layer_linear)
# keep weights the same for both networks
m_linear.set_weights(m_softmax.get_weights())
预测
pred = m_softmax.predict(dummy_input)
pred_lin = m_linear.predict(dummy_input)
两个网络是否做出相同的预测?是
print('\nsoftmax pred')
print(pred.argmax(axis=3))
print('\nlinear_pred')
print(pred_lin.argmax(axis=3))
softmax pred
[[[1 1 0]
[1 1 0]
[1 0 1]]]
linear_pred
[[[1 1 0]
[1 1 0]
[1 0 1]]]
对于softmax,每像素类概率的总和是否达到1.0?是。
print('\nsoftmax - sum class probs')
print(pred.sum(axis=3))
print('\nlinear - sum class probs')
print(pred_lin.sum(axis=3))
softmax - sum class probs
[[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]]
linear - sum class probs
[[[ 1.88952112 2.50639653 2.06084657]
[ 1.81122136 2.21819067 2.01038122]
[ 1.92753291 1.85993922 2.27295876]]]
我错过了什么?这看起来像每像素softmax工作正常,对吧?
是否有一些基本的东西我不理解?
提前致谢。