Berbagi teknologi

Pemahaman tentang sumbu pytorch

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

import torch
x = torch.arange(16).reshape(1,4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
a3 = x.sum(axis = 0,keepdim=True)
a4 = x.sum(axis = 0,keepdim=False)
a5 = x.sum(axis = 2,keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
 import torch
x = torch.arange(16).reshape(4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
print(a)
print(a2)
print(x/a) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Gabungkan kedua contoh ini untuk menjelaskan secara rinci perubahan sumbu dalam keadaan berbeda.
Memahami operasi dimensi pada tensor dan penjumlahan sepanjang sumbu tertentu di PyTorch memang memerlukan sedikit waktu. Mari kita menganalisis operasi ini langkah demi langkah melalui dua contoh, menjelaskan secara rinci perubahan sumbu dalam situasi yang berbeda.

contoh pertama

import torch
x = torch.arange(16).reshape(1, 4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
a3 = x.sum(axis=0, keepdim=True)
a4 = x.sum(axis=0, keepdim=False)
a5 = x.sum(axis=2, keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
tensor awal
tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

Ini adalah bentuk (1, 4, 4) dari tensor. Kita dapat menganggapnya sebagai kumpulan yang berisi matriks 4x4.

Jumlahkan sepanjang sumbu 1
  1. x.sum(axis=1, keepdim=True)

Jumlahkan sepanjang sumbu 1 (yaitu arah dimensi kedua, 4), pertahankan dimensinya.

tensor([[[24, 28, 32, 36]]])
  • 1

Bentuknya menjadi (1, 1, 4)

  1. x.sum(axis=1, keepdim=False)

Jumlahkan sepanjang sumbu 1, tidak ada dimensi yang dipertahankan.

tensor([[24, 28, 32, 36]])
  • 1

Bentuknya menjadi (1, 4)

Jumlahkan sepanjang sumbu 0
  1. x.sum(axis=0, keepdim=True)

Jumlahkan sepanjang sumbu 0 (yaitu arah dimensi pertama, 1), pertahankan dimensinya.

tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

Karena tensor asli hanya memiliki satu elemen pada sumbu 0, maka hasilnya sama dengan tensor asli, yaitu berbentuk (1, 4, 4)

  1. x.sum(axis=0, keepdim=False)

Jumlahkan sepanjang sumbu 0, dimensi tidak dipertahankan.

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

Bentuknya menjadi (4, 4)

Jumlahkan sepanjang sumbu 2
  1. x.sum(axis=2, keepdim=True)

Jumlahkan sepanjang sumbu 2 (yaitu dimensi ketiga, arah 4), pertahankan dimensinya.

tensor([[[ 6],
         [22],
         [38],
         [54]]])
  • 1
  • 2
  • 3
  • 4

Bentuknya menjadi (1, 4, 1)

Inti
  • keepdim=True Dimensi yang dijumlahkan akan dipertahankan, jumlah dimensi hasil tetap tidak berubah, tetapi ukuran dimensi yang dijumlahkan menjadi 1.
  • keepdim=False Dimensi yang dijumlahkan akan dihilangkan, dan jumlah dimensi pada hasil akan dikurangi 1.

contoh kedua

import torch
x = torch.arange(16).reshape(4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
print(a)
print(a2)
print(x/a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
tensor awal
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

Ini adalah bentuk (4, 4) dari tensor.

Jumlahkan sepanjang sumbu 1
  1. x.sum(axis=1, keepdim=True)

Jumlahkan sepanjang sumbu 1 (yaitu arah dimensi kedua, 4), pertahankan dimensinya.

tensor([[ 6],
        [22],
        [38],
        [54]])
  • 1
  • 2
  • 3
  • 4

Bentuknya menjadi (4, 1)

  1. x.sum(axis=1, keepdim=False)

Jumlahkan sepanjang sumbu 1, tidak ada dimensi yang dipertahankan.

tensor([ 6, 22, 38, 54])
  • 1

Bentuknya menjadi (4,)

Elemen dibagi dengan jumlah baris
  1. x / a
tensor([[0.0000, 0.1667, 0.3333, 0.5000],
        [0.1818, 0.2273, 0.2727, 0.3182],
        [0.2105, 0.2368, 0.2632, 0.2895],
        [0.2222, 0.2407, 0.2593, 0.2778]])
  • 1
  • 2
  • 3
  • 4

Ini adalah jumlah setiap elemen dibagi dengan baris yang bersesuaian, sehingga menghasilkan:

tensor([[ 0/6,  1/6,  2/6,  3/6],
        [ 4/22,  5/22,  6/22,  7/22],
        [ 8/38,  9/38, 10/38, 11/38],
        [12/54, 13/54, 14/54, 15/54]])
  • 1
  • 2
  • 3
  • 4

Ringkasan perubahan sumbu dan dimensi

  • sumbu=0: Beroperasi sepanjang dimensi pertama (baris), dan jumlah dimensi lainnya tetap ada setelah dijumlahkan.
  • sumbu=1: Beroperasi sepanjang dimensi kedua (kolom), dan jumlah dimensi pertama dan ketiga tetap ada setelah dijumlahkan.
  • sumbu=2: Beroperasi sepanjang dimensi ketiga (kedalaman), jumlah dari dua dimensi pertama tetap ada setelah dijumlahkan.

menggunakan keepdim=True Saat mempertahankan dimensi, dimensi yang dijumlahkan menjadi 1.menggunakankeepdim=False Ketika , dimensi yang dijumlahkan dihilangkan.

ragu:

Mengapa baris dicantumkan, bukan kolom, saat reshape(1, 4, 4) digunakan? Hanya saat reshape(4, 4) digunakan, barisnya adalah baris.

Struktur tensor

Mari kita tinjau konsep dasarnya terlebih dahulu:

  • Tensor 2D (matriks): Memiliki baris dan kolom.
  • Tensor 3D: Terdiri dari beberapa matriks dua dimensi dan dapat dianggap sebagai tumpukan matriks dengan dimensi "kedalaman".

Contoh 1: Tensor dua dimensi (4, 4)

import torch
x = torch.arange(16).reshape(4, 4)
print(x)
  • 1
  • 2
  • 3

Keluaran:

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

Bentuk tensor ini adalah (4, 4), mewakili matriks 4x4:

  • OKEhorisontal:

    • Baris 0: [ 0, 1, 2, 3]
    • Baris 1: [ 4, 5, 6, 7]
    • Baris 2: [ 8, 9, 10, 11]
    • Baris 3: [12, 13, 14, 15]
  • Daftarvertikal:

    • Kolom 0: [ 0, 4, 8, 12]
    • Kolom 1: [ 1, 5, 9, 13]
    • Kolom 2: [ 2, 6, 10, 14]
    • Kolom 3: [ 3, 7, 11, 15]

Contoh 2: Tensor tiga dimensi (1, 4, 4)

x = torch.arange(16).reshape(1, 4, 4)
print(x)
  • 1
  • 2

Keluaran:

tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

Bentuk tensor ini adalah (1, 4, 4), mewakili tensor tiga dimensi 1x4x4:

  • Dimensi pertama adalah 1, menunjukkan ukuran batch.
  • Dimensi kedua adalah 4, mewakili jumlah baris (baris per matriks).
  • Dimensi ketiga adalah 4, mewakili jumlah kolom (kolom setiap matriks).

Penjelasan jumlah sepanjang sumbu

Jumlahkan sepanjang sumbu 1 (dimensi kedua)
  1. Untuk tensor dua dimensi (4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Keluaran:

tensor([[ 6],
        [22],
        [38],
        [54]])
  • 1
  • 2
  • 3
  • 4
  • Sumbu 1 adalah arah baris, dan elemen setiap baris dijumlahkan:
    • [0, 1, 2, 3] => 0+1+2+3 = 6
    • [4, 5, 6, 7] => 4+5+6+7 = 22
    • [8, 9, 10, 11] => 8+9+10+11 = 38
    • [12, 13, 14, 15] => 12+13+14+15 = 54
  1. Untuk tensor tiga dimensi (1, 4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Keluaran:

tensor([[[24, 28, 32, 36]]])
  • 1
  • Sumbu 1 adalah arah baris matriks pertama. Jumlahkan elemen setiap baris:
    • [0, 1, 2, 3] + [4, 5, 6, 7] + [8, 9, 10, 11] + [12, 13, 14, 15]
    • Jumlah per kolom: 24 = 0+4+8+12, 28 = 1+5+9+13, 32 = 2+6+10+14, 36 = 3+7+11+15

Mengapa terlihat seperti "baris menjadi kolom"

ada (1, 4, 4) Pada tensor tiga dimensi, dimensi pertama merepresentasikan ukuran batch, sehingga nampaknya setiap matriks 4x4 masih diproses secara dua dimensi saat beroperasi. Namun, karena dimensi batch ditambahkan, perilakunya berbeda dari tensor dua dimensi dalam operasi penjumlahan.

Secara khusus:

  • Saat menjumlahkan sepanjang sumbu 1 (dimensi kedua), kita menjumlahkan baris-baris setiap matriks.
  • Saat menjumlahkan sepanjang sumbu 0 (dimensi pertama), kami menjumlahkan dimensi batch.

Meringkaskan

  • Tensor 2D: Konsep baris dan kolom bersifat intuitif.
  • Tensor 3D: Setelah dimensi batch diperkenalkan, operasi baris dan kolom akan terlihat berbeda, namun nyatanya tetap beroperasi pada setiap matriks dua dimensi.
  • Saat menjumlahkan sepanjang sumbu, memahami dimensi penjumlahan adalah kuncinya.