Teknologian jakaminen

Pytorchin akselin ymmärtäminen

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

Yhdistä nämä kaksi esimerkkiä selittääksesi yksityiskohtaisesti akselin muutokset eri olosuhteissa.
Tensorien ulottuvuusoperaatioiden ymmärtäminen ja summaaminen tiettyjä akseleita pitkin PyTorchissa vie jonkin verran aikaa. Analysoidaan näitä operaatioita askel askeleelta kahden esimerkin kautta selittäen yksityiskohtaisesti akselin muutokset eri tilanteissa.

ensimmäinen esimerkki

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
alkutensori
tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

Tämä on muoto (1, 4, 4) tensoreista. Voimme ajatella sitä eränä, joka sisältää 4x4-matriisin.

Summa akselilla 1
  1. x.sum(axis=1, keepdim=True)

Summa pitkin akselia 1 (eli toisen ulottuvuuden suunta, 4), pitäen mitat.

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

Muoto muuttuu (1, 1, 4)

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

Summa akselilla 1, mittasuhteita ei ole säilynyt.

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

Muoto muuttuu (1, 4)

Summa akselilla 0
  1. x.sum(axis=0, keepdim=True)

Summa akselia 0 pitkin (eli ensimmäisen ulottuvuuden suunta, 1), pitäen mitat.

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

Koska alkuperäisellä tensorilla on vain yksi elementti akselilla 0, tulos on sama kuin alkuperäinen tensori muotoineen (1, 4, 4)

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

Summa akselilla 0, ulottuvuus ei säily.

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

Muoto muuttuu (4, 4)

Summa akselilla 2
  1. x.sum(axis=2, keepdim=True)

Summa akselia 2 pitkin (eli kolmas ulottuvuus, 4:n suunta) pitäen mitat.

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

Muoto muuttuu (1, 4, 1)

avainasia
  • keepdim=True Summaiset mitat säilyvät, tuloksen mittojen määrä pysyy ennallaan, mutta summattujen mittojen kooksi tulee 1.
  • keepdim=False Summaiset mitat poistetaan ja tuloksen mittojen lukumäärää vähennetään yhdellä.

toinen esimerkki

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
alkutensori
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

Tämä on muoto (4, 4) tensoreista.

Summa akselilla 1
  1. x.sum(axis=1, keepdim=True)

Summa pitkin akselia 1 (eli toisen ulottuvuuden suunta, 4), pitäen mitat.

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

Muoto muuttuu (4, 1)

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

Summa akselilla 1, mittasuhteita ei ole säilynyt.

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

Muoto muuttuu (4,)

Elementit jaettuna rivin summalla
  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

Tämä on kunkin elementin summa jaettuna sitä vastaavalla rivillä, mikä johtaa:

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

Yhteenveto akseli- ja mittamuutoksista

  • akseli = 0: Toimi ensimmäistä mittaa (riviä) pitkin, ja muiden mittojen summa jää yhteen summauksen jälkeen.
  • akseli = 1: Toimii toista ulottuvuutta (saraketta) pitkin, ja ensimmäisen ja kolmannen ulottuvuuden summa jää yhteen summauksen jälkeen.
  • akseli = 2: Kolmannen ulottuvuuden (syvyyden) mukaan toimiessa kahden ensimmäisen ulottuvuuden summa jää yhteen summauksen jälkeen.

käyttää keepdim=True Kun mitat säilytetään, summattu mitta tulee 1:ksi.käyttääkeepdim=False Kun , summatut mitat poistetaan.

epäillä:

Miksi rivit luetellaan sarakkeiden sijasta, kun reshape(1, 4, 4) on käytössä Vain kun reshape(4, 4) on käytössä, rivit ovat rivejä?

Tensorirakenne

Käydään ensin läpi peruskäsitteet:

  • 2D-tensori (matriisi): Sisältää rivejä ja sarakkeita.
  • 3D tensori: Se koostuu useista kaksiulotteisista matriiseista, ja sitä voidaan pitää matriisipinona, jolla on "syvyys"-mitta.

Esimerkki 1: Kaksiulotteinen tensori (4, 4)

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

Lähtö:

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

Tämän tensorin muoto on (4, 4), edustaa 4x4-matriisia:

  • OKon vaakasuora:

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

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

Esimerkki 2: Kolmiulotteinen tensori (1, 4, 4)

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

Lähtö:

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

Tämän tensorin muoto on (1, 4, 4), edustaa 1x4x4 kolmiulotteista tensoria:

  • Ensimmäinen ulottuvuus on 1, joka osoittaa erän koon.
  • Toinen ulottuvuus on 4, edustaa rivien määrää (rivejä per matriisi).
  • Kolmas ulottuvuus on 4, edustaa sarakkeiden määrää (kunkin matriisin sarakkeet).

Summan selitys akselia pitkin

Summa akselilla 1 (toinen ulottuvuus)
  1. Kaksiulotteiselle tensorille (4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Lähtö:

tensor([[ 6],
        [22],
        [38],
        [54]])
  • 1
  • 2
  • 3
  • 4
  • Akseli 1 on rivien suunta, ja kunkin rivin elementit lasketaan yhteen:
    • [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. Kolmiulotteisille tensoreille (1, 4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Lähtö:

tensor([[[24, 28, 32, 36]]])
  • 1
  • Akseli 1 on ensimmäisen matriisin rivin suunta. Summaa kunkin rivin elementit:
    • [0, 1, 2, 3] + [4, 5, 6, 7] + [8, 9, 10, 11] + [12, 13, 14, 15]
    • Summa per sarake: 24 = 0+4+8+12, 28 = 1+5+9+13, 32 = 2+6+10+14, 36 = 3+7+11+15

Miksi se näyttää siltä, ​​että "riveistä tulee sarakkeita"

olla olemassa (1, 4, 4) Kolmiulotteisessa tensorissa ensimmäinen ulottuvuus edustaa eräkokoa, joten näyttää siltä, ​​että jokainen 4x4-matriisi käsitellään edelleen kaksiulotteisesti käytettäessä. Kuitenkin, koska erämitta lisätään, se toimii eri tavalla kuin kaksiulotteinen tensori summaoperaatiossa.

Erityisesti:

  • Kun summataan akselilla 1 (toinen ulottuvuus), summaamme kunkin matriisin rivit.
  • Kun summataan akselilla 0 (ensimmäinen mitta), summaamme erämitat.

Tee yhteenveto

  • 2D tensori: Rivien ja sarakkeiden käsitteet ovat intuitiivisia.
  • 3D tensori: Erämitan käyttöönoton jälkeen rivi- ja saraketoiminnot näyttävät erilaisilta, mutta itse asiassa ne toimivat edelleen jokaisessa kaksiulotteisessa matriisissa.
  • Kun summataan akselia pitkin, on tärkeää ymmärtää summan mitat.