一. 项目文件的组织结构
Checkpoints文件夹:用于保存训练好的模型
Data文件夹
__init__.py
Dataset.py 该文件完成图片数据集的加载和初始规范化处理的工作
Models文件夹
__init__.py
BasicModule.py文件用于完成模型加载和保存的工作
AlexNet.py ResNet34.py Squeezenet.py等文件用于实现一些特定的训练模型,都继承自 BasicModule,都有load和save的操作
Utils文件夹
__init__.py
Visualize.py 等文件用于实现一些工具操作,像数据可视化处理等
Config.py配置文件,该文件用于提供程序运行中参数的默认值,并可以进行修改
Main.py文件,该文件为运行的主文件,是训练和测试模型的入口
Requirements.txt文件,用于记录用到的库,如下:
fire用在main.py中的main函数中,命令行工具
torchvision.transforms用于dataset.py中,用于处理图片集的初始化变换操作
visdom可视化工具,用于visualize.py文件中,绘制loss,val_accuracy图和图片,以及一些日志信息
tqdm.tqdm进度条工具,在训练train,验证val,测试test方法中均有用到
ipdb实用的断点调试库,用在main.py中,若存在debug文件则ipdb.set_trace()
os用于处理文件和目录,用在dataset.py中读取图片集
warnings设置警告,用在了config.py中,警告没有相关参数
csv用于main.py中write_csv方法中,将得到的result保存为.csv文件
PIL图片处理库,在dataset.py中配合torchvision.transforms使用
time时间库,主要用于命名
torch.utils.data.Dataset
torch.utils.data.Dataloader;
numpy python的数组类型
torch pytorch框架基本数据类型——数组
torchnet.meter 便利的统计工具,用在训练train方法中统计平均值和标准差,以及分类情况
Readme.txt文件,提供程序的必要说明
注:
1.关于__init__.py文件的解释
可以看到,几乎每个文件夹下都有__init__.py文件,一个目录如果包含了 __init__.py文件,那么它就变成了一个包(package )。__init__.py可以为空,也可以定义包的属性和方法,但其必须存在,其他程序才能从这个目录中导入相应的模块或函数。
例如:在data/文件夹下有__init__.py,则在main.py中就可以from data.dataset import DogCat。如果在__init__.py中写人from .dataset import DogCat,则在 main.py 中就可以直接写为: from data import DogCat,或者import data; dataset = data.DogCat, 比写为from data.dataset import DogCat更便捷。
2. .pyc文件的解释
.pyc文件是一个可执行的字节码文件,目的是节省Python解析器翻译时间,提高运行效率。
第一次执行python程序后,被import的py文件会生成.pyc字节码文件
第二次再执行程序时,Python就会拿.pyc文件和.py文件的修改时间对比,如果pyc文件修改时间大于py文件的话,说明py源文件没有被修改,Python就会直接执行.pyc文件;如果.py文件的修改时间比.pyc新的话,说明源文件被修改过,Python就会重新执行.py文件来重新生成字节码。
其实我们安装的Python第三方库还是Python自带的包(模块),都会在该目录下生成一个'__pycache__'目录,目录里全是该包(模块)的pyc文件
二. 项目数据测试结果展示
1使用的数据
取自kaggle平台的Dogs vs. Cats竞赛中的测试集和训练集(1=狗,0=猫)
2 测试方法
使用谷歌开源的命令行工具fire,安装pip install fire,导入import fire。使用Facebook提供的可视化工具visdom,安装pip install visdom,导入import visdom。我使用的是VScode编辑器,下面介绍测试流程:
A.运行main.py
B.点击下面窗口“+”号,会打开cmd窗口
C.启动visdom默认本地服务器:python -m visdom.server,打开http://localhost:8097/网页(online)
D.重复B操作,再打开一个命令窗口
E.键入python path\main.py train 默认设置测试,等待visdom网页画出结果
注:关于fire命令行工具的使用,例如
执行main.py文件中的train(字典参数)函数:
python path\main.py train
--model=’resnet34’
--batch-size=4
--max-epoch=20
3 结果展示
A. squeezenet模型训练和测试结果
默认设置测试结果,batch_size=32squeezenet模型损失变化情况
squeezenet模型验证准确率变化
输出的一些日志信息:
[0701_212918] epoch:0,lr:0.001,loss:0.21642731666782866,
train_cm:[[7980 770][ 920 7830]],val_cm:[[3625 125][ 114 3636]]
[0701_213114] epoch:1,lr:0.001,loss:0.1717829980105979,
train_cm:[[8175 575][ 748 8002]],val_cm:[[3597 153][ 85 3665]]
[0701_213309] epoch:2,lr:0.001,loss:0.16232758064429112,
train_cm:[[8229 521][ 670 8080]],val_cm:[[3602 148][ 84 3666]]
[0701_213502] epoch:3,lr:0.001,loss:0.15960106837275473,
train_cm:[[8206 544][ 659 8091]],val_cm:[[3541 209][ 53 3697]]
[0701_213655] epoch:4,lr:0.001,loss:0.1596247132806281,
train_cm:[[8206 544][ 685 8065]],val_cm:[[3670 80][ 128 3622]]
[0701_213849] epoch:5,lr:0.0005,loss:0.15363887070901217,
train_cm:[[8248 502][ 681 8069]],val_cm:[[3646 104][ 100 3650]]
[0701_214042] epoch:6,lr:0.0005,loss:0.15513105356769527,
train_cm:[[8243 507][ 653 8097]],val_cm:[[3603 147][ 73 3677]]
[0701_214235] epoch:7,lr:0.00025,loss:0.1517436784543983,
train_cm:[[8263 487][ 651 8099]],val_cm:[[3628 122][ 80 3670]]
[0701_214428] epoch:8,lr:0.00025,loss:0.14852604093591934,
train_cm:[[8255 495][ 645 8105]],val_cm:[[3643 107][ 89 3661]]
[0701_214625] epoch:9,lr:0.00025,loss:0.14587212667223318,
train_cm:[[8258 492][ 627 8123]],val_cm:[[3630 120][ 88 3662]]
测试图片的结果保存到squeezenet_test_result.csv文件中,其中id为图片名,label为该图片中的动物是狗的概率
B. resnet34模型训练和测试结果
C. alexnet模型训练和测试结果
一. 使用VScode执行程序时遇到的bug以及解决方法
1. 路径问题
VScode的相对路径,是以.vscode文件夹为参考点的
例如,我要访问exercise文件夹中的exercise.txt文件,
应该是exercise/exercise.txt(相对路径)
VScode中路径切勿使用‘\‘,否则会被系统认为是转义字符,要使用’/‘或’\\‘
2. 在BasicModule.py文件中,在使用时间命名模型时,配合使用torch.save(…,time.strftime())时会报错OSError:[Errno 22]:Invalid argument:‘路径\文件名‘,具体报错原因不知道,网上百度也没有找到类似错误,解决方法torch.save不能配合time.strftime一起使用
3. 训练ResNet34模型时,报错:RuntimeError: CUDA out of memory.解决方法:将batch_size适当减少,减少GPU消耗
附完整项目:
链接:https://pan.baidu.com/s/1h5X066GL45j6SpunAxW9BQ
提取码:om9f