2017-07-25 59 views
2

我第一次使用凍結在我的數據集ResNet50層訓練有素以下:無法加載微調權重Keras與ResNet50

model_r50 = ResNet50(weights='imagenet', include_top=False) 
model_r50.summary() 

input_layer = Input(shape=(img_width,img_height,3),name = 'image_input') 

output_r50 = model_r50(input_layer) 

fl = Flatten(name='flatten')(output_r50) 
dense = Dense(1024, activation='relu', name='fc1')(fl) 
drop = Dropout(0.5, name='drop')(dense) 
pred = Dense(nb_classes, activation='softmax', name='predictions')(drop) 
fine_model = Model(outputs=pred,inputs=input_layer) 
for layer in model_r50.layers: 
    layer.trainable = False 
    print layer 

fine_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) 
fine_model.summary() 

然後我嘗試微調其與層使用解凍如下:

model_r50 = ResNet50(weights='imagenet', include_top=False) 
model_r50.summary() 

input_layer = Input(shape=(img_width,img_height,3),name = 'image_input') 

output_r50 = model_r50(input_layer) 

fl = Flatten(name='flatten')(output_r50) 
dense = Dense(1024, activation='relu', name='fc1')(fl) 
drop = Dropout(0.5, name='drop')(dense) 
pred = Dense(nb_classes, activation='softmax', name='predictions')(drop) 
fine_model = Model(outputs=pred,inputs=input_layer) 
weights = 'val54_r50.01-0.86.hdf5' 
fine_model.load_weights('models/'+weights) 
fine_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) 
fine_model.summary() 

但我從這個地方得到這個錯誤。我只是解凍網絡,並沒有改變任何東西!

load_weights_from_hdf5_group(f, self.layers) 
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/topology.py", line 3008, in load_weights_from_hdf5_group 
    K.batch_set_value(weight_value_tuples) 
    File "/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.py", line 2189, in batch_set_value 
    get_session().run(assign_ops, feed_dict=feed_dict) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 778, in run 
    run_metadata_ptr) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 961, in _run 
    % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape()))) 
ValueError: Cannot feed value of shape (128,) for Tensor u'Placeholder_140:0', which has shape '(512,)' 

而且不一致。大部分時間我都會有不同的形狀。這是爲什麼發生?如果我只是將ResNet更改爲VGG19,則不會發生這種情況。 Keras中的ResNet有問題嗎?

回答

2

你的fine_modelModel與其中的另一個Model(即ResNet50)。看來問題是save_weight()load_weight()無法正確處理這種類型的嵌套Model

也許你可以嘗試以不會導致「嵌套Model」的方式構建模型。例如,

input_layer = Input(shape=(img_width, img_height, 3), name='image_input') 
model_r50 = ResNet50(weights='imagenet', include_top=False, input_tensor=input_layer) 
output_r50 = model_r50.output 
fl = Flatten(name='flatten')(output_r50) 
... 
+0

感謝您的回答。我正在嘗試這種方法,並等待看它是否有效! – Hooli