PyTorch-11-深さ学習テンソル-PyTorchを用いた放送と賢明な操作


PyTorch-11-深さ学習テンソル-PyTorchを用いた放送と賢明な操作
  • What Does Element-Wise Mean?
  • Addition Is An Element-Wise Operation
  • Arthmetic Operations Aree Element-Wise Operations
  • Broadcasting Tensors
  • Trickier Example Of Broadcasting
  • Compparison Operations Aree Element-Wise
  • Behavior Change In PyTorch`Version 1.2.0`
  • Element-Wise Comprison Operation Examples
  • Element-Wise Operation Using Functions
  • Some Terminology
  • Wrapping Up
  • What Does Element-Wise Mean?Element-Wise は、神経ネットワークプログラミングにおいてテンソルを伴う極めて一般的な動作である.元素操作の定義で議論を始めましょう.要素の操作に基づいてテンソル間の対応する要素を動作させる.
    2つの要素がテンソル内で同じ位置を占めるなら、この2つの要素は対応すると考えられる.この位置は、各要素を特定するためのインデックスによって決定されます.
    次の2つの枚数があるとします.
    > t1 = torch.tensor([
        [1,2],
        [3,4]
    ], dtype=torch.float32)
    
    > t2 = torch.tensor([
        [9,8],
        [7,6]
    ], dtype=torch.float32)
    
    これらの2つのテンソルは、2 x 2形状の2 である.
    これは私たちが二つの軸を持っています.各軸の長さは全部二つの要素です.第一軸の要素は配列で、第二軸の要素は数字です.
    # Example of the first axis
    > print(t1[0])
    tensor([1., 2.])
    
    # Example of the second axis
    > print(t1[0][0])
    tensor(1.)
    
    これは私たちが今シリーズでよく見ているものです.じゃ、これをもとにしましょう.
    2つの要素がテンソル内で同じ位置にあるならば、この2つの要素は対応すると考えられ、この位置は各要素の位置を特定するための索引によって決定されることを知っている.対応する元素の例を見ましょう.
    > t1[0][0]
    tensor(1.)
    
    > t2[0][0]
    tensor(9.)
    
    これは、t 1の対応する要素がt29の要素であることを示している.
    対応関係は索引で定義されます.これは元素方式操作の重要な特徴を明らかにするために重要である.テンソルは同じ数の要素を持っていないと元素別の動作を実行できないと推測できます.
    私たちはこの声明を続けて、より限定的にします.2つのテンソルは、要素別の動作を実行するために同じ形状を持つ必要があります.
    Addition Is An Element-Wise Operation
    要素に基づいた最初の操作足し算を見てみましょう.心配しないでください.もっと面白くなります.
    > t1 + t2
    tensor([[10., 10.],
            [10., 10.]])
    
    これはテンソル間の加算が元素操作であることを示した.対応する位置の一対の要素を合わせて、同じ形の新しいテンソルを生成します.
    したがって、加算は要素による演算ですが、実際には、すべての算術演算(プラス、マイナス、乗算、および除算)は要素による演算です.
    Arthmetic Operations Aree Element-Wise Operations
    私たちは通常、テンソルで見た演算はスカラー値を用いた算術演算である.この操作は2つの方法で実行できます.
    (1)以下の記号を使って動作します.
    > print(t + 2)
    tensor([[3., 4.],
            [5., 6.]])
    
    > print(t - 2)
    tensor([[-1.,  0.],
            [ 1.,  2.]])
    
    > print(t * 2)
    tensor([[2., 4.],
            [6., 8.]])
    
    > print(t / 2)
    tensor([[0.5000, 1.0000],
            [1.5000, 2.0000]])
    
    または等価的に、(2)これらの内蔵テンソルオブジェクトの方法:
    > print(t1.add(2))
    tensor([[3., 4.],
            [5., 6.]])
    
    > print(t1.sub(2))
    tensor([[-1.,  0.],
            [ 1.,  2.]])
    
    > print(t1.mul(2))
    tensor([[2., 4.],
            [6., 8.]])
    
    > print(t1.div(2))
    tensor([[0.5000, 1.0000],
            [1.5000, 2.0000]])
    
    この二つの選択肢の動作原理は同じです.両方の場合,スカラー値2はそれぞれの要素に対応する算術演算によって適用されることを見ることができる.
    ここに問題があるようです.これらの例は、要素ベースの演算が同じ形状のテンソルで動作するという規則を破る.
    スカラ値はRank-0 であり、これは形状がないことを意味し、私たちのテンソルt12 x 2形状のrank-2テンソルである.
    これはどうやって似合いますか?分解しましょう.
    考えられる最初の解は、この動作は単一のスカラー値のみを使用して、テンソル内の各要素を動作させることである.
    このロジックの作品.しかし、これはちょっと誤解されています.使用スカラーがより一般的であることに気付き、崩壊します.
    これらの動作を異なる方法で考慮するためには、テンソル の概念(broadcasting or broadcasting)を導入する必要がある.
    Broadcasting Tensors は、要素動作中に異なる形状のテンソルをどのように処理するかについて説明する. , 。t1 + 2演算を考えましょう.ここで、スケーラ値テンソルをt 1の形状にブロードキャストし、要素毎の演算を実行する.broadcast_to() Numpy関数を使用して、ブロードキャストのスカラ値を確認することができます.
    > np.broadcast_to(2, t1.shape)
    array([[2, 2],
            [2, 2]])
    
    これは、スカラ値がt1のように2段のテンソルに変換されることを意味し、そのために形状が一致し、同じ形状を持つ要素毎の規則がまた機能してくる.もちろん、これは全部隠しました.
    このコードは絵と言える.これ
    > t1 + 2
    tensor([[3., 4.],
            [5., 6.]])
    
    確かにそうです.
    > t1 + torch.tensor(
        np.broadcast_to(2, t1.shape)
        ,dtype=torch.float32
    )
    tensor([[3., 4.],
            [5., 6.]])
    
    この点については、ちょっと分かりにくいと思われるかもしれませんので、もっと難しい例を見て説明しましょう.次の2つのテンソルがあると仮定します.
    Trickier Example Of Broadcasting
    もっと厄介な例を見せてください.私たちが次の枚数を持っていると仮定します.
    t1 = torch.tensor([
        [1,1],
        [1,1]
    ], dtype=torch.float32)
    
    t2 = torch.tensor([2,4], dtype=torch.float32)
    
    この元素で足し算した結果は何ですか?要素操作についても同じ形状規則を指定できますか?
    # t1 + t2 ???????
    
    > t1.shape
    torch.Size([2, 2])
    
    > t2.shape
    torch.Size([2])
    
    この二つのテノールは違った形をしていても、元素別の操作ができ、放送が可能になります.低レベルのテンソルt 2は、ブロードキャストによって変換され、より高いレベルのテンソルt 1の形状にマッチし、通常のように要素毎の演算が行われる.
    放送の概念は、この操作をどのように実行するかを理解する鍵である.以前と同じように、私たちはbroadcast_to() numpy関数を使ってブロードキャスト変換を調べられます.
    > np.broadcast_to(t2.numpy(), t1.shape)
    array([[2., 4.],
            [2., 4.]], dtype=float32)
    
    > t1 + t2
    tensor([[3., 5.],
            [3., 5.]])
    
    放送後、この2つのテンソルの間の加算は、同じ形のテンソルの間で、通常は要素で演算されます.
    放送は基本的な要素操作よりも高級なテーマですので、この考えを熟知するために時間がかかる心配はありません.
    要素毎の動作と同じ形状要求を理解して放送の概念となぜそれを使用して基礎を提供しました.
    私たちはいつラジオを使いますか?データを前処理する時、特に正規化されている期間に、私たちはよくラジオを使う必要があります.TensorFlow.jsシリーズの中にラジオの詳細が紹介されています.実際の例があり、特定のテンソルをブロードキャストする方法を決定するためのアルゴリズムも紹介していますので、放送に関するより深い議論をよく読んでください.
    心配しないでください.必要ではないです.放送で内容を見ることを強く勧めます.
    Compparison Operations Aree Element-Wise
    比較操作も元素で操作します.
    2つのテンソル間の所与の比較動作については、同じ形状の新しいテンソルを返します.各要素は、touch.book値がTrueまたはFalseの要素を含みます.
    Behavior Change In PyTorch TensorFlow.js戻ってきた比較動作Version 1.2.0dtypeからtorch.uint8に変更されました.
    バージョン1.1:
    > torch.tensor([1, 2, 3]) < torch.tensor([3, 1, 2])
    tensor([1, 0, 0], dtype=torch.uint8)
    
    バージョン1.2:
    > torch.tensor([1, 2, 3]) < torch.tensor([3, 1, 2])
    tensor([True, False, False])
    
    関連リンク:
  • Release Notes:Link
  • Pull Request:Link
  • 以下の例は、PyTorchバージョンtorch.bool(21113)およびより高いバージョンの出力を示している.
    Element-Wise Compparion Operation Examples
    次の枚数があるとします.
    > t = torch.tensor([
        [0,5,0],
        [6,0,7],
        [0,8,0]
    ], dtype=torch.float32)
    
    その中のいくつかの比較操作を見に来ました.
    > t.eq(0)
    tensor([[True, False, True],
            [False, True, False],
            [True, False, True]])
    
    > t.ge(0)
    tensor([[True, True, True],
            [True, True, True],
            [True, True, True]])
    
    > t.gt(0)
    tensor([[False, True, False],
            [True, False, True],
            [False, True, False]])
    
    > t.lt(0)
    tensor([[False, False, False],
            [False, False, False],
            [False, False, False]])
    
    > t.le(7)
    tensor([[True, True, True],
            [True, True, True],
            [True, False, True]])
    
    放送の観点からこれらの動作を考慮すると、最後の1.2.0が実際にこのように見える.
    > t <= torch.tensor(
        np.broadcast_to(7, t.shape)
        ,dtype=torch.float32
    )
    
    tensor([[True, True, True],
            [True, True, True],
            [True, False, True]])
    
    等価的に:
    > t <= torch.tensor([
        [7,7,7],
        [7,7,7],
        [7,7,7]
    ], dtype=torch.float32)
    
    tensor([[True, True, True],
            [True, True, True],
            [True, False, True]])
    
    Element-Wise Operations Using Functions
    関数としての要素単位演算を用いて,テンソルの各要素にこの関数が適用されると良く仮定できる.
    ここにはいくつかの例があります.
    > t.abs() 
    tensor([[0., 5., 0.],
            [6., 0., 7.],
            [0., 8., 0.]])
    
    > t.sqrt()
    tensor([[0.0000, 2.2361, 0.0000],
            [2.4495, 0.0000, 2.6458],
            [0.0000, 2.8284, 0.0000]])
    
    > t.neg()
    tensor([[-0., -5., -0.],
            [-6., -0., -7.],
            [-0., -8., -0.]])
    
    > t.neg().abs()
    tensor([[0., 5., 0.],
            [6., 0., 7.],
            [0., 8., 0.]])
    
    Some Terminology
    他にもいくつかの方法があります.元素に基づいた操作を引用することができますので、これらのすべては同じことを意味します.
  • 要素Element-wise
  • によると
  • コンポーネント側Component-wise
  • ポイントPoint-wise
  • 野外でこれらの用語があったら覚えてください.
    Wrapping Up
    ここでは、要素ベースの操作と、神経ネットワークと深さ学習にどのようにそれらを適用するかについてのテンソル動作についてよく知るべきである.次の文章では、テンソル操作の最後の2つを紹介します.
  • リフォーム操作Reshaping operation
  • 要素操作Element-wise operation
  • 復元動作Reduction operation
  • アクセス操作Access operation
  • じゃ、また