Objaśnienie danych wejściowych Keras: input_shape, jednostki, batch_size, dim itp

261

Dla każdej warstwy Keras ( Layerklasy), może ktoś wyjaśnić jak należy rozumieć różnicę między input_shape, units, dim, itd.?

Na przykład dokument mówi, że unitsokreśl wyjściowy kształt warstwy.

Na zdjęciu sieci neuronowej poniżej hidden layer1ma 4 jednostki. Czy to bezpośrednio przekłada się na unitsatrybut Layerobiektu? Czy unitsw Keras jest równy kształtowi każdej masy w ukrytej warstwie razy liczba jednostek?

Krótko mówiąc, w jaki sposób rozumie się / wizualizuje atrybuty modelu - w szczególności warstw - za pomocą poniższego obrazu? wprowadź opis zdjęcia tutaj

strach na wróble
źródło

Odpowiedzi:

412

Jednostki:

Ilość „neuronów” lub „komórek”, lub cokolwiek ma w sobie warstwa.

Jest to właściwość każdej warstwy i tak, jest związana z kształtem wyjściowym (jak zobaczymy później). Na twoim zdjęciu, z wyjątkiem warstwy wejściowej, która różni się koncepcyjnie od innych warstw, masz:

  • Ukryta warstwa 1: 4 jednostki (4 neurony)
  • Ukryta warstwa 2: 4 jednostki
  • Ostatnia warstwa: 1 jednostka

Kształty

Kształty są konsekwencjami konfiguracji modelu. Kształty to krotki reprezentujące liczbę elementów macierzy lub tensora w każdym wymiarze.

Np .: kształt(30,4,10) oznacza tablicę lub tensor o 3 wymiarach, zawierający 30 elementów w pierwszym wymiarze, 4 w drugim i 10 w trzecim, w sumie 30 * 4 * 10 = 1200 elementów lub liczb.

Kształt wejściowy

To, co przepływa między warstwami, to tensory. Tensory można postrzegać jako matryce o kształtach.

W Keras sama warstwa wejściowa nie jest warstwą, ale tensorem. Jest to tensor początkowy, który wysyłasz na pierwszą ukrytą warstwę. Ten tensor musi mieć ten sam kształt co dane treningowe.

Przykład: jeśli masz 30 obrazów o wymiarach 50 x 50 pikseli w RGB (3 kanały), kształt danych wejściowych jest następujący (30,50,50,3). Następnie tensor warstwy wejściowej musi mieć ten kształt (patrz szczegóły w sekcji „kształty w keras”).

Każdy typ warstwy wymaga danych wejściowych o określonej liczbie wymiarów:

  • Dense warstwy wymagają danych wejściowych jak (batch_size, input_size)
    • lub (batch_size, optional,...,optional, input_size)
  • Warstwy splotowe 2D wymagają danych wejściowych, ponieważ:
    • jeśli używasz channels_last:(batch_size, imageside1, imageside2, channels)
    • jeśli używasz channels_first:(batch_size, channels, imageside1, imageside2)
  • Zastosowanie zwojów 1D i warstw rekurencyjnych (batch_size, sequence_length, features)

Teraz kształt wejściowy jest jedynym, który musisz zdefiniować, ponieważ Twój model go nie zna. Tylko Ty wiesz o tym na podstawie danych treningowych.

Wszystkie pozostałe kształty są obliczane automatycznie na podstawie jednostek i szczegółów każdej warstwy.

Relacja między kształtami a jednostkami - Kształt wyjściowy

Biorąc pod uwagę kształt wejściowy, wszystkie inne kształty są wynikiem obliczeń warstw.

„Jednostki” każdej warstwy określą kształt wyjściowy (kształt tensora wytwarzanego przez warstwę, który będzie wejściem następnej warstwy).

Każdy typ warstwy działa w określony sposób. Warstwy gęste mają kształt wyjściowy oparty na „jednostkach”, warstwy splotowe mają kształt wyjściowy oparty na „filtrach”. Ale zawsze opiera się na jakiejś właściwości warstwy. (Zobacz dokumentację, aby uzyskać informacje o wynikach poszczególnych warstw)

Pokażmy, co dzieje się z warstwami „zwartymi”, czyli typem pokazanym na wykresie.

Gęsta warstwa ma kształt wyjściowy wynoszący (batch_size,units). Tak więc jednostki, właściwość warstwy, również definiują kształt wyjściowy.

  • Ukrytej warstwie 1: 4 urządzenia, kształt wyjściowy: (batch_size,4).
  • Ukryta warstwa 2: 4 jednostki, kształt wyjściowy: (batch_size,4) .
  • Ostatnia warstwa: 1 jednostka, kształt wyjściowy: (batch_size,1).

Ciężary

Wagi będą obliczane całkowicie automatycznie na podstawie kształtów wejściowych i wyjściowych. Ponownie, każdy rodzaj warstwy działa w określony sposób. Ale wagi będą matrycą zdolną do przekształcenia kształtu wejściowego w kształt wyjściowy za pomocą pewnych operacji matematycznych.

W gęstej warstwie wagi mnożą wszystkie dane wejściowe. Jest to macierz z jedną kolumną na wejście i jednym rzędem na jednostkę, ale często nie jest to ważne w przypadku podstawowych prac.

Na zdjęciu, jeśli każda strzała ma na sobie liczbę mnożenia, wszystkie liczby razem tworzą macierz ciężaru.

Kształty w Keras

Wcześniej podałem przykład 30 obrazów, 50 x 50 pikseli i 3 kanały o kształcie wejściowym (30,50,50,3).

Ponieważ kształt wejściowy jest jedynym, który musisz zdefiniować, Keras zażąda go w pierwszej warstwie.

Ale w tej definicji Keras ignoruje pierwszy wymiar, który jest rozmiarem partii. Twój model powinien być w stanie poradzić sobie z dowolnym rozmiarem partii, więc definiujesz tylko inne wymiary:

input_shape = (50,50,3)
    #regardless of how many images I have, each image has this shape        

Opcjonalnie lub jeśli jest to wymagane w przypadku niektórych rodzajów modeli, możesz przekazać kształt zawierający rozmiar partii za pomocą batch_input_shape=(30,50,50,3)lub batch_shape=(30,50,50,3). Ogranicza to możliwości treningowe do tej unikalnej wielkości partii, dlatego należy go stosować tylko wtedy, gdy jest to naprawdę wymagane.

Tak czy inaczej, tensory w modelu będą miały wymiar wsadowy.

Tak więc, nawet jeśli użyłeś input_shape=(50,50,3), kiedy keras wysyła ci wiadomości lub kiedy drukujesz podsumowanie modelu, pokaże się (None,50,50,3).

Pierwszy wymiar to wielkość partii, Noneponieważ może się różnić w zależności od liczby przykładów podanych do szkolenia. (Jeśli jawnie zdefiniowałeś rozmiar partii, zamiast tego pojawi się zdefiniowana liczba None)

Również w pracach zaawansowanych, gdy faktycznie operujesz bezpośrednio na tensorach (na przykład w warstwach Lambda lub w funkcji straty), będzie tam wymiar wielkości partii.

  • Definiując kształt wejściowy, ignorujesz rozmiar partii: input_shape=(50,50,3)
  • Podczas wykonywania operacji bezpośrednio na tensorach kształt ponownie się pojawi (30,50,50,3)
  • Gdy keras wyśle ​​Ci wiadomość, kształt będzie (None,50,50,3)lub (30,50,50,3), w zależności od rodzaju wiadomości, którą Ci wyśle.

Ciemny

I w końcu co to jest dim?

Jeśli twój kształt wejściowy ma tylko jeden wymiar, nie musisz podawać go jako krotki, dajesz input_dim jako liczbę skalarną.

W modelu, w którym warstwa wejściowa ma 3 elementy, możesz użyć dowolnego z tych dwóch:

  • input_shape=(3,) - Przecinek jest konieczny, gdy masz tylko jeden wymiar
  • input_dim = 3

Ale w bezpośrednim kontakcie z tensorami często dimodnosi się do tego, ile wymiarów ma tensor. Na przykład tensor o kształcie (25, 10909) ma 2 wymiary.


Definiowanie obrazu w Keras

Keras ma na to dwa sposoby: Sequentialmodele lub funkcjonalny interfejs API Model. Nie lubię używać modelu sekwencyjnego, później i tak będziesz musiał o nim zapomnieć, ponieważ będziesz chciał modeli z rozgałęzieniami.

PS: tutaj zignorowałem inne aspekty, takie jak funkcje aktywacyjne.

Z modelem sekwencyjnym :

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   

Z funkcjonalnym modelem API :

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)

Kształty tensorów

Pamiętaj, że ignorujesz rozmiary partii podczas definiowania warstw:

  • inpTensor: (None,3)
  • hidden1Out: (None,4)
  • hidden2Out: (None,4)
  • finalOut: (None,1)
Daniel Möller
źródło
7
input_shape=Pozostaje jedno pytanie dotyczące parametru: do którego wymiaru odnosi się pierwsza wartość argumentu? Widzę takie rzeczy input_shape=(728, ), więc moim zdaniem pierwszy argument odnosi się do kolumn (naprawiony), a drugi do wierszy (swobodny do zmiany). Ale jak to się dzieje z kolejnością głównych tablic Pythona?
Maxim.K
17
Ten przecinek nie tworzy drugiego wymiaru. To tylko notacja pythonowa do tworzenia, tuplektóra zawiera tylko jeden element. input_shape(728,)jest taki sam jak batch_input=(batch_size,728). Oznacza to, że każda próbka ma 728 wartości.
Daniel Möller,
@ DanielMöller: czy mógłbyś trochę wyjaśnić, jaka jest różnica między „elementami wejściowymi” a „wymiarami”? Wydaje mi się, że powyższy wykres ma trójwymiarową warstwę wejściową, co powoduje, że dim = 3 , więc zastanawiam się, czego tu brakuje, ponieważ widzę, że piszesz, że dane wejściowe są jednowymiarowe ...
Helen
1
Wektor ma jeden wymiar, ale wiele elementów. Ma kształt (n,) ---- Macierz ma dwa wymiary, wymiar 0 ma m elementów, wymiar 1 ma n elementów, sumując elementy mxn, kształt (m, n). Jeśli wyobrażasz sobie „sześcian” podzielony na małe kostki, każda mała kostka z danymi, byłaby to 3D, z elementami mxnxo, kształtem (m, n, o).
Daniel Möller
2
@ Prince, kolejność ma znaczenie. Możesz skonfigurować Keras do używania data_format = 'channels_first'lub data_format='channels_last'. Zalecam używanie zawsze kanałów jako ostatnich (ustawienie domyślne Keras). Jest bardziej kompatybilny ze wszystkimi innymi warstwami.
Daniel Möller
11

Wyjaśniono wymiar wejściowy:

Nie jest to bezpośrednia odpowiedź, ale właśnie zdałem sobie sprawę, że słowo Input Dimension może być dość mylące, więc bądź ostrożny:

To (sam wymiar słowa) może odnosić się do:

a) Wymiar danych wejściowych (lub strumienia), takich jak # N osi czujnika w celu przesłania sygnału szeregu czasowego lub kanał kolorów RGB (3): sugerowane słowo => „InputStream Dimension”

b) Łączna liczba / długość cech wejściowych (lub warstwy wejściowej) (28 x 28 = 784 dla kolorowego obrazu MINST) lub 3000 w wartościach przekształconych przez FFT, lub

„Warstwa wejściowa / wymiar cechy wejściowej”

c) wymiarowości (# wymiaru) od wejścia (zwykle 3D, jak oczekiwano w Keras LSTM) lub (#RowofSamples, liczby Senors, liczby wartości ..) 3 jest odpowiedź.

„N Wymiarowość danych wejściowych”

d) SPECYFICZNY Kształt wejściowy (np. (30,50,50,3) w tych nieopakowanych danych wejściowych obrazu lub (30, 250, 3), jeśli nieopakowane Keras:

Keras ma swój parametr input_dim odnosi się do wymiaru warstwy wejściowej / liczby funkcji wejściowych

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

W Keras LSTM odnosi się do łącznych kroków czasu

Termin był bardzo mylący, jest poprawny i żyjemy w bardzo zagmatwanym świecie !!

Uważam, że jednym z wyzwań w uczeniu maszynowym jest radzenie sobie z różnymi językami, dialektami i terminologiami (np. Jeśli masz 5-8 bardzo różnych wersji języka angielskiego, musisz bardzo biegle rozmawiać z różnymi użytkownikami). Prawdopodobnie tak samo jest również w językach programowania.

r poon
źródło