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

阅读: 评论:0

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.

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 = dels.clone_model(model)for index, layer in enumerate(new_model.layers):original_layer = original_layers[index]original_weights = _weights() # 这里使用的原始模型权重layer.name = layer.name + suffix # 但这里的层名却被改变了layer.set_weights(original_weights)new_model.name = new_model.name + suffixreturn 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)
    modelpile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
    

    但将上述模型转成Sequential模型后,如下代码看似没问题

    new_model = Sequential()
    for idx, layer in enumerate(model.layers):new_model.add(layer)
    new_modelpile(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_modelpile(optimizer='sgd',loss='categorical_crossentropy',
    
  3. 使用多块GPU训练模型时报错,链接如下(未尝试)

  4. 神经网络是嵌套的,有merge,如(未尝试)

    merged = Merge([model_left, model_right,model_3], mode='concat') #merge  
    model = Sequential()  
    model.add(merged) # add merge 
    

    .html

错误解决方案

weight_path = ' '
model.load_weights(weight_path, by_name = True)

by_name 会使得加载的模型没有权重

原因: 如果你保存的参数中根本没有与当前模型相匹配的层,by_name = True导致的结果就是什么都没导进去

本文发布于:2024-02-02 00:39:54,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170681093140269.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:weight   load   ValueError   model   layers
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23