无法给变量赋值=变量形状(1,1,256,512)和赋值的值形状(512,128,1,1)不兼容

问题描述 投票:0回答:1

我的 resnet 模型有问题,我尝试使用它来创建和训练自定义人脸识别模型,如下所示,但我收到错误,我可以在其中获得帮助吗?我将同时输入代码和错误

def resnet50tl(input_shape, outclass, sigma='sigmoid'):
    
    base_model = None
    base_model = keras.applications.resnet50.ResNet50(weights='imagenet', include_top=False, input_shape=input_shape)
    base_model.load_weights(resnet50weight)
    
    for layer in base_model.layers:
        layer.trainable = False
    
    top_model = Sequential()
    top_model.add(Flatten(input_shape=base_model.output_shape[1:]))
    for i in range(2):
        top_model.add(Dense(4096, activation='relu'))
        top_model.add(Dropout(0.5))
    top_model.add(Dense(outclass, activation=sigma))

   
    model = Model(inputs=base_model.input, outputs=top_model(base_model.output))
    if resnet50weight is not None:
        # Load the weights with by_name=True, and using specific weight names
        model.load_weights(resnet50weight, by_name=True,
                           skip_mismatch=True, reshape=True)

    return model
input_shape = (224, 224, 3)  # Change this to your input image shape
numclasses = 6 
model = resnet50tl(input_shape, numclasses, 'softmax')
lr = 1e-5
decay = 1e-7 #0.0
optimizer = RMSprop(lr=lr, decay=decay)
model.compile(loss='categorical_crossentropy',
              optimizer=optimizer,
              metrics=['accuracy'])

错误如下:

File "c:\Users\mahmo\Downloads\test\VGG model.py", line 109, in <module>
        model = resnet50tl(input_shape, numclasses, 'softmax')
      File "c:\Users\mahmo\Downloads\test\VGG model.py", line 87, in resnet50tl
        base_model.load_weights(resnet50weight)
      File "C:\Users\mahmo\AppData\Local\Programs\Python\Python310\lib\site-packages\keras\src\utils\traceback_utils.py", line 70, in error_handler
        raise e.with_traceback(filtered_tb) from None
      File "C:\Users\mahmo\AppData\Local\Programs\Python\Python310\lib\site-packages\keras\src\backend.py", line 4361, in _assign_value_to_variable
        variable.assign(value)
    ValueError: Cannot assign value to variable ' conv3_block1_0_conv/kernel:0': Shape mismatch.The variable shape (1, 1, 256, 512), and the assigned value shape (512, 128, 1, 1) are incompatible

我试图遵循此代码并测试它:https://www.kaggle.com/code/iljoong/celebrity-face-classification-using-keras/notebook

python tensorflow keras deep-learning resnet
1个回答
0
投票

错误消息表明,将预训练权重加载到 base_model 时,存在形状不匹配。加载的权重张量的形状与模型中相应张量的形状不匹配。

ValueError
抱怨名为
'conv3_block1_0_conv'
的图层,其中变量形状为 (1, 1, 256, 512),但加载的权重形状为 (512, 128, 1, 1)。

如果您创建的模型的架构与最初保存权重的模型的架构不匹配,则可能会出现这种差异。

发生错误的代码行是:

base_model.load_weights(resnet50weight)

这里,

resnet50weight
应该是经过训练的
ResNet50
模型的权重路径。但是,您尝试加载的权重似乎与您定义的
ResNet50
模型的结构不对应。

以下是一些可能的解决方案:

确保

resnet50weight
ResNet50
模型权重的正确路径。

确保权重文件未损坏或不完整。

如果您使用的是

ResNet50
的修改版本,请确保您尝试加载的权重与该特定架构相对应。

如果您不确定保存权重的模型的架构,您可能需要从头开始训练模型或使用您确定与模型架构匹配的权重。

还值得注意的是,在您的代码中,您加载权重两次:一次在

ResNet50
构造函数中,另一次在 load_weights 中。如果您使用
'imagenet'
中的预训练权重,则只需在
weights='imagenet'
构造函数中指定
ResNet50
即可。再次加载权重可能会导致您的问题,特别是如果
resnet50weight
不是与
ResNet50
模型对应的权重路径。

© www.soinside.com 2019 - 2024. All rights reserved.