小白學習之pytorch框架(4)-softmax回歸(torch.gather()、torch.argmax()、torch.nn.CrossEntropyLoss())


學習pytorch路程之動手學深度學習-3.4-3.7

置信度、置信區間參考:https://cloud.tencent.com/developer/news/452418 本人感覺還是挺好理解的

交叉熵參考博客:https://www.cnblogs.com/kyrieng/p/8694705.html   https://blog.csdn.net/tsyccnh/article/details/79163834  個人感覺還不錯,好理解

(這段瞅瞅就行了)torchvision包,服務於PyTorch深度學習框架的,用於構建計算機視覺模型,主要構成有:

  torchvision.datasets:加載數據的函數及常用的數據集接口  

  torchvision.mdoels:包含常用的模型結構(含預訓練模型),例如AlexNet、VGG、ResNet等

  torchvision.transforms:常用的圖片變換,例如裁剪、旋轉等

  torchvision.utils:其他一些有用的方法

一行里畫出多張圖像和對應標簽的函數

def show_fashion_mnist(images, labels):
    use_svg_display()
    # 這里的_表示我們忽略(不使用)的變量
    _, figs = plt.subplots(1, len(images), figsize=(12, 12))
  
  # subplots(row, cloumn, figsize=(12, 12)) row:子圖的行數,即有幾行;column:子圖的列數,即一行有幾個圖;
  # figsize:子圖的Height和Width 其他參數請參考博客https://www.cnblogs.com/zhouzhe-blog/p/9614761.html 感謝大佬   
  # fig, ax = subplots() fig:返回一個圖像fig(這是一個整幅圖像,含有子圖);ax:返回子圖列表(fig的子圖)

    for f, img, lbl in zip(figs, images, labels):
     # zip()把可迭代的對象中的元素打包成一個個的元組,返回這些元組的列表。若是可迭代對象的元素個數不一致,
     # 則返回列表的長度與最短的對象相同https://www.runoob.com/python/python-func-zip.html     
        f.imshow(img.view((28, 28)).numpy()) # imshow(x,cmap) x表示要顯示圖片的變量,cmap為顏色圖譜,默認為RGB(A)
        # imshow()其他參數可百度
     f.set_title(lbl) # 設置圖像標題
        f.axes.get_xaxis().set_visible(False) # 設置x軸不可見
        f.axes.get_yaxis().set_visible(False) # 設置y軸不可見
    plt.show()

  查看數據集前10個圖片及對應標簽

X, y = [], [] for i in range(10): X.append(mnist_train[i][0]) # 每個圖片對應的tensor(形狀如torch.size([1, 28, 28]))附加到列表X中 y.append(mnist_train[i][1])  # 每個圖像對應的labels的數字代表(即用0-9代替了標簽) show_fashion_mnist(X, get_fashion_mnist_labels(y)) 
# get_fashion_mnist_labels()通過數字獲取對應的標簽 show_fashion_mnist()顯示圖片和對應的label

softmax回歸實現

  torch.gather()函數的理解

  下面說說我對gather()函數的理解,gather(input,dim,index,out=None),對於gather函數我百度了一些解釋,參考了一些博客,如  https://www.jianshu.com/p/5d1f8cd5fe31  (對dim=0時的三維tensor解釋的可以)   https://blog.csdn.net/edogawachia/article/details/80515038

以上述第一個博客的tensor為例,

 

input = tensor([[[18.,   5.,   7.,   1.,   1.],      [ 3.,  26.,   9.,   7.,   9.],      [ 10.,  28.,  22.,  27., 0.]],      [[ 26.,  10.,  20.,  29.,  18.],      [ 5.,  24.,  26.,  21.,   3.],      [ 10.,  29.,  10.,   0.,  22.]]]) index = torch.LongTensor([[[0,1,2,0,2], [0,0,0,0,0], [1,1,1,1,1]], [[1,2,2,2,2], [0,0,0,0,0], [2,2,2,2,2]]]) 首先明確tensor的形狀是(2,3,5),即第一層中括號里有2個維度,第二層中括號里有3個維度,第三層中括號里有5個維度,所以(2,3,5dim = 1   即用index里值修改代替index對應位置的數值的下標中第2個下標值。例如index中下標為(0,0,0)的對應值0,用對應值0替換   下標中第2個值0得出(0,0,0),然后去input中取下標為(0,0,0)的值18放入輸出tensor下標(0,0,0)對應位置index中下標為(0,0,1)的對應   值1,用對應值1替換下標中第2個值得出(0,1,1),取出input中下標為(0,1,1)的值為26放入輸出tensor下標(0,0,1)對應位置index中下標為(1,0,1)   對應值2,用對應值2替換下標中第2個值得出(1,2,1),取出input中下標為(1,2,1)的值為29放入輸出tensor下標(1,0,1)對應位置。   依次類推,得出輸出tensor如下:   tensor([[[ 18., 26., 22., 1., 0.],         [ 18., 5., 7., 1., 1.],         [ 3., 26., 9., 7., 9.]],         [[ 5., 29., 10., 0., 22.],         [ 26., 10., 20., 29., 18.],         [ 10., 29., 10., 0., 22.]]]) dim = 2   同理dim=1,這次只不過是替換下標中第3個值。如index中下標為(0,0,4)的對應值2,替換后得(0,0,2),取input值為7 index2 = torch.LongTensor([[[0,1,1,0,1], [0,1,1,1,1], [1,1,1,1,1]], [[1,0,0,0,0], [0,0,0,0,0], [1,1,0,0,0]]]) dim = 0   同理dim=1,這次是替換下標中第1個值。如index2中下標為(0,0,1)的對應值1,替換后的(1,0,1),取input值為10

 torch.argmax()函數的理解

  我真是菜的一批,看了好久(一看就困),以博客 https://blog.csdn.net/weixin_42494287/article/details/92797061 的三維的例子為例,說一下個人的理解

a=torch.tensor([ [ [1, 5, 5, 2], [9, -6, 2, 8], [-3, 7, -9, 1] ], [ [-1, 7, -5, 2], [9, 6, 2, 8], [3, 7, 9, 1] ]]) # a的形狀為(2,3,4)比較時,若是第一塊和第二塊比,值一樣,則取第二塊的位置值;dim表示維度,要干掉的維度
b=torch.argmax(a,dim=0)   dim=0,干掉第一維,也就是剩下(3,4),即紅色中括號里對應位置數字相比,第一個紅色中括號對應位置數字大,則取0,否則取1。   值相同取第二個紅色中括號對應值1(對應上面的黑色粗體字)。(為什么取0/1?)   結果:   tensor([[0, 1, 0, 1],       [1, 1, 1, 1],       [1, 1, 1, 1]]) c=torch.argmax(a,dim=1)   dim=1,干掉第二維,也就是剩下(2,4),即藍色和熒光綠色中括號里對應位置數字相對,藍色剩一行,熒光綠色剩一行。以藍色為例,第一個藍色中括號   數值大則取0,第二個藍色中括號數值大則取1,第三個藍色中括號數值大則取2。(為什么取0/1/2?)   結果:   tensor([[1, 2, 0, 1],       [1, 2, 2, 1]]) d=torch.argmax(a,dim=2)   dim=2,干掉第三維,也就是剩下(2,3),即紅色中括號為2,藍色和熒光綠色為3,也就是藍色和熒光綠色中括號里剩一個值並轉置(或者說取了值后放   在一個列表里)。例如:第一個藍色中括號:有2個5,取第二個5,取值2;第二個藍色中括號:9最大,取值0;第三個藍色中括號:7最大,取值1。組成列表為[2,0,1]   結果:   tensor([[2, 0, 1],       [1, 0, 2]]) 二維也一樣,去掉某一維即可

   看明白了argmax函數后,torch.sum(input,dim,output)也就懂了,不過sum是把要干掉的維度上數求和(即合並成一個)

torch.nn.CrossEntropyLoss()

  這個交叉熵損失函數把input tensor進行了softmax()、log()、NLLLoss()計算,即三合一。見博客 https://blog.csdn.net/qq_22210253/article/details/85229988 博主寫的很好,感謝博主    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM