PyTorch版のノートを深く勉強します


PyTorchの深さ学習フレームワークにサービスを提供するtorchvisionパッケージは、主にコンピュータのビジュアルモデルを構築するために使用されます.torchvisionは主に以下の部分から構成されています.
  • torchvision.Datasets:データをロードする関数とよく使われるデータセットインタフェース.
  • torchvision.Models:AlexNet、VGG、ResNetなど、一般的なモデル構造(事前訓練モデルを含む)を含む.
  • torchvision.transforms:裁断、回転など、よく使われる画像変換.
  • torchvision.utils:他の役に立つ方法.
  • tensor.view():numpyとpytorchの類似性からviewはnumpyのreshape関数に類似する
    import torch
    
    x = torch.randn(4, 4)
    
    x.size()
    
    torch.Size([4, 4])
    
    y = x.view(16)
    y.size()
    
    torch.Size([16])
    

    -1は他の次元からsizeを推定することを意味します
    z = x.view(-1, 8)
    z.size()
    
    torch.Size([2, 8])
    

    サブマップを後方から除外


    各変数には、requires_gradvolatileの2つのフラグがあります.これらはいずれも勾配計算からサブマップを細かく排除することを可能にし,効率を向上させることができる.requires_grad単一の入力操作に勾配が必要な場合、その出力にも勾配が必要です.逆に,すべての入力に勾配を必要とせず,出力のみを必要としない.すべての変数が勾配を必要としない場合、後方計算はサブマップでは実行されません.
    from torch.autograd import Variable
    x = Variable(torch.randn(5, 5))
    y = Variable(torch.randn(5, 5))
    z = Variable(torch.randn(5, 5), requires_grad=True)
    a = x + y
    
    a.requires_grad
    
    False
    
    b = a + z
    b.requires_grad
    
    True
    

    このフラグは、モデルの一部をフリーズしたい場合や、パラメータの勾配が使用されないことを事前に知っておくと便利です.例えば、予め訓練されたCNNを最適化するには、凍結モデルのrequires_gradフラグを切り替えるだけで十分であり、中間バッファが最後のレイヤに計算されるまで保存されず、シミュレーション変換は勾配を必要とする重みを使用し、ネットワークの出力も必要となる.

    多次元Tensorの次元別操作

    X = torch.tensor([[1, 2, 3], [4, 5, 6]])
    print(X.sum(dim=0, keepdim=True))  # dim 0, , 
    print(X.sum(dim=1, keepdim=True))  # dim 1, , 
    print(X.sum(dim=0, keepdim=False)) # dim 0, , 
    print(X.sum(dim=1, keepdim=False)) # dim 1, , 
    
    tensor([[5, 7, 9]])
    tensor([[ 6],
            [15]])
    tensor([5, 7, 9])
    tensor([ 6, 15])
    
    torch.gather(input, dim, index, out=None, sparse_grad=False) → Tensor:dimで指定した軸に沿って値を収集
    3 Dテンソルの場合、出力は次のとおりです.
    out[ i ][ j ][ k ] = input[ index[ i ][ j ][ k ] ][ j ][ k ] # if dim == 0 out[ i ][ j ][ k ] = input[ i ][ index[ i ][ j ][ k ] ][ k ] # if dim == 1 out[ i ][ j ][ k ] = input[ i ][ j ][ index[ i ][ j ][ k ] ] # if dim == 2
    t = torch.tensor([[1, 2], [3, 4]])
    t
    
    tensor([[1, 2],
            [3, 4]])
    
    torch.gather(t, 1, torch.tensor([[0,0],[1,0]]))
    
    tensor([[1, 1],
            [4, 3]])
    

    0
    1
    0
    1
    2
    1
    3
    4
    次の座標に相当する点、dim=1は、yを軸として[(0,0),(0,1)]-->[(0,0),(0,0)][(1,0),(1,1)]-->[(1,1),(1,0)]]
    b = torch.Tensor([[1,2,3],[4,5,6]])
    print(b)
    index_1 = torch.LongTensor([[0,1],[2,0]])
    index_2 = torch.LongTensor([[0,1,1],[0,0,0]])
    print(torch.gather(b, dim=1, index=index_1))
    print(torch.gather(b, dim=0, index=index_2))
    
    tensor([[1., 2., 3.],
            [4., 5., 6.]])
    tensor([[1., 2.],
            [6., 4.]])
    tensor([[1., 5., 6.],
            [1., 2., 3.]])
    

    [(0,0),(0,1),(0,2)] --> [(0,0),(1,1),(1,2)] [(1,0),(1,1),(1,2)] --> [(0,0),(0,1),(0,2)]

    間違った授業後の練習


    1.全接続層を実現している場合、全接続層の入力形状は7です.×8、出力形状は7×1、そのうち7がロットサイズであると、重みパラメータwとバイアスパラメータbの形状はそれぞれ___であるおよび___
    8×1,7×1 8×1,1×1
    入力ロットをX∈R 7∗8 Xinmathbb{R}^{7*8}X∈R 7∗8とし、対応する出力をY∈R 8∗1 Yinmathbb{R}^{8*1}Y∈R 8∗1とすると、X w∈R7∗1 Xwinmathbb{R}^{7*1}Xw∈R 7∗1とし、X w Xw Xw Xw Xw中の各要素に加えたバイアスは、X∈R X w Xwの各要素に加えたバイアスは、X∈R 7∗1である.同様に、バイアスパラメータb∈R 1∗1 binmathbb{R}^{1*1}b∈R 1∗1は、加算による放送メカニズムに基づいて、出力Y=X w+b Y=Xw+b Y=Xw+b Y=Xw+bが完成する.パラメータの形状はロットサイズとは関係ありません.そのため、同じモデルでは異なるロットサイズを選択できます.