2016-12-29 9 views
10

Chcę uzyskać wstępnie wytrenowany model VGG16 w Kerasie, usunąć jego warstwę wyjściową, a następnie umieścić nową warstwę wyjściową z liczbą klas odpowiadających mojemu problemowi, a następnie dopasować ją do nowych danych. Z tego powodu próbuję użyć tego modelu: https://keras.io/applications/#vgg16, ale ponieważ nie jest sekwencyjny, nie mogę po prostu model.pop(). Wyskakiwanie z warstw i dodawanie go również nie działa, ponieważ w przewidywaniach wciąż oczekuje starego kształtu. Jak to zrobić? Czy istnieje sposób przekonwertowania tego typu modelu na Sequential?Jak używać modeli z keras.applications do nauki transferu?

Odpowiedz

26

Można użyć pop() na model.layers, a następnie użyć model.layers[-1].output do tworzenia nowych warstw.

Przykład:

from keras.models import Model 
from keras.layers import Dense,Flatten 
from keras.applications import vgg16 
from keras import backend as K 

model = vgg16.VGG16(weights='imagenet', include_top=True) 

model.input 

model.summary(line_length=150) 

model.layers.pop() 
model.layers.pop() 

model.summary(line_length=150) 

new_layer = Dense(10, activation='softmax', name='my_dense') 

inp = model.input 
out = new_layer(model.layers[-1].output) 

model2 = Model(inp, out) 
model2.summary(line_length=150) 

Alternatywnie, można użyć include_top=False opcję z tych modeli. W takim przypadku, jeśli chcesz użyć spłaszczenia warstwy, musisz również podać wartość input_shape.

model3 = vgg16.VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) 
model3.summary(line_length=150) 

flatten = Flatten() 
new_layer2 = Dense(10, activation='softmax', name='my_dense_2') 

inp2 = model3.input 
out2 = new_layer2(flatten(model3.output)) 

model4 = Model(inp2, out2) 
model4.summary(line_length=150) 
+2

To jest bardzo ważne! Rozwiązuje mój problem, z którym walczę od wielu godzin! Dziękuję Ci ! – user40780

+0

Niewiarygodnie przydatne. Powinno to być w oficjalnej dokumentacji Keras. –

Powiązane problemy