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, None
ponieważ 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 dim
odnosi 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: Sequential
modele 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)
input_shape=
Pozostaje jedno pytanie dotyczące parametru: do którego wymiaru odnosi się pierwsza wartość argumentu? Widzę takie rzeczyinput_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?