图像分割的最后一层一般是卷积网络的输出
self.Conv = nn.Conv2d(64, num_classes, kernel_size=1, stride=1, padding=0)
num_classes就是输出的分类个数。
我们以4分类为例子,图像尺寸为2×2,标注类别分别是0,1,2,3
>>> label = torch.arange(4).reshape(2,2)
>>> label
# tensor([[0, 1],
# [2, 3]])
输入图像经过卷积网络,再经过softmax()函数后,输出层应该是4层2×2张量(矩阵),第一层的含义是:[0][0]这个像素大概率是类别1,其他像素大概率不是类别1,第二层的含义是:[1][0]这个像素大概率是类别2,其他像素大概率不是类别2。第三层和第四层类似。
那怎么比较输出层和标注层呢,输出层的shape=(4,2,2),标注层的shape=(2,2),
一种方法是把输出层shape转换成(2,2)(这里不做介绍),还有一种就是把标注层shape改为(4,2,2),用到的方法就是torch.nn.functional.one_hot(),函数的具体api可以去官网查询。用法如下:
>>> abel_C = torch.nn.functional.one_hot(label,4)
>>> label_C.shape
# torch.Size([2, 2, 4])
# 再用translate转换
>>> label_C= torch.transpose(torch.transpose(label_C,0,2),1,2)
>>> label_C.shape
# torch.Size([4, 2, 2])