Python-pytorch使用笔记
个人向pytorch框架学习
python基础简单回顾
- 数据类型于运算符
- 内置:数值类型(int,float,complex,bool),字符串(str),群集(list,set,dict,tuple)
- 变量与运算符:变量定义,加减乘除,比较赋值,逻辑运算(and or not)、位运算(& | ^ ~(取反)>> <<左右移动)、索引切片运算(类似name[:3]对列求址使用其值)
- 语句与流程设计
- 流程语句:if、while、for in、pass、break、continue for Comprehension
- 定义语句:
- 使用def定义函数
- 自由定义参数,但不支持函数重载,同一函数(命名空间中后赋值会覆盖前赋值)
- 一级函数:函数实例化(python函数其实也是一个值,实例化的值函数可以给内部参数进行赋值)函数作为值,与list,int等数据类型一样,具有强大复用性
- lambda表达式
- 变量的范围
- yield生成器
- 从模块到类
- 使用模块建立抽象层(功能函数集合.py模块文件):三种不同的导入并生成实例方式的区别
- 对象/类class:初始化(类实例创建时执行)函数__init__(参数)、定义操作(方法函数)
- 定义内部属性(隐私private)外部属性(公开publice)
- 类的继承:继承目的、鸭子类型、重定义方法、object、建立寻找文件、泛型
- 函数修饰器
这个东西换个名字其实很好理解,就是函数的一个“改装车间”,很多时候函数在代码上线后就难以调整,因为牵涉到的关联代码很多。拿车举例,就是买的车定型了,那么要想再增加点马力,改改油漆或者换个内置的系统又担心改了上不了路怎么办,那就去修饰器里单独加工,你的车辆本体没变,但你可以随意调用你改装后的车疯狂上路(使用修饰器后)
- 异常处理
- try、except
- 异常继承
- raise
- finally
- with as
- open()/io
- open()函数是python里的数据写入函数,有两大基本参数:
- file:文件字符串(同目录)/文件相对路径(指定根目录)/文件绝对路径
- mode:r(read)、w(write,会清空内容)、x(创建文件并写入)、a(add)
- read()、write()、close()
- io模块
- open()函数是python里的数据写入函数,有两大基本参数:
- 数据结构
- 对象协议:hashable/iterable/orderable
- hashable:set的内容可以是无序的,但不允许同级别list,dict的实例放入
hash类型一般是inmutable的,相当于静置的宏定义参数
- hashable:set的内容可以是无序的,但不允许同级别list,dict的实例放入
- 群集处理:collection模块
- 对象协议:hashable/iterable/orderable
- 数据持久化与交换
- pickle,shelve使得对象序列化
- 数据库处理
- 数据交换格式:CSV、JSON、XML
- 常用模块
- 时间模块:time()|datetime()
- 日志模块:Logger
- 正则表达式:Pattern与Match对象
- os()
- URL处理模块
- debug
- 并发、并行与异步
- 线程的简介
- 进阶
Numpy使用
- where寻找矩阵索引
where
pytorch基本操作手册
使用文档
- 保存载入模型:torch.sava\torch.load
- 给tensor在指定维度上增减维度:
- torch.squeeze(input, dim = None, out = None): 返回一个tensor
- torch.unsqueeze(input, dim = None, out = None): 返回一个tensor
pytorch的可视化处理
log输出
- 查看张量
1
2
3x.shape # 尺寸
x.size() # 形状
x.ndim # 维数 - squeeze(n)/unsqueeze(n):压缩或者增加维数
torch.squeeze(n)函数表示压缩tensor中第n维为1的维数,比如下面第一个,b.squeeze(2).size(),原始的b为上面的torch.Size([1, 3, 2]),第二维是2≠1,所以不压缩,尺寸保持不变;而若b.squeeze(0).size(),则发现第一维为1,因此压缩为3×2的tensor
相反的,torch.unsqueeze(n)则是在第n维增加一个维数=1,如下,表示在原始的b的第二维增加一维,则尺寸变为1 * 3 * 1 * 2
3. torch.view()
简单说,把原本的tensor尺寸,转变为你想要的尺寸,例如原尺寸为23,现在可以转为32或16等,但一定要保证等式成立,不能目标尺寸为33
此外,也可以设其中一个尺寸为-1,表示机器内部自己计算,但同时只能有一个为-1,用法如下:
1 |
|
- torch.permute()
这个函数表示,将原始的tensor,按照自己期望的位置重新排序,例如原始tensor的第0、1、2维分别是1、3、2,那么当我执行permute(2, 0, 1),则将第三维放在最前,第一维放在中间,第二维放在最后,也就变成了2 * 1 * 3,注意这里表示的维数的index,而不是具体几维:1
2
3
4b.permute(2, 0, 1).size()
#torch.Size([2, 1, 3])
b.permute(2, 0, 1)
#tensor([[[1., 3., 5.]],[[2., 4., 6.]]])matlib
标准作图法:一个清晰的思路对作图很重要 - 从变量中拿数据
- 根据显示需求选择图表
- 套用plot绘制函数
- 使用额外的工具优化图形
BUG:pycharm存在独立图显示的bug,subplot也会在tool工具栏分别显示,setting取消勾选后独立显示时会出现未响应的情况,解决思路是给程序踩个刹车:
pytorch实战
图像处理
基础:卷积和池化
卷积公式:$f(t)**g(t)=int_(0)^(t)f(u)g(t-u)du$
物理意义:系统某一时刻的输出是多个输入共同的叠加
!
池化:有最大池化和最小池化,可以统一特征~
小样本迁移学习图像分类
- 任务设计
本次实验为验证迁移学习效果分别设计了两个场景:
- 卷积网络的微调:预训练模型代替随机初始化,使用经过预训练的网络初始化网络,例如在 imagenet 1000 数据集上进行训练的网络。 在微调网络时,所有网络层都参与训练,不过最后一个全连接层在训练时使用更大的学习率,通常最后一个全连接层的学习率是前面层学习率的10倍,训练按步骤照常进行。
- CNN作为固定特征提取器:在这里,将冻结除最终全连接层之外的所有网络的
模型训练与可视化
- 模型训练与调参遵循机械化设计步骤:模型-选参-迭代-更新-预测
- 可视化需要有坐标,序列长度讯息格式要匹配(编程基础)
一点结论
由以上实验结果可知,当模型采用预训练方式(迁移学习模型)的时候,相比于未进行知识迁移的模型在少量样本训练的情况下性能上有着明显的提高,同时从loss/acc曲线中也注意到,未经训练的模型很容易出现过拟合的情况,导致其在验证集上的泛化能力大大降低。综上,经过迁移学习的模型能够在更短的时间以及消耗更少数据资源的情况下获得优异的图片识别分类性能,验证了知识的可迁移性。同时从两种不同的迁移学习方案比较可以得知,小样本下重新训练网络与单独训练网络的全连接层的效果近乎一致,说明迁移学习模型就是根据实际的应用场景数据微调全连接层的权重以达到适应具体任务的能力,以达到更快更好的应用。