Spiegazione dell'input di Keras: input_shape, unità, batch_size, dim, ecc


262

Per qualsiasi livello Keras ( Layerclasse), qualcuno può spiegare come capire la differenza tra input_shape, units, dim, ecc?

Ad esempio, il documento afferma di unitsspecificare la forma di output di un livello.

Nell'immagine della rete neurale di seguito hidden layer1ha 4 unità. Questo si traduce direttamente unitsnell'attributo Layerdell'oggetto? Oppure unitsin Keras è uguale la forma di ogni peso nello strato nascosto moltiplicato per il numero di unità?

In breve, come si capiscono / visualizzano gli attributi del modello - in particolare i livelli - con l'immagine qui sotto? inserisci qui la descrizione dell'immagine

Risposte:


412

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, Noneperché 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_dimcome 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 dimfarà 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 Sequentialmodelli 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)

7
input_shape=Rimane una domanda sul parametro: a quale dimensione si riferisce il primo valore dell'argomento? Vedo cose del genere input_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?
Massima K

17
Quella virgola non crea una seconda dimensione. È solo una notazione python per creare un tupleche contiene solo un elemento. input_shape(728,)è lo stesso di batch_input=(batch_size,728). Ciò significa che ogni campione ha 728 valori.
Daniel Möller,

@ DanielMöller: potresti per favore elaborare un po 'quali sono le differenze tra "elementi di input" e "dimensioni"? Penserei che il grafico sopra avesse uno strato di input tridimensionale, rendendo così dim = 3 , quindi mi chiedo cosa mi manchi qui, perché ti vedo scrivere che l'input è monodimensionale ...
Helen

1
Un vettore ha una dimensione, ma molti elementi. Ha forma (n,) ---- Una matrice ha due dimensioni, la dimensione 0 ha m elementi, la dimensione 1 ha n elementi, sommando mxn elementi, forma (m, n). Se immagini un "cubo" diviso in piccoli cubi, ogni piccolo cubo con dati, questo sarebbe 3D, con elementi mxnxo, forma (m, n, o).
Daniel Möller,

2
@Prince, l'ordine conta. Puoi configurare Keras per usare data_format = 'channels_first'o data_format='channels_last'. Consiglio di usare sempre i canali per ultimi (impostazione predefinita di Keras). È più compatibile con tutti gli altri livelli.
Daniel Möller,

11

Dimensione input chiarita:

Non è una risposta diretta, ma ho appena realizzato che la parola Dimensione input potrebbe essere abbastanza confusa, quindi diffidare:

(Solo la parola dimensione) può riferirsi a:

a) La dimensione dei dati di input (o stream) come # N degli assi del sensore per trasmettere il segnale della serie temporale o il canale di colore RGB (3): parola suggerita => "Dimensione input stream "

b) Il numero / lunghezza totale delle funzioni di input (o livello di input) (28 x 28 = 784 per l'immagine a colori MINST) o 3000 nei valori di spettro trasformati FFT, oppure

"Input Layer / Input Feature Dimension"

c) La dimensionalità (# della dimensione) dell'input (in genere 3D come previsto in Keras LSTM) o (#RowofSamples, #of Senors, #of Values ​​..) 3 è la risposta.

"N dimensionalità dell'ingresso"

d) La forma di input SPECIFICA (ad es. (30,50,50,3) in questi dati di immagine di input da scartare, o (30, 250, 3) se Keras non da scartare :

Keras ha il suo input_dim che si riferisce alla dimensione del livello di input / numero della funzione di input

model = Sequential()
model.add(Dense(32, input_dim=784))  #or 3 in the current posted example above
model.add(Activation('relu'))

In Keras LSTM, si riferisce ai passi temporali totali

Il termine è stato molto confuso, è corretto e viviamo in un mondo molto confuso !!

Trovo che una delle sfide di Machine Learning sia quella di gestire lingue, dialetti e terminologie diverse (come se si disponga di 5-8 versioni di inglese molto diverse, quindi è necessario disporre di competenze molto elevate per conversare con diversi oratori). Probabilmente questo è lo stesso anche nei linguaggi di programmazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.