python - 无法使用 ResNet50 在 Keras 中加载权重以进行微调

标签 python tensorflow deep-learning keras resnet

我首先使用以下方法在我的数据集上使用卡住的 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()

然后我尝试使用以下方法对未卡住的图层进行微调:

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

最佳答案

您的 fine_model 是一个 Model,其中包含另一个 Model(即 ResNet50)。看来问题是 save_weight()load_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)
...

关于python - 无法使用 ResNet50 在 Keras 中加载权重以进行微调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45292391/

相关文章:

deep-learning - Keras:多个大型数据集的批量训练

python - 当天第一次尝试查询失败,第二次尝试成功

python - 你如何从keras中的图像Batchdataset输出图像

java - libtensorflow_jni 和 libtensorflow_jni_gpu jar 依赖项是否互斥?

python - TensorFlow 字符串 : what they are and how to work with them

speech-recognition - 深度学习的音频功能

python - 解析时出现意外的 EOF

python - 将两个列表的相应元素合并到一个新列表

python - Keras:使用 model.train_on_batch() 和 model.fit() 获得不同的精度。可能是什么原因以及如何解决?

machine-learning - 用于机器学习的纸牌游戏建模