2017-01-16 20 views
6

Aktarım öğrenmeye çalışıyorum; Bu amaçla, sinir ağının son iki katmanını kaldırmak ve başka iki katman eklemek istiyorum. Bu aynı hatayı da veren bir örnek koddur. Ağırlık yüklendikten sonra kerasta yeni katmanlar nasıl eklenir ve kaldırılır?

from keras.models import Sequential 
from keras.layers import Input,Flatten 
from keras.layers.convolutional import Convolution2D, MaxPooling2D 
from keras.layers.core import Dropout, Activation 
from keras.layers.pooling import GlobalAveragePooling2D 
from keras.models import Model 

in_img = Input(shape=(3, 32, 32)) 
x = Convolution2D(12, 3, 3, subsample=(2, 2), border_mode='valid', name='conv1')(in_img) 
x = Activation('relu', name='relu_conv1')(x) 
x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), name='pool1')(x) 
x = Convolution2D(3, 1, 1, border_mode='valid', name='conv2')(x) 
x = Activation('relu', name='relu_conv2')(x) 
x = GlobalAveragePooling2D()(x) 
o = Activation('softmax', name='loss')(x) 
model = Model(input=in_img, output=[o]) 
model.compile(loss="categorical_crossentropy", optimizer="adam") 
#model.load_weights('model_weights.h5', by_name=True) 
model.summary() 

model.layers.pop() 
model.layers.pop() 
model.summary() 
model.add(MaxPooling2D()) 
model.add(Activation('sigmoid', name='loss')) 

Ben pop() kullanarak katmanı kaldırıldı ama onun bu hatayı

AttributeError: 'Model' object has no attribute 'add'

çıkışı eklemek çalıştığımda hatanın en olası nedeni model.add() hatalı kullanımıdır biliyorum. başka hangi sözdizimini kullanmalıyım?

DÜZENLEME: g/kaldırma keras ama onun dış ağırlıkları yerleştirdikten sonra, ilave izin vermeyerek katmanları eklemek çalıştı

.

from keras.models import Sequential 
from keras.layers import Input,Flatten 
from keras.layers.convolutional import Convolution2D, MaxPooling2D 
from keras.layers.core import Dropout, Activation 
from keras.layers.pooling import GlobalAveragePooling2D 
from keras.models import Model 
in_img = Input(shape=(3, 32, 32)) 

def gen_model(): 
    in_img = Input(shape=(3, 32, 32)) 
    x = Convolution2D(12, 3, 3, subsample=(2, 2), border_mode='valid', name='conv1')(in_img) 
    x = Activation('relu', name='relu_conv1')(x) 
    x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), name='pool1')(x) 
    x = Convolution2D(3, 1, 1, border_mode='valid', name='conv2')(x) 
    x = Activation('relu', name='relu_conv2')(x) 
    x = GlobalAveragePooling2D()(x) 
    o = Activation('softmax', name='loss')(x) 
    model = Model(input=in_img, output=[o]) 
    return model 

#parent model 
model=gen_model() 
model.compile(loss="categorical_crossentropy", optimizer="adam") 
model.summary() 

#saving model weights 
model.save('model_weights.h5') 

#loading weights to second model 
model2=gen_model() 
model2.compile(loss="categorical_crossentropy", optimizer="adam") 
model2.load_weights('model_weights.h5', by_name=True) 

model2.layers.pop() 
model2.layers.pop() 
model2.summary() 

#editing layers in the second model and saving as third model 
x = MaxPooling2D()(model2.layers[-1].output) 
o = Activation('sigmoid', name='loss')(x) 
model3 = Model(input=in_img, output=[o]) 

onun Geçen modelin output alıp yeni bir model oluşturabilir bu hatayı

RuntimeError: Graph disconnected: cannot obtain value for tensor input_4 at layer "input_4". The following previous layers were accessed without issue: [] 

cevap

11

gösteren. Alt katlar aynı kalır.

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

x = MaxPooling2D()(model.layers[-1].output) 
o = Activation('sigmoid', name='loss')(x) 

model2 = Model(input=in_img, output=[o]) 
model2.summary() 

Kontrol düzenle How to use models from keras.applications for transfer learnig?

Güncelleme: aslında önceki model oluşturma kullanılmaz küresel in_img yeni model oluşturmak için çalışıyoruz çünkü

yeni hatadır. Orada aslında bir yerel in_img tanımlıyorsunuz. Dolayısıyla, küresel in_img, sembolik grafikteki üst katmanlara açıkça bağlı değildir. Ve yükleme ağırlıkları ile ilgisi yok.

Bu sorunu daha iyi gidermek için, girdiye başvuru yapmak için model.input kullanın.

model3 = Model(input=model2.input, output=[o])

İlgili konular