Re:从0开始的手写线性回归
Re:从0开始的手写线性回归
只使用tensor和autograd完成简单的线性回归全过程。
一些小细节
- pycharm要求函数之间空两行
- 函数内部变量尽量不要与外部重名,参考:
https://www.cnblogs.com/shengulong/p/10171386.html
【目前还不完全理解,以及不确定是否需要解决】
代码注解
生成数据集
1 |
|
y+=b
一句需要单独成行,否则会出错采用
reshape(x, y)
可以改变tensor的大小,如果参数选择-1则可以仅输入行或者列,自动计算另一个参数。书中使用的reshape(-1, 1)
可以确定列数为1,自动计算行数。
生成后画出特征的两个维度和标签的三维散点图:
随机读取小批量数据
1 |
|
- 学习这种随机取出小批量数据的方法!
- 合理大小的小批量可以利⽤GPU硬件的优势,每个样本都可以并行地进行模型计算、损失函数计算、梯度计算。结果是GPU可以在处理几百个样本时,所花费的时间不比处理⼀个样本时多太多。
- 实际上深度学习内置的iter效率高得多
初始化模型参数
在这里模型参数指权重w和偏置b。
1 |
|
- 参数w使用了正态分布进行初始化,其实也可以直接以0作为初始值【那为什么要指定初始值啊】
- 注意不要漏掉
requires_grad=True
模型
1 |
|
损失函数
1 |
|
- 这里使用了
reshape()
,是一种安全且规范的写法,保证了两个向量确实是按我们期望的方式都作为列项链进行相减。值得认可!
优化算法(小批量随机梯度下降)
1 |
|
【关于自动求导的部分待填坑】
训练过程
参数设置
1 |
|
注意这两句:
1
2net = linear_regression
loss = squared_loss是一种规范的写法,值得认可!
训练过程
1 |
|
整个算法步骤按上一节所述如下:
- 初始化模型参数
- 随机抽取小批量样本,在负梯度方向更新参数
- 不断迭代
【关于自动求导的部分待填坑】
训练效果
这里如果num_epochs
设为3,我的代码效果不好,因此增大到30了。
1 |
|
训练效果:
调API的线性回归
思想与上面完全一致,但是代码精简很多。
1 |
|
仍然有一样的问题,书中训练3个epoch效果就很好,我需要训练到10个左右才能达到相同效果
Re:从0开始的手写线性回归
http://example.com/2022/12/17/Re-从0开始的手写线性回归/