Crea un framework di deep learning da zero

Jan 22 2023
Parte 2: Tensori e NumPy dietro le quinte.
Introduzione Tensor è dai termini che vengono utilizzati in modo diverso a seconda del campo. fisici e matematici lo definiscono in un certo modo mentre i data scientist usano altre definizioni, quindi potrebbe causare un po 'di confusione in questo articolo discuteremo questa parola e conosceremo le sue proprietà e le operazioni eseguite su di essa.
Il cubo di Rubik come tensore 3D

introduzione

Tensor è dai termini che vengono usati in modo diverso a seconda del tuo campo. fisici e matematici lo definiscono in un certo modo mentre i data scientist usano altre definizioni, quindi potrebbe causare un po 'di confusione in questo articolo discuteremo questa parola e conosceremo le sue proprietà e le operazioni eseguite su di essa. abbiamo bisogno di comprendere a fondo i tensori per costruirlo da zero. ora iniziamo definendolo.

Cosa sono i tensori

Il matematico definisce i tensori come un oggetto matematico che ha n indici e m^n componenti e obbedisce a determinate regole di trasformazione. Suona un po' interessante, chiariamolo un po' con alcuni esempi di programmazione.

A = [1,2,3,4] # 1D array

B = [[5,6,7],
     [8,9,10]] # 2D array

C = [[[1,2],[3,4]],
    [[5,6],[7,8]]] # 3D array

La dimensione è un termine usato per indicare quanti assi in un oggetto, per la linea ha una lunghezza quindi è 1 asse ma per il cubo è 3 assi lunghezza larghezza e altezza.

Le funzioni sono gli elementi con lo stesso tipo di dati in una dimensione specifica.

ma una cosa importante per chiamarlo tensore è che dovrebbe essere omogeneo, tutte le dimensioni hanno lo stesso numero di dimensioni con lo stesso tipo di dati. quindi cos'è un tensore?

Il tensore è un array nD omogeneo

Attributi tensoriali

I tensori hanno alcuni attributi fondamentali (proprietà) che iniziano con rango, asse e forma.

Il rango è la quantità di informazioni per trovare un componente specifico. qual è la sua importanza? Ci dice quanti passaggi (indici) sono necessari per accedere a un dato elemento specifico. supponiamo di avere un tensore A, per accedere al numero 5 è necessario sapere quanti indici sono necessari per accedervi. quindi abbiamo bisogno di tre tipi di informazioni per accedervi.

E = [[[1,2],[3,4]],
    [[5,6],[7,8]]]
E[1][0][0]

F = [[5,6],[7,8]]
# 2 rows and 3 Colums
# axis 0 is the rows and 1 is columns

La forma è il numero di elementi in ogni dimensione. nello stesso esempio sopra E ha 2 elementi sull'asse 0 e 2 elementi sull'asse 1, quindi la sua forma è (2,2).

Memorizzare tensori

potresti chiederti. immagazzinare? è solo un nd array che non sta assegnando la variabile abbastanza per quello?

ora vediamo di confrontare tra array 1D e 2D per capire la differenza. per memorizzare qualsiasi cosa nella RAM dovrebbe avere un posto dove memorizzarlo con un indirizzo specifico e un puntatore puntato su di esso. gli array vengono archiviati in memoria in sequenza con un puntatore all'indice iniziale dell'array.

Puntatore al primo elemento nell'array 1D

ma nell'array 2D, non memorizzerà sequenzialmente in memoria, verrà memorizzato in posizioni diverse con un array nD di indirizzi per ciascun array.

Il puntatore punta a una posizione diversa degli array

La memorizzazione di un array nD sotto forma di un array nD è più efficiente nell'allocazione della memoria.

Per memorizzare un array nD sotto forma di un array 1D è possibile utilizzare uno dei due layout Column-major o Row-major, questi due concetti dei linguaggi Fortran e C.

Colonna Maggiore

Sta memorizzando gli elementi dell'array nD colonna per colonna a partire dall'angolo in alto a sinistra fino alla fine dell'array

Trasformazione colonna principale 2D

Row-Major

Sta memorizzando gli elementi dell'array nD riga per riga a partire dall'angolo in alto a sinistra fino alla fine dell'array

Trasformazione riga principale 2D

Esempio 3D di riga principale

Trasformazione riga principale per array 3D

confrontando i due metodi non c'è modo migliore entrambi possono essere usati a seconda dello scenario, o ancora di più, puoi usare un modo ibrido di mescolare i due metodi.

Una nota aggiuntiva degna di nota è che i numeri sono quando hai fatto qualsiasi trasformazione di array i dati non cambiano nella memoria. Immagina di avere un array nD con numeri grandi come più di 8 byte per ogni immagine che lo rimodella. Oh mio Dio, non è affatto efficiente spostare quei numeri nella memoria, ma se riordinassi semplicemente gli indici sarebbe facile.

1D_array = [100000,5642000,89874131]
indices = [0,1,2]
# reverse the indices
indices = [2,1,0]
for i in indices:
  print(1D_array[i])
# the array is reversed without moving

Conclusione

In questa parte, comprendiamo il concetto di tensore in teoria, i suoi attributi e come memorizzarlo. nella parte successiva, ci sporcheremo le mani con il codice. costruendo un oggetto tensore passo dopo passo a seconda della riga principale come impostazione predefinita, per ora, per raggiungere la nostra destinazione finale costruendoci sopra un framework di deep learning.

Riferimenti

Cosa sono i tensori

La Gilda a NumPy

Prestazioni dell'array 1D rispetto a 2D

Layout di memoria di un array multidimensionale