Κοινή χρήση τεχνολογίας

Κατανόηση του άξονα 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

Συνδυάστε αυτά τα δύο παραδείγματα για να εξηγήσετε λεπτομερώς τις αλλαγές στον άξονα υπό διαφορετικές συνθήκες.
Η κατανόηση των πράξεων διαστάσεων σε τανυστές και άθροισης κατά μήκος συγκεκριμένων αξόνων στο PyTorch απαιτεί λίγο χρόνο. Ας αναλύσουμε αυτές τις λειτουργίες βήμα προς βήμα μέσα από δύο παραδείγματα και ας εξηγήσουμε λεπτομερώς τις αλλαγές των αξόνων σε διαφορετικές καταστάσεις.

πρώτο παράδειγμα

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

Αυτό είναι ένα σχήμα του (1, 4, 4) των τανυστών. Μπορούμε να το σκεφτούμε ως μια παρτίδα που περιέχει μια μήτρα 4x4.

Άθροισμα κατά τον άξονα 1
  1. x.sum(axis=1, keepdim=True)

Άθροισμα κατά τον άξονα 1 (δηλαδή την κατεύθυνση της δεύτερης διάστασης, 4), διατηρώντας τις διαστάσεις.

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

Το σχήμα γίνεται (1, 1, 4)

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

Άθροισμα κατά τον άξονα 1, δεν διατηρείται καμία διάσταση.

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

Το σχήμα γίνεται (1, 4)

Άθροισμα κατά τον άξονα 0
  1. x.sum(axis=0, keepdim=True)

Άθροισμα κατά τον άξονα 0 (δηλαδή την κατεύθυνση της πρώτης διάστασης, 1), διατηρώντας τις διαστάσεις.

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

Επειδή ο αρχικός τανυστής έχει μόνο ένα στοιχείο στον άξονα 0, το αποτέλεσμα είναι το ίδιο με τον αρχικό τανυστή, με σχήμα (1, 4, 4)

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

Άθροισμα κατά τον άξονα 0, η διάσταση δεν διατηρείται.

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

Το σχήμα γίνεται (4, 4)

Άθροισμα κατά τον άξονα 2
  1. x.sum(axis=2, keepdim=True)

Άθροισμα κατά τον άξονα 2 (δηλαδή την τρίτη διάσταση, την κατεύθυνση του 4), διατηρώντας τις διαστάσεις.

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

Το σχήμα γίνεται (1, 4, 1)

σημείο κλειδί
  • keepdim=True Οι αθροιστικές διαστάσεις θα διατηρηθούν, ο αριθμός των διαστάσεων του αποτελέσματος παραμένει αμετάβλητος, αλλά το μέγεθος των αθροιστικών διαστάσεων γίνεται 1.
  • keepdim=False Οι αθροιστικές διαστάσεις θα αφαιρεθούν και ο αριθμός των διαστάσεων στο αποτέλεσμα θα μειωθεί κατά 1.

δεύτερο παράδειγμα

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

Αυτό είναι ένα σχήμα του (4, 4) των τανυστών.

Άθροισμα κατά τον άξονα 1
  1. x.sum(axis=1, keepdim=True)

Άθροισμα κατά τον άξονα 1 (δηλαδή την κατεύθυνση της δεύτερης διάστασης, 4), διατηρώντας τις διαστάσεις.

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

Το σχήμα γίνεται (4, 1)

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

Άθροισμα κατά τον άξονα 1, δεν διατηρείται καμία διάσταση.

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

Το σχήμα γίνεται (4,)

Στοιχεία διαιρούμενα με άθροισμα σειρών
  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

Αυτό είναι το άθροισμα κάθε στοιχείου διαιρούμενο με την αντίστοιχη σειρά του, με αποτέλεσμα:

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

Σύνοψη των αλλαγών άξονα και διαστάσεων

  • άξονας=0: Λειτουργήστε κατά μήκος της πρώτης διάστασης (σειρά) και το άθροισμα των άλλων διαστάσεων παραμένει μετά την άθροιση.
  • άξονας=1: Λειτουργεί κατά μήκος της δεύτερης διάστασης (στήλη) και το άθροισμα της πρώτης και της τρίτης διάστασης παραμένει μετά την άθροιση.
  • άξονας=2: Λειτουργεί κατά μήκος της τρίτης διάστασης (βάθος) και το άθροισμα των δύο πρώτων διαστάσεων παραμένει μετά την άθροιση.

χρήση keepdim=True Κατά τη διατήρηση των διαστάσεων, η αθροιστική διάσταση γίνεται 1.χρήσηkeepdim=False Όταν , αφαιρούνται οι αθροιστικές διαστάσεις.

αμφιβολία:

Γιατί οι σειρές είναι σε στήλες αντί για reshape(1, 4, 4) Μόνο όταν το reshape(4, 4) είναι σε σειρές;

Δομή τανυστή

Ας εξετάσουμε πρώτα τις βασικές έννοιες:

  • 2D τανυστής (μήτρας): Έχει γραμμές και στήλες.
  • τρισδιάστατος τανυστής: Αποτελείται από πολλαπλούς δισδιάστατους πίνακες και μπορεί να θεωρηθεί ως μια στοίβα πινάκων με διάσταση «βάθους».

Παράδειγμα 1: Δισδιάστατος τανυστής (4, 4)

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

Παραγωγή:

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

Το σχήμα αυτού του τανυστή είναι (4, 4), αντιπροσωπεύει έναν πίνακα 4x4:

  • Εντάξειείναι οριζόντια:

    • Γραμμή 0: [ 0, 1, 2, 3]
    • Γραμμή 1: [ 4, 5, 6, 7]
    • Γραμμή 2: [ 8, 9, 10, 11]
    • Γραμμή 3: [12, 13, 14, 15]
  • Λίσταείναι κάθετη:

    • Στήλη 0: [ 0, 4, 8, 12]
    • Στήλη 1: [ 1, 5, 9, 13]
    • Στήλη 2: [ 2, 6, 10, 14]
    • Στήλη 3: [ 3, 7, 11, 15]

Παράδειγμα 2: Τρισδιάστατος τανυστής (1, 4, 4)

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

Παραγωγή:

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

Το σχήμα αυτού του τανυστή είναι (1, 4, 4), αντιπροσωπεύει έναν τρισδιάστατο τανυστή 1x4x4:

  • Η πρώτη διάσταση είναι 1, υποδεικνύοντας το μέγεθος της παρτίδας.
  • Η δεύτερη διάσταση είναι 4, αντιπροσωπεύει τον αριθμό των σειρών (γραμμές ανά πίνακα).
  • Η τρίτη διάσταση είναι 4, αντιπροσωπεύει τον αριθμό των στηλών (στήλες κάθε πίνακα).

Επεξήγηση του αθροίσματος κατά άξονα

Άθροισμα κατά τον άξονα 1 (δεύτερη διάσταση)
  1. Για δισδιάστατο τανυστή (4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Παραγωγή:

tensor([[ 6],
        [22],
        [38],
        [54]])
  • 1
  • 2
  • 3
  • 4
  • Ο άξονας 1 είναι η κατεύθυνση των σειρών και τα στοιχεία κάθε σειράς αθροίζονται:
    • [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. Για τρισδιάστατους τανυστές (1, 4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Παραγωγή:

tensor([[[24, 28, 32, 36]]])
  • 1
  • Ο άξονας 1 είναι η κατεύθυνση της γραμμής του πρώτου πίνακα. Αθροίστε τα στοιχεία κάθε σειράς:
    • [0, 1, 2, 3] + [4, 5, 6, 7] + [8, 9, 10, 11] + [12, 13, 14, 15]
    • Άθροισμα ανά στήλη: 24 = 0+4+8+12, 28 = 1+5+9+13, 32 = 2+6+10+14, 36 = 3+7+11+15

Γιατί μοιάζει με "οι σειρές γίνονται στήλες"

υπάρχει (1, 4, 4) Στον τρισδιάστατο τανυστή, η πρώτη διάσταση αντιπροσωπεύει το μέγεθος παρτίδας, επομένως φαίνεται ότι κάθε πίνακας 4x4 εξακολουθεί να επεξεργάζεται με δισδιάστατο τρόπο κατά τη λειτουργία. Ωστόσο, επειδή προστίθεται μια διάσταση παρτίδας, συμπεριφέρεται διαφορετικά από έναν δισδιάστατο τανυστή στη λειτουργία αθροίσματος.

ΕΙΔΙΚΑ:

  • Όταν αθροίζουμε κατά μήκος του άξονα 1 (η δεύτερη διάσταση), αθροίζουμε τις σειρές κάθε πίνακα.
  • Όταν αθροίζουμε κατά μήκος του άξονα 0 (η πρώτη διάσταση), αθροίζουμε τις διαστάσεις της παρτίδας.

Συνοψίζω

  • 2D τανυστής: Οι έννοιες των γραμμών και των στηλών είναι διαισθητικές.
  • τρισδιάστατος τανυστής: Αφού εισαχθεί η διάσταση παρτίδας, οι λειτουργίες γραμμής και στήλης θα φαίνονται διαφορετικές, αλλά στην πραγματικότητα εξακολουθούν να λειτουργούν σε κάθε δισδιάστατο πίνακα.
  • Κατά την άθροιση κατά μήκος ενός άξονα, η κατανόηση των διαστάσεων του αθροίσματος είναι το κλειδί.