2017-01-22 10 views
5

Używam Keras zrobić kilka eksperymentów, a ja po prostu monitorować aktualizację masy prostego młp modeluCo zwróci "layer.get_weights()"?

# model contains one input layer in the format of dense, 
# one hidden layer and one output layer. 
model=mlp() 
weight_origin=model.layers[0].get_weights()[0] 
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
model.fit(.....) # with adam optimizer 
weight_updated=model.layers[0].get_weights()[0] 
print weight_origin-weight_updated 

dla pierwszej warstwy gęstej, mam macierz zer. Myślałem, że trening nie zmienia tej wagi. Jednak wagi w innych warstwach są zmieniane. Więc jestem zdezorientowany, dlaczego pierwsza warstwa pozostaje niezmieniona? Sprawdziłem kod źródłowy, ale jeszcze nie otrzymał odpowiedzi, a następnie próbowałem monitorowanie:

model.layers[0].get_weights()[1] # get_weight() returns a list of weights 

Tym razem ciężary uległ zmianie. Więc zastanawiam się, która waga jest "prawdziwą" wagą, która działa podczas treningu? Dlaczego na liście wag znajdują się dwa elementy?


Definicja mlp():

def mlp(): 
    model=Sequential() 
    model.add(Dense(500, input_dim=784)) 
    model.add(Dense(503,init='normal',activation='relu')) 
    model.add(Dense(503,init='normal',activation='relu')) 
    model.add(Dense(10, activation='softmax')) 
    return model 
+1

Czy możesz podać nam funkcję mlp()? To naprawdę dziwne zachowanie. –

+0

@ MarcinMożejko Zaktualizowałem to. Jestem zdezorientowany na drugiej wadze na liście 'layer.weights'. –

+0

Czy skompilowałeś swój model? –

Odpowiedz

3

Do kwestii layer.get_weights():

Pobiegłem jakieś badania na ten temat i sprawdzone kody źródłowe. Okazało się, że warstwa Dense to podklasa Layer i jego wag, co jest rodzajem pytona list ma dwa elementy masy warstwy przechowywano w layer.get_weights()[0] i bias przechowywano w layer.get_weights()[1].

Jest jedna rzecz, aby pamiętać, że bias można wyłączyć podczas definiowania warstwy: model.add(Dense(503,init='normal',activation='relu',bias=False)). W takim przypadku lista layer.get_weights() zawiera tylko jeden element. Jeśli ustawisz atrybut bias jako False po jego zdefiniowaniu, nadal będzie istnieć element dla bias i będzie on aktualizowany po dopasowaniu modelu.

Do kwestii nie aktualizowanie:

założyłem Sequential modelu tylko z jednym gęstej warstwy:

def mlp_2(): model=Sequential() model.add(Dense(10, input_dim=784, activation='softmax', bias =False)) return model

Potem wykorzystać tę samą drogę powyżej skompilować i dopasuj to. To jest to, co mam:

enter image description here

Nadal nie wydaje się aktualizować na wadze, jednak możemy powiedzieć waga jest zdecydowanie zmieniło. Ponieważ dokładność rośnie. Myślę, że jedynym wyjaśnieniem jest to, że aktualizacje na pierwszej warstwie dense (która zdefiniowałeś jako input_dim) są zbyt małe, aby Keras mógł wydrukować. Nie sprawdzałem dokładniejszej wartości wag, byłoby świetnie, gdyby ktoś mógł to zrozumieć.

Powiązane problemy