1. 程式人生 > >pytorch隨記(隨時更新)

pytorch隨記(隨時更新)

1.①任何在原地(in-place)改變張量的操作都需要加一個’_’字尾。例如x.copy_(y), x.t_()操作將改變x

②神經網路的典型訓練過程如下:  

(一)
1. 定義神經網路模型,它有一些可學習的引數(或者權重); 
2. 在資料集上迭代; 
3. 通過神經網路處理輸入; 
4. 計算損失(輸出結果和正確值的差距大小) 
5. 將梯度反向傳播會網路的引數; 
6. 更新網路的引數,主要使用如下簡單的更新原則: 
weight = weight - learning_rate * gradient 

(二)

  1. 使用torchvision載入和歸一化CIFAR10訓練集和測試集.
  2. 定義一個卷積神經網路
  3. 定義損失函式
  4. 在訓練集上訓練網路
  5. 在測試機上測試網路

torch.nn中必須對單個樣本做x.unsqueeze(0)升維(由3->4):

  1. torch.nn 只支援小批量輸入,整個torch.nn包都只支援小批量樣本,而不支援單個樣本
  2. 例如,nn.Conv2d將接受一個4維的張量,每一維分別是sSamples * nChannels * Height * Width(樣本數*通道數*高*寬).
  3. 如果你有單個樣本,只需使用input.unsqueeze(0)
    來新增其它的維數(HWC->NHWC)

 ④torchvision的輸出是[0,1]的PILImage影象,我們把它轉換為歸一化範圍為[-1, 1]的張量:

transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

def imshow(img):

img = img / 2 + 0.5 # unnormalize

npimg = img.numpy()

plt.imshow(np.transpose(npimg, (1, 2, 0)))

plt.show()

⑥彩圖是3通道RGB,但是在opencv裡的順序預設是反的(BGR)