ValueError: You are trying to load a weight file containing 4 layers into a model with 0 layers.
问题: 在使用keras时报如上错误,通常是由load_model函数引起的
原因: load_model(model)中的参数model, model的层名称与model的权重中的层名称无法对应,从而导致权重无法加载到模型的层中
解决方案
通常有如下具体原因:
-
擅自修改模型的层的名称,如以下代码
def model_copy(self, model, mode=''): original_layers = [l for l in model.layers] suffix = '_copy_' + mode # 该行代码为层名加了个后缀 new_model = keras.models.clone_model(model) for index, layer in enumerate(new_model.layers): original_layer = original_layers[index] original_weights = original_layer.get_weights() # 这里使用的原始模型权重 layer.name = layer.name + suffix # 但这里的层名却被改变了 layer.set_weights(original_weights) new_model.name = new_model.name + suffix return new_model
上述new_model 一旦被实例化(new_model.save())后,加载此模型就会报上述错误,因为权重文件中的层名无法与模型中的层名对应了
解决办法
别修改层名
-
有意或无意将keras的function(函数)模型转化为sequential(序列)模型,如:
原本模型的构建方式为function结构构建
input_tensor = Input((28, 28, 1)) temp = Conv2D(4, (5, 5), padding='same')(input_tensor) temp = Activation('relu')(temp) temp = MaxPooling2D(pool_size=(2, 2))(temp) temp = Conv2D(12, (5, 5), padding='same')(temp) temp = Activation('relu')(temp) temp = MaxPooling2D(pool_size=(2, 2))(temp) temp = Flatten()(temp) output = Dense(10, activation='softmax')(temp) model = Model(input=input_tensor, outputs=output) sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
但将上述模型转成Sequential模型后,如下代码看似没问题
new_model = Sequential() for idx, layer in enumerate(model.layers): new_model.add(layer) new_model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
实则Sequential模型中没有function模型中的Input层,会导致两个模型层数不一致使得权重无法加载,并且在new_model实例化时,加载模型会报上述错误,
解决办法
为Sequential添加Input shape,正确代码如下
input_shape = K.int_shape(model.inputs[0]) # 使用K.int_shape方式为Sequential创建一个输入层,别的方式很有可能会报错,如创建一个tf中的张量,或使用model.input-shape中的input_tensor等都会报错 new_model = Sequential() for idx, layer in enumerate(model.layers): new_model.add(layer) new_model.build(input_shape=input_shape) # 对Sequential模型进行build,添加Input shape new_model.compile(optimizer='sgd', loss='categorical_crossentropy',
-
使用多块GPU训练模型时报错,链接如下(未尝试)
https://blog.youkuaiyun.com/Burt3/article/details/89290813
-
神经网络是嵌套的,有merge,如(未尝试)
merged = Merge([model_left, model_right,model_3], mode='concat') #merge model = Sequential() model.add(merged) # add merge
https://www.geek-share.com/detail/2719828987.html
错误解决方案
weight_path = ' '
model.load_weights(weight_path, by_name = True)
by_name 会使得加载的模型没有权重
原因: 如果你保存的参数中根本没有与当前模型相匹配的层,by_name = True导致的结果就是什么都没导进去