我正在使用unet进行图像语义分割任务,如果我像这样为最后一层设置Softmax Activation
:
...
conv9 = Conv2D(n_classes, (3,3), padding = 'same')(conv9)
conv10 = (Activation('softmax'))(conv9)
model = Model(inputs, conv10)
return model
...
然后使用loss = tf.keras.losses.CategoricalCrossentropy(from_logits=False)
。即使只有一张训练图像,训练也不会收敛。
但是如果我不像这样设置最后一层的Softmax激活函数
:
...
conv9 = Conv2D(n_classes, (3,3), padding = 'same')(conv9)
model = Model(inputs, conv9)
return model
...
然后使用loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
,训练将会收敛于一张训练图片。
我的Groundtruth数据集是这样生成的:
X = []
Y = []
im = cv2.imread(impath)
X.append(im)
seg_labels = np.zeros((height, width, n_classes))
for spath in segpaths:
mask = cv2.imread(spath, 0)
seg_labels[:, :, c] += mask
Y.append(seg_labels.reshape(width*height, n_classes))
为什么?我的用法有问题吗?
这是我关于git的实验代码:https://github.com/honeytidy/unet 你可以checkout和运行(可以在CPU上运行)。你可以改变Activation层和CategoricalCrossentropy的from_logits参数,看看我说的是什么。
channels_first
还是channels_last
? - Daniel Möller