0

This is my network. I loaded weights and then fine tuned the network. the architecture remained same throughout. But when I loaded the weights after fine tuning( block5 and fc layers trainable), the order of weights in the weights values have changed so load weights is failing.

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

model_vgg16_conv = VGG16(weights='imagenet',
        include_top=False,input_shape=(200,200,3))
output_vgg16_conv = model_vgg16_conv(input_layer)
model_vgg16_conv.summary()
fl = Flatten(name='flatten')(output_vgg16_conv)
dense = Dense(512, 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)

Before fine tuning:

<HDF5 group "/image_input" (0 members)> []
<HDF5 group "/vgg16" (13 members)> [<HDF5 dataset "kernel:0": shape (3, 3, 3, 64), type "<f4">, <HDF5 dataset "bias:0": shape (64,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 64, 64), type "<f4">, <HDF5 dataset "bias:0": shape (64,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 64, 128), type "<f4">, <HDF5 dataset "bias:0": shape (128,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 128, 128), type "<f4">, <HDF5 dataset "bias:0": shape (128,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 128, 256), type "<f4">, <HDF5 dataset "bias:0": shape (256,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 256, 256), type "<f4">, <HDF5 dataset "bias:0": shape (256,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 256, 256), type "<f4">, <HDF5 dataset "bias:0": shape (256,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 256, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 512, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 512, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 512, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 512, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 512, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">]
<HDF5 group "/flatten" (0 members)> []
<HDF5 group "/fc1" (1 members)> [<HDF5 dataset "kernel:0": shape (18432, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">]
<HDF5 group "/drop" (0 members)> []
<HDF5 group "/predictions" (1 members)> [<HDF5 dataset "kernel:0": shape (512, 40), type "<f4">, <HDF5 dataset "bias:0": shape (40,), type "<f4">]

After fine tuning the weights won't load and hence the error:

<HDF5 group "/image_input" (0 members)> []
<HDF5 group "/vgg16" (13 members)> [<HDF5 dataset "kernel:0": shape (3, 3, 512, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 512, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 512, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 3, 64), type "<f4">, <HDF5 dataset "bias:0": shape (64,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 64, 64), type "<f4">, <HDF5 dataset "bias:0": shape (64,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 64, 128), type "<f4">, <HDF5 dataset "bias:0": shape (128,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 128, 128), type "<f4">, <HDF5 dataset "bias:0": shape (128,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 128, 256), type "<f4">, <HDF5 dataset "bias:0": shape (256,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 256, 256), type "<f4">, <HDF5 dataset "bias:0": shape (256,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 256, 256), type "<f4">, <HDF5 dataset "bias:0": shape (256,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 256, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 512, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">, <HDF5 dataset "kernel:0": shape (3, 3, 512, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">]
<HDF5 group "/flatten" (0 members)> []
<HDF5 group "/fc1" (1 members)> [<HDF5 dataset "kernel:0": shape (18432, 512), type "<f4">, <HDF5 dataset "bias:0": shape (512,), type "<f4">]
<HDF5 group "/drop" (0 members)> []
<HDF5 group "/predictions" (1 members)> [<HDF5 dataset "kernel:0": shape (512, 40), type "<f4">, <HDF5 dataset "bias:0": shape (40,), type "<f4">]
Traceback (most recent call last):
  File "construct_index.py", line 87, in <module>
    fine_model.load_weights(filepath)
  File "/usr/local/lib/python2.7/site-packages/keras/engine/topology.py", line 2538, in load_weights
    load_weights_from_hdf5_group(f, self.layers)
  File "/usr/local/lib/python2.7/site-packages/keras/engine/topology.py", line 2970, in load_weights_from_hdf5_group
    K.batch_set_value(weight_value_tuples)
  File "/usr/local/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 2153, in batch_set_value
    get_session().run(assign_ops, feed_dict=feed_dict)
  File "/usr/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 778, in run
    run_metadata_ptr)
  File "/usr/local/lib/python2.7/site-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 (3, 3, 512, 512) for Tensor u'Placeholder:0', which has shape '(3, 3, 3, 64)'

For some reason the order has changed!

Please help, It took so many days to train this network and I can't afford to lose these weights. Thanks

Hooli
  • 711
  • 2
  • 13
  • 24
  • Try `fine_model.load_weights(filepath, by_name=True)`? – Yu-Yang Aug 17 '17 at 05:31
  • No that doesn't work either... – Hooli Aug 17 '17 at 07:15
  • Which version of Keras are you using and how do you save the weights? I tried to create `fine_model` with your code, and `fine_model.save_weights('1.h5')` followed by `fine_model.load_weights('1.h5')` works fine. – Yu-Yang Aug 18 '17 at 18:28
  • You should ask this question in keras issues on GitHub, because it is probably a bug of the package. – pitfall Feb 16 '19 at 06:48

0 Answers0