unità:
La quantità di "neuroni", o "cellule", o qualunque cosa lo strato abbia al suo interno.
È una proprietà di ogni livello e sì, è correlata alla forma dell'output (come vedremo più avanti). Nella tua foto, ad eccezione del livello di input, che è concettualmente diverso dagli altri livelli, hai:
- Livello nascosto 1: 4 unità (4 neuroni)
- Livello nascosto 2: 4 unità
- Ultimo strato: 1 unità
forme
Le forme sono conseguenze della configurazione del modello. Le forme sono tuple che rappresentano il numero di elementi di una matrice o di un tensore in ciascuna dimensione.
Es: una forma(30,4,10)
indica una matrice o un tensore con 3 dimensioni, contenente 30 elementi nella prima dimensione, 4 nella seconda e 10 nella terza, per un totale di 30 * 4 * 10 = 1200 elementi o numeri.
La forma di input
Ciò che scorre tra gli strati sono tensori. I tensori possono essere visti come matrici, con forme.
In Keras, il livello di input stesso non è un livello, ma un tensore. È il tensore iniziale che invii al primo livello nascosto. Questo tensore deve avere la stessa forma dei dati di allenamento.
Esempio: se si hanno 30 immagini di 50x50 pixel in RGB (3 canali), la forma dei dati di input è (30,50,50,3)
. Quindi il tuo tensore del livello di input deve avere questa forma (vedi i dettagli nella sezione "forme in keras").
Ogni tipo di livello richiede l'input con un certo numero di dimensioni:
Dense
i livelli richiedono input come (batch_size, input_size)
- o
(batch_size, optional,...,optional, input_size)
- I livelli convoluzionali 2D richiedono input come:
- se si utilizza
channels_last
:(batch_size, imageside1, imageside2, channels)
- se si utilizza
channels_first
:(batch_size, channels, imageside1, imageside2)
- Convoluzioni 1D e utilizzo di strati ricorrenti
(batch_size, sequence_length, features)
Ora, la forma di input è l'unica che devi definire, perché il tuo modello non può conoscerla. Solo tu lo sai, in base ai tuoi dati di allenamento.
Tutte le altre forme vengono calcolate automaticamente in base alle unità e alle particolarità di ciascun livello.
Relazione tra forme e unità: la forma di output
Data la forma di input, tutte le altre forme sono il risultato del calcolo dei livelli.
Le "unità" di ciascun livello definiranno la forma di output (la forma del tensore che viene prodotta dal layer e che sarà l'input del layer successivo).
Ogni tipo di livello funziona in un modo particolare. I livelli densi hanno una forma di output basata su "unità", i livelli convoluzionali hanno una forma di output basata su "filtri". Ma si basa sempre su alcune proprietà del livello. (Vedi la documentazione per ciò che ogni strato genera)
Mostriamo cosa succede con i livelli "Dense", che è il tipo mostrato nel grafico.
Uno strato denso ha una forma di output di (batch_size,units)
. Quindi, sì, le unità, la proprietà del livello, definisce anche la forma di output.
- Strato nascosto 1: 4 unità, figura uscita:
(batch_size,4)
.
- Strato nascosto 2: 4 unità, figura uscita:
(batch_size,4)
.
- Ultimo strato: 1 unità, figura uscita:
(batch_size,1)
.
pesi
I pesi verranno calcolati completamente automaticamente in base alle forme di input e output. Ancora una volta, ogni tipo di livello funziona in un certo modo. Ma i pesi saranno una matrice in grado di trasformare la forma di input nella forma di output mediante un'operazione matematica.
In uno strato denso, i pesi moltiplicano tutti gli input. È una matrice con una colonna per input e una riga per unità, ma questo spesso non è importante per i lavori di base.
Nell'immagine, se ogni freccia avesse un numero di moltiplicazione su di essa, tutti i numeri insieme formerebbero la matrice del peso.
Forme in Keras
In precedenza, ho fornito un esempio di 30 immagini, 50x50 pixel e 3 canali, con una forma di input di (30,50,50,3)
.
Poiché la forma di input è l'unica che devi definire, Keras la richiederà nel primo livello.
Ma in questa definizione, Keras ignora la prima dimensione, che è la dimensione del batch. Il tuo modello dovrebbe essere in grado di gestire qualsiasi dimensione batch, quindi definisci solo le altre dimensioni:
input_shape = (50,50,3)
#regardless of how many images I have, each image has this shape
Facoltativamente, o quando è richiesto da determinati tipi di modelli, è possibile passare la forma contenente la dimensione del lotto tramite batch_input_shape=(30,50,50,3)
o batch_shape=(30,50,50,3)
. Questo limita le tue possibilità di allenamento a questa dimensione unica del lotto, quindi dovrebbe essere usato solo quando veramente richiesto.
In entrambi i casi, i tensori nel modello avranno la dimensione batch.
Quindi, anche se lo hai usato input_shape=(50,50,3)
, quando keras ti invia messaggi o quando stampi il riepilogo del modello, verrà mostrato (None,50,50,3)
.
La prima dimensione è la dimensione del lotto, None
perché può variare in base al numero di esempi forniti per la formazione. (Se hai definito esplicitamente la dimensione del batch, al suo posto apparirà il numero che hai definitoNone
)
Inoltre, nelle opere avanzate, quando si opera direttamente sui tensori (all'interno dei livelli Lambda o, ad esempio, nella funzione di perdita), la dimensione della dimensione del batch sarà presente.
- Quindi, quando si definisce la forma di input, si ignora la dimensione del batch:
input_shape=(50,50,3)
- Quando si eseguono operazioni direttamente sui tensori, la forma sarà di nuovo
(30,50,50,3)
- Quando keras ti invia un messaggio, la forma sarà
(None,50,50,3)
o (30,50,50,3)
, a seconda del tipo di messaggio che ti invia.
fioco
E alla fine, cos'è dim
?
Se la forma di input ha solo una dimensione, non è necessario specificarla come tupla, ma input_dim
come numero scalare.
Quindi, nel tuo modello, in cui il livello di input ha 3 elementi, puoi usare uno di questi due:
input_shape=(3,)
- La virgola è necessaria quando hai solo una dimensione
input_dim = 3
Ma quando si tratta direttamente con i tensori, spesso si dim
farà riferimento a quante dimensioni ha un tensore. Ad esempio un tensore con forma (25,10909) ha 2 dimensioni.
Definire la tua immagine in Keras
Keras ha due modi per farlo, i Sequential
modelli o l'API funzionale Model
. Non mi piace usare il modello sequenziale, in seguito dovrete dimenticarlo comunque perché vorrete modelli con rami.
PS: qui ho ignorato altri aspetti, come le funzioni di attivazione.
Con il modello sequenziale :
from keras.models import Sequential
from keras.layers import *
model = Sequential()
#start from the first hidden layer, since the input is not actually a layer
#but inform the shape of the input, with 3 elements.
model.add(Dense(units=4,input_shape=(3,))) #hidden layer 1 with input
#further layers:
model.add(Dense(units=4)) #hidden layer 2
model.add(Dense(units=1)) #output layer
Con il modello API funzionale :
from keras.models import Model
from keras.layers import *
#Start defining the input tensor:
inpTensor = Input((3,))
#create the layers and pass them the input tensor to get the output tensor:
hidden1Out = Dense(units=4)(inpTensor)
hidden2Out = Dense(units=4)(hidden1Out)
finalOut = Dense(units=1)(hidden2Out)
#define the model's start and end points
model = Model(inpTensor,finalOut)
Forme dei tensori
Ricorda di ignorare le dimensioni dei lotti durante la definizione dei livelli:
- inpTensor:
(None,3)
- hidden1Out:
(None,4)
- hidden2Out:
(None,4)
- finalOut:
(None,1)
input_shape=
Rimane una domanda sul parametro: a quale dimensione si riferisce il primo valore dell'argomento? Vedo cose del genereinput_shape=(728, )
, quindi nella mia mente il primo argomento si riferisce alle colonne (fisse) e il secondo alle righe (libero di variare). Ma come si inserisce nell'ordine di array più importante di Python?