keras - 用于语义分割的每像素,非标准化,softmax损失

时间:2018-02-06 20:24:25

标签: python tensorflow keras semantic-segmentation

我正在对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工作正常,对吧?

是否有一些基本的东西我不理解?

提前致谢。

0 个答案:

没有答案