我能够训练U-net带有二进制分类的标记图像。
但我很难弄清楚如何在Keras / Theano中为多级分类(4个类)配置最终图层。
我有634张图片和相应的634张unit8
和64 x 64像素的面具。
我的面具不是黑色(0)和白色(1),而是在3个类别加背景中标记颜色的对象如下:
在训练运行之前,包含掩码的数组是单热编码的,如下所示:
mask_train = to_categorical(mask_train, 4)
这使mask_train.shape
从(634, 1, 64, 64)
转到(2596864, 4)
。
我的模型紧跟Unet架构,但最终层似乎有问题,因为我无法展平结构以匹配单热编码阵列。
[...]
up3 = concatenate([UpSampling2D(size=(2, 2))(conv7), conv2], axis=1)
conv8 = Conv2D(128, (3, 3), activation='relu', padding='same')(up3)
conv8 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv8)
up4 = concatenate([UpSampling2D(size=(2, 2))(conv8), conv1], axis=1)
conv9 = Conv2D(64, (3, 3), activation='relu', padding='same')(up4)
conv10 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv9)
# here I used number classes = number of filters and softmax although
# not sure if a dense layer should be here instead
conv11 = Conv2D(4, (1, 1), activation='softmax')(conv10)
model = Model(inputs=[inputs], outputs=[conv11])
# here categorical cross entropy is being used but may not be correct
model.compile(optimizer='sgd', loss='categorical_crossentropy',
metrics=['accuracy'])
return model
您对如何修改模型的最后部分有什么建议吗?我得到了各种形状不匹配的错误,而且我设法让它运行的次数,损失并没有在整个时代发生变化。
答案 0 :(得分:6)
如果您使用的是channel_first,则应将目标设为(634,4,64,64)
或(634,64,64,4)
if channels_last。
目标的每个频道都应该是一个类。每个通道都是0和1的图像,其中1表示像素是该类,0表示像素不是该类。
然后,您的目标是634组,每组包含四个图像,每个图像具有64x64像素,其中像素1表示存在所需特征。
我不确定结果是否会正确排序,但您可以尝试:
mask_train = to_categorical(mask_train, 4)
mask_train = mask_train.reshape((634,64,64,4))
#I chose channels last here because to_categorical is outputing your classes last: (2596864,4)
#moving the channel:
mask_train = np.moveaxis(mask_train,-1,1)
如果订购无法正常运作,您可以手动执行:
newMask = np.zeros((634,4,64,64))
for samp in range(len(mask_train)):
im = mask_train[samp,0]
for x in range(len(im)):
row = im[x]
for y in range(len(row)):
y_val = row[y]
newMask[samp,y_val,x,y] = 1
答案 1 :(得分:0)
迟到了,但您应该尝试
mask_train = to_categorical(mask_train, num_classes=None)
这将为(634, 4, 64, 64)
生成mask_train.shape
,并为每个单独的类生成一个二进制掩码(一次热编码)。
最后一次转换层,激活和丢失对于多类别细分而言看起来不错。