初次使用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))

 

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