图像分类:ResNet18+CIFAR-10数据集

一、安装anaconda和pycharm【Windows】

主要参考两篇(两篇都很详细,我就不列出具体步骤了):
1.Anaconda安装-超详细版(2023)
2.PyCharm安装教程及基本使用(更新至2024年新版本),教你迈出学习python第一步

二、anaconda+pycharm

参考这篇:Anaconda+PyCharm创建环境及配置环境

注意的点:👇👇👇

1.conda创建虚拟环境时,报错InvalidArchiveError

①清理缓存法:conda clean --all【未解决】
②更改权限(不是Linux),参考这篇:改pkgs文件属性【解决】
寻找解决过程中,看到有说系统用户名是中文也可能造成这种问题,而我自己的用户名就是中文,后来去搜索了更改用户名的方法,但是卡在了注销后,去文件夹更改名字那步,显示【文件夹已打开】,这里网上教的方法是:打开资源监视器,搜索句柄【用户名】并结束进程,但我搜出来一大堆,有些甚至都结束不了,我想我应该理解有问题,于是没再继续试了。

2.创建的虚拟环境在C盘,不在anaconda安装目录下的env中。

可以在输入conda create -n demo_env python=3.9后,[y/N]选择之前就看看环境计划装在哪里,如图所示(下图是改好后的)。
在这里插入图片描述
⭐解决参考这篇:windows下安装虚拟环境保存在C盘之解决方案
我简要列出步骤:
①在C盘user(用户)/xxx(用户名)下找到 .condarc 文件打开,添加:

envs_dirs:
  - D:\anaconda\install\envs(根据自己真实情况修改)

这篇文章里添加的不止这个,但我按他的来的话,会报错编码问题,因为我的路径中有中文,所以我只好删掉了,不过不影响。
②如果按照我上面提供的安装anaconda教程来的话,在安装时选的应该是all users而不是just me,所以就要按这篇解决教程中提供的方法走:右击更改envs属性,添加权限。

3.pycharm创建项目时,如果看到conda no found之类的提示

⭐可参考这篇:Conda executable is not found解决方法

三、ResNet复现

1.第一次尝试

⭐【直接去GitHub下载了源码,里面东西很多,想跑通它对于小白的我有点难度,如下所示,我最终差不多就停在了安装依赖后,后面要训练数据集,有些太大我电脑带不起来,后来师姐帮我看了一下,但问题太多还是没用成功,于是暂时放弃这个了,前面步骤在下面写了,大家可以参考一下。】

GitHub: https://github.com/pytorch/vision
Git安装: 参考Git安装详解(写吐了,看完不后悔)
把git安装好后,pycharm终端用git仍然报错,网上搜了一堆觉得自己配置什么的都合适啊——最终重启电脑解决了。
安装依赖(两种,我都来了一遍):
①进入docs目录下:pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
②回到vision-main目录下:pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple

2.后续未成功尝试中的部分问题记录

①Failed to initialize NumPy: DLL load failed while importing _multiarray_umath: 找不到指定的模块。
翻译: 用户警告:初始化NumPy失败:在导入_multiarray_umath时DLL加载失败:找不到指定的模块。
问题背景: conda的虚拟环境,按照setup.py或者requirements.txt安装了所有的依赖包,在python解释器下运行“import torch”显示的错误。
解决!看看就好,先不要直接照做】:大体思路是,更新或者重装numpy包。
因为我记不太清刚开始遇到这问题时,是更新numpy还是了重装numpy,反正最后warning“无效分发”还是“已安装numpy”的问题,可能是因为在site-packages目录中有一个损坏或不完整的NumPy分发,所以我去anaconda目录下找到虚拟环境中的\lib\site-packages,手动删掉里面之前的numpy包,然后再重装numpy。

②torch.hub.load从PyTorch Hub加载预训练模型时,模型文件会被下载到本地,默认情况下,这些文件会被保存在PyTorch的缓存目录中。在大多数系统中,这个缓存目录位于用户的主目录下的一个隐藏文件夹内,通常在C盘,具体路径可能因操作系统和PyTorch版本而异。
在Windows系统中,PyTorch缓存目录通常位于:C:\Users<username>.cache\torch\hub
这条更改PyTorch缓存目录:set TORCH_HOME=新路径
对我没用😭😭😭

3.一切从简,成功跑通

写在前面:
①我电脑内存所剩不多,C、D盘都已爆红,所以我不太能够用比较大的数据集去跑代码,而我这次任务的主要目的是学习resnet,所以不需要对数据集有多高的要求,最终我选择了较小的CIFAR-10数据集。
②我从前只是稍微了解过深度学习,但想基本看懂代码有点困难(没学过python),我不太清楚完整项目(比如从网上下载的resnet完整源码)里各个文件的用处,在短时间内我也很难吃透,所以我就改变了思路,一个一个地往我自己的空项目里加文件,每加上去的一个文件我都要知道它的用途。

正式开始啦!
我一共有四个.py文件:
①train.py和②resnet.py参考的这篇:
(Pytorch)ResNet代码复现CIFAR-10数据集
③test.py是让AI根据train和resnet写出来的(它应该也是参考借鉴现有的)。

👉train.py我把epoch改成了25(原本是300),我是CPU,训练得太慢了。

问题记录:
(1)FutureWarning:警告正在使用torch.load函数加载模型权重时没有设置weights_only=True。这个参数的作用是告诉PyTorch在加载权重时只期待模型权重,而不是完整的模型对象。这有助于提高安全性,因为默认的 pickle 模块可能会执行不安全的代码。未来版本的PyTorch将默认设置weights_only=True。
⭐解决:在遇到使用torch.load函数时,就设置成(括号里在后面加上就行)weights_only=True
(2)RuntimeError:在尝试将权重加载到ResNet模型时,state_dict中缺少了一些关键,并且出现了一些意外的键。这通常意味着保存的权重文件与模型结构不匹配,或者权重文件包含了额外的信息(如优化器状态和训练epoch),这些信息不是模型权重。
⭐解决:(本来想说下解决问题的心路历程,还是算了不说太多废话)
首先,从train.py代码中能够得知,我们的权重文件ResNet.pth的确包含有三个信息:
在这里插入图片描述
而我们现在只要model_state_dict,就需要把它提取出来,于是就有了我的第四个.py文件:tiqu.py(其实这个也可以不单独整出来)

import torch

# 加载检查点文件
checkpoint = torch.load('ResNet.pth', map_location='cpu')
# 提取模型权重
model_weights = checkpoint['model_state_dict']
# 保存仅包含权重的新文件
torch.save(model_weights, 'ResNet_weights.pth')

这样ResNet_weights.pth权重文件中就只有model_state_dict了。
然后再把之前test.py中的权重文件由ResNet.pth→ResNet_weights.pth就行啦!

终端输入:tensorboard --logdir=logs(这个是日志目录,我的是logs) --port=6006
获得TensorBoard的默认地址,打开即可看到记录的数据。

test.py:

import sys

import torch
import torchvision.transforms as transforms
from torchvision.datasets import CIFAR10
from torch.utils.data import DataLoader
from tqdm import tqdm

# 确保 resnet.py 文件中的 ResNet18 类被正确导入
from resnet import ResNet18
from train import writer

# 定义是否使用GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 加载训练好的模型权重
model = ResNet18().to(device)
model.load_state_dict(torch.load('ResNet_weights.pth', map_location=device,weights_only=True))
model.eval()  # 设置为评估模式

# 准备测试数据集并预处理
transform_test = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
])

test_dataset = CIFAR10(root='./data', train=False, download=True, transform=transform_test)
test_loader = DataLoader(test_dataset, batch_size=100, shuffle=False, num_workers=0)
test_num = len(test_dataset)
test_steps = len(test_loader)

# 测试模型
correct = 0
total = 0
with torch.no_grad():  # 不计算梯度,节省内存和计算资源
    test_bar = tqdm(test_loader, file=sys.stdout)
    for data in test_bar:
        images, labels = data
        images, labels = images.to(device), labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

test_accurate = correct / total
print(f'测试集准确率: {test_accurate:.3f}')

# 如果你想要使用 TensorBoard 来记录测试结果,可以取消注释以下代码
writer.add_scalars('acc', {'test': test_accurate}, global_step=0)
writer.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值