PaddlePaddle Resnet50 模型训练错误:预训练参数维度不匹配和 CUDA 安装问题

本文将介绍使用 PaddlePaddle 训练 Resnet50 模型时遇到的两个常见错误:预训练参数维度不匹配和 CUDA 安装问题。并提供了解决方案和详细步骤。

错误一:预训练参数维度不匹配

错误信息:

/opt/conda/lib/python3.10/site-packages/paddle/fluid/dygraph/layers.py:1652: UserWarning: Skip loading for fc.weight. fc.weight receives a shape [2048, 1000], but the expected shape is [2048, 12].
  warnings.warn(('Skip loading for {}. '.format(key) + str(err)))
/opt/conda/lib/python3.10/site-packages/paddle/fluid/dygraph/layers.py:1652: UserWarning: Skip loading for fc.bias. fc.bias receives a shape [1000], but the expected shape is [12].

  warnings.warn(('Skip loading for {}. '.format(key) + str(err)))

原因:

Resnet50 模型的预训练参数通常是针对 ImageNet 数据集训练的,ImageNet 数据集有 1000 个类别,因此预训练模型的最后一层全连接层输出维度为 1000。而代码中设置了 num_classes=12,导致预训练参数维度与当前模型的维度不匹配。

解决方法:

  1. 修改 num_classesnum_classes=12 修改为 num_classes=1000,以匹配预训练参数的维度。

  2. 重新下载预训练参数: 下载对应 num_classes=12 的预训练参数。

错误二:CUDA 安装问题

错误信息:

ValueError: The device should not be <re.Match object; span=(0, 5), match='gpu:0'>, since PaddlePaddle is not compiled with CUDA

原因:

PaddlePaddle 未正确安装 CUDA,导致无法使用 GPU 进行训练。

解决方法:

  1. 重新安装 PaddlePaddle: 确保安装了支持 CUDA 的 PaddlePaddle 版本。

  2. 安装 CUDA 和 cuDNN: 根据您的系统和显卡型号,安装对应版本的 CUDA 和 cuDNN。

步骤:

  1. 安装 CUDA: 从 NVIDIA 官网下载并安装对应版本的 CUDA。

  2. 安装 cuDNN: 从 NVIDIA 官网下载并安装对应版本的 cuDNN。

  3. 配置环境变量: 将 CUDA 和 cuDNN 的路径添加到环境变量中。

  4. 重新安装 PaddlePaddle: 使用 pip install paddlepaddle 重新安装 PaddlePaddle。

修改后的代码

# 调用resnet50模型
paddle.vision.set_image_backend('cv2')
model = paddle.vision.models.resnet50(pretrained=True, num_classes=1000)  # 修改 num_classes

# 定义数据迭代器
train_dataloader = DataLoader(train_data, batch_size=256, shuffle=True, drop_last=False)

# 定义优化器
opt = paddle.optimizer.Adam(learning_rate=1e-4, parameters=model.parameters(), weight_decay=paddle.regularizer.L2Decay(1e-4))

# 定义损失函数
loss_fn = paddle.nn.CrossEntropyLoss()

# 设置gpu环境
paddle.set_device('gpu:0')  # 使用 GPU 0

# 整体训练流程
for epoch_id in range(15):
    model.train()
    for batch_id, data in enumerate(train_dataloader()):
        # 读取数据
        features, labels = data
        features = paddle.to_tensor(features)
        labels = paddle.to_tensor(labels)

        # 前向传播
        predicts = model(features)

        # 损失计算
        loss = loss_fn(predicts, labels)

        # 反向传播
        avg_loss = paddle.mean(loss)
        avg_loss.backward()

        # 更新
        opt.step()

        # 清零梯度
        opt.clear_grad()

        # 打印损失
        if batch_id % 2 == 0:
            print('epoch_id:{}, batch_id:{}, loss:{}'.format(epoch_id, batch_id, avg_loss.numpy()))
    model.eval()
    print('开始评估')
    i = 0
    acc = 0
    for image, label in valid_data:
        image = paddle.to_tensor([image])

        pre = list(np.array(model(image)[0]))
        max_item = max(pre)
        pre = pre.index(max_item)

        i += 1
        if pre == label:
            acc += 1
        if i % 10 == 0:
            print('精度:', acc / i)
    paddle.save(model.state_dict(), 'acc{}.model'.format(acc / i))

总结

本文介绍了使用 PaddlePaddle 训练 Resnet50 模型时遇到的两个常见错误,并提供了详细的解决方案。在使用预训练模型时,要确保模型的维度与预训练参数的维度一致。如果使用 GPU 进行训练,则需要确保 PaddlePaddle 已正确安装 CUDA。

希望本文能够帮助您解决类似问题,顺利进行模型训练。

PaddlePaddle Resnet50 模型训练错误:预训练参数维度不匹配和 CUDA 安装问题

原文地址: https://www.cveoy.top/t/topic/oHvg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录