PyTorchにおける2大コア転置関数transpose()とpermute()

9049 ワード

差を気にする人は【3.違う点】を直接見ることができます
前言pytorchで転置するための関数はこの2つだけです
  • transpose()
  • permute()

  • この2つの関数は、次元を交換する操作です.些細な違いがある
    1.公式文書transpose()
    torch.transpose(input, dim0, dim1, out=None) → Tensor
    

    関数は、入力行列inputの回転を返す.交換次元dim0およびdim1パラメータ:
  • input(Tensor)-テンソルを入力し、
  • を入力します.
  • dim 0(int)-転置された1次元、デフォルト0、オプション
  • dim 1(int)-2 D、デフォルト1、オプション
  • permute()
    permute(dims) → Tensor
    

    tensorの次元をシフトします.
    パラメータ:
  • dims(int...*)-シフト順、必ず
  • を記入します.
    2.同一点
  • は、いずれも回転後のマトリクスを返します.
  • はいずれも高緯行列を操作することができ、permuteは高次元でより機能的である.

  • 3.相違点
    まず、後で使用するデータを定義します.
    #       x,dim=0  2,dim=1  3
    x = torch.randn(2,3)       'x.shape  →  [2,3]'
    #       y,dim=0  2,dim=1  3,dim=2  4
    y = torch.randn(2,3,4)   'y.shape  →  [2,3,4]'
    
  • 合法性が異なる
  • torch.transpose(x)合法、x.transpose()合法.tensor.permute(x)は合法ではなく、x.permute()は合法です.
    第2点の例を参照
  • 操作dim違い:
  • transpose()は一度に2つの次元しか操作できません.permute()は多次元データを一度に操作することができ、permute()のパラメータがint*であるため、すべての次元数を入力しなければならない.
    例を挙げる
    #   transpose
    x.transpose(0,1)     'shape→[3,2] '  
    x.transpose(1,0)     'shape→[3,2] '  
    y.transpose(0,1)     'shape→[3,2,4]' 
    y.transpose(0,2,1)  'error,      '
    
    #   permute()
    x.permute(0,1)     'shape→[2,3]'
    x.permute(1,0)     'shape→[3,2],      shape   x.transpose(1,0) '
    y.permute(0,1)     "error          "
    y.permute(1,0,2)  'shape→[3,2,4]'
    
  • transpose()のうちdimには数の大きさの区別がない.permute()のうちのdimは数ある大小区分
  • である.
    例えば、後のshapeに注意してください.
    #   transpose,   dim  
    x1 = x.transpose(0,1)   'shape→[3,2] '  
    x2 = x.transpose(1,0)   '    ,shape→[3,2] '  
    print(torch.equal(x1,x2))
    ' True ,value shape   '
    
    #   permute()
    x1 = x.permute(0,1)     '  transpose,shape→[2,3] '  
    x2 = x.permute(1,0)     'shape→[3,2] '  
    print(torch.equal(x1,x2))
    'False, transpose  '
    
    y1 = y.permute(0,1,2)     '    ,shape→[2,3,4] '  
    y2 = y.permute(1,0,2)     'shape→[3,2,4] '  
    y3 = y.permute(1,2,0)     'shape→[3,4,2] '  
    

    4.まとめ
    最も重要な違いは上の3点目だと思います.
    また、簡単なデータはtranspose()でいいのですが、個人的には直感的ではなく、指向性が弱いと思います.複雑な次元はpermute()を用いることができ、次元の変化に対しては一般的により正確である.