2016-12-29 16 views
10

Keras'ta önceden hazırlanmış VGG16 modeli almak, çıktı katmanını kaldırmak ve daha sonra yeni bir çıktı katmanını benim problemim için uygun olan sınıf sayısı ile birlikte koymak ve daha sonra yeni verilere sığdırmak istiyorum. Bu nedenle, bu modeli burada kullanmaya çalışıyorum: https://keras.io/applications/#vgg16, ancak Sıralı olmadığından, yalnızca model.pop() yapılamıyor. Katmanlardan atmak ve eklemek de işe yaramıyor, çünkü tahminlerde eski şekli bekliyor. Bunu nasıl yaparım? Bu tür bir modeli Sequential'a dönüştürmenin bir yolu var mı?Transfer öğrenimi için keras.applications'dan modeller nasıl kullanılır?

cevap

26

pop()'u model.layers üzerinde kullanabilir ve yeni katmanlar oluşturmak için model.layers[-1].output kullanabilirsiniz.

Örnek:

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) 

Alternatif olarak, bu modellerin include_top=False seçeneğini kullanabilirsiniz. Bu durumda tabakayı düzleştirmeniz gerekiyorsa, input_shape'u da geçmeniz gerekir.

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

Bu çok önemlidir! Saatlerce uğraştığım problemimi çözüyorum! Teşekkür ederim ! – user40780

+0

İnanılmaz derecede faydalı. Bu resmi Keras belgelerinde olmalıdır. –

İlgili konular