无法使用ResNet50在Keras中加载用于微调的权重

2024-06-28 19:41:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我首先使用ResNet-50层在我的数据集上冻结,使用以下方法进行培训:

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()

然后,我尝试使用以下方法对其进行微调:

^{pr2}$

但我不知从哪里冒出这个错误。我只是解冻了网络,什么也没改变!在

  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有问题吗?在


Tags: nameinpylayerinputmodellibpackages
2条回答

以下程序通常对我有效:

  1. 将重量加载到冻结模型中。

  2. 将图层更改为可训练。

  3. 编译模型。

即在这种情况下:

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

weights = 'val54_r50.01-0.86.hdf5'
fine_model.load_weights('models/'+weights)

for layer in model_r50.layers:
    layer.trainable = True

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

你的fine_model是一个Model,里面有另一个Model(即ResNet50)。问题似乎是save_weight()和{}不能正确处理这种类型的嵌套{}。在

也许您可以尝试以一种不会导致“嵌套的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)
...

相关问题 更多 >