初次使用pytorch编写语义分割代码的一些问题

记录下在自己在使用pytorch编写unet时的一些问题

 

标签读取:

语义分割中的label是与image宽高相同的图像

1)对于label的transform中不能使用 ToTensor 变换方法;

      ToTensor是将输入数据进行归一化,会将label中各像素的整数标签变为小数

2)不能对image和label分别使用 RandomCrop 变换方法;

      RandomCrop会对image和label分别随机裁剪,导致image和label位置不对应,可以使用CenterCrop代替

3)pytorch输入必须为torch类型,对label需要进行类型转换

      对于PIL.Image可以使用np.array先变为nparray格式,然后用torch.from_numpy转为torch类型

 

训练设置:

loss函数

1)标签label为3维(batch,height,width),类型为long

     不需要变为one-hot向量,但对于(batch,1, height,width)的1通道label,需要用 label.squeeze(1).long() 进行维度和类型变换

2)预测结果predict为4维(batch,class_channelNum,heigth,width),类型为float

      一般从网络直接输出即可。

3)loss函数,例如CrossEntropyLoss有参数size_average=True,默认取1个batch上的平均loss(各个像素loss的均值),一般不用修改

acc计算

acc计算需要除以 batch*height*width 以获取像素级别的平均acc,可以从变换后的label的size属性获取,代码如下:

_, predicted = torch.max(output.data, 1)
correct = (predicted == labels).sum().float()
acc = correct / (labels.size(0)*labels.size(1)*labels.size(2))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章