pytorch使用 基础解惑

早年阅读pytorch代码,或者自己写pytorch代码的时候,有不少疑惑。

数据准备阶段

transform

transforms.Compose函数就是将transforms组合在一起;而每一个transforms都有自己的功能。有点流式编程的意思。

data

dataloader加载数据的时候,batch size常为64。所返回的dataloader可以看成一个list。
数据通常是(data, label)的格式。
实际操作的时候,通常从训练集中抽0.1做验证集。

tensor和numpy

互相转化时,可能会共享内存。
numpy更为强大,将tensor转为numpy处理后再转回tensor是常见的做法。

view()

作用就是resize/reshape。行优先。如果想列优先考虑permute()。参数为-1时表示自动推断。

broadcast

即数据补齐,维数不够的补1,维长不够的延长。两个尺寸不同的tensor运算时会自动broadcast。

几个参数

epoch,一个epoch要前向+后向完整数据。
epoch内分为多个batch,需要iterations轮循环才能完成一个epoch。
每个batch都会更新一次权重参数。
epoch增加,是欠拟合往过拟合的过程。类别越多,需要的epoch越多。

归一化和标准化

归一化和标准化是有区别的,代码中的normalize应该翻译成标准化。
归一化让数据在[0,1]:
在这里插入图片描述
标准化让数据均值为0,方差为1:
在这里插入图片描述
前者的作用是,不同的特征在量纲上有区别,比如年收入是比较大的数字,而家中子女数通常是个位数。如果要让他们地位对等,就需要归一化。但受异常点影响,比如有一个异常大的值,就会导致其它值都挤在一个小区间内。
后者的作用,我认为是让数据集中到0附近。实际使用一般用标准化。

损失函数

数学中文名模块/函数名场合
均方误差损失torch.nn.MSELoss逻辑回归
交叉熵损失torch.nn.BCELoss二分类
对数交叉熵损失torch.nn.BECWithLogitsLoss二分类
负对数似然函数torch.nn.NLLLoss多分类
交叉熵损失torch.nn.CrossEntroyLoss多分类

训练阶段

定义__call__方法的类可以当作函数调用。nn.Module的call方法中,调用了forward方法。
所以model(data)的意思,其实就是调用了前向传播forward()。

最好了解一下前向传播和反向传播的原理。

流程总结

  • 数据准备与预处理
  • 模型定义,一般是一个继承自nn.Module的类,内有forward方法
  • 训练,输出=模型(输入),优化器.zero_grad(),loss=损失函数(预测值,实际值),loss.backward(),优化器.step()
  • 模型保存、加载、作图

Parameter()

通常,我们的参数都是一些常见的结构(卷积、全连接等)里面的计算参数。而当我们的网络有一些其他的设计时,会需要一些额外的参数,同样跟着整个网络的训练进行学习更新,最后得到最优的值,经典的例子有注意力机制中的权重参数、Vision Transformer中的class token和positional embedding等。

torch.nn.Parameter()就可以很好地适应这种应用场景。
可以把这个函数理解为类型转换函数,将一个不可训练的类型Tensor转换成可以训练的类型Parameter并将这个parameter绑定到这个module里面(net.parameter()中就有这个绑定的parameter,所以在参数优化的时候就可以进行优化了。

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值