ValueError: You are trying to load a weight file containing 4 layers into a model with 0 layers.

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的权重中的层名称无法对应,从而导致权重无法加载到模型的层中

解决方案

通常有如下具体原因:

  1. 擅自修改模型的层的名称,如以下代码

     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())后,加载此模型就会报上述错误,因为权重文件中的层名无法与模型中的层名对应了

    解决办法

    别修改层名

  2. 有意或无意将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',
    
  3. 使用多块GPU训练模型时报错,链接如下(未尝试)

    https://blog.csdn.net/Burt3/article/details/89290813

  4. 神经网络是嵌套的,有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导致的结果就是什么都没导进去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值