总结

编码过程

数据
数据预处理
模型
参数,初始化参数
超参数
损失函数,先计算损失,清空梯度(防止有累积的梯度),再对损失后向传播计算损失关于参数的梯度
优化算法,使用优化算法更新参数
训练求参数

线性回归训练过程

# 开始训练
num_epochs=3
for epoch in range(num_epochs):# 获取小批量样本for X,y in data_iter:# net中带有w和b,传入x即可l=loss(net(X),y)# 梯度请0trainer.zero_grad()# 后向传播,内部torch帮助求sum()了l.backward()# 走一步 更新1次w和btrainer.step()l=loss(net(features),labels)# {1:f} 把l用浮点数方式表示print(f'epoch {epoch+1}, loss {l:f}')

超参数

1个epoch包含多个batch_size
num_epochs 迭代次数,1个epoch会把数据都使用完
batch_size 执行1次优化算法的样本数量

常用损失函数

均方误差
MSE=1N(y^−y)2MSE=\frac{1}{N}(\hat{y}-y)^2MSE=N1​(y^​−y)2

# 损失函数 MSE 均方误差
loss=nn.MSELoss()

常用评价指标

loss=y^−y\hat{y}-yy^​−y

l=loss(net(features),labels)

python

基础

# 获取list类型变量
indices=list(range(num_examples))

生成器

# 生成器(生成数据、可迭代对象)
# 每次取i到i+batch_size的数据
for i in range(0,num_examples, batch_size):# min防止越界batch_indices=torch.tensor(indices[i:min(i+batch_size,num_examples)])# yield 产出yield features[batch_indices],labels[batch_indices]

with as操作上下文管理器

# 资源管理 防止资源泄漏
# __enter__()魔法方法,进入with时调用open()
# __exit__()魔法方法,退出with时调用close()
with open('xcrj.txt', 'a') as f:f.write("\nxcrj")

random

import random
# 操作索引好处 后面可以操作features和label
random.shuffle(indices)

2李沐动手学深度学习v2/ndarray

创建张量

torch.arange(12)
torch.tensor([[],[]])
torch.ones((1,3))
torch.zeros((1,3))
X=torch.arange(12,dtype=torch.float32).reshape((3,4))
# 符合normal正态分布的随机值。0均值,1方差的随机数
X=torch.normal(0,1,(num_examples,len(w)))

常用

X.shape
# number of elements
X.numel()
X.reshape((3,4))
# -1这一维由计算得出
y.reshape((-1,1))
X.sum()
X.mean()
type(X)
len(X)

普通求和

A=torch.arange(24).reshape(2,3,4)
print(A)
# axis代表第i维,n维数组的第i个括号
# 消除第1个括号,把第1个括号内的n个记录中的对应位置元素相加
print(A.sum(axis=0))
print(A.sum(axis=0).shape)
# 消除第2个括号,把第2个括号内的n个记录中的对应位置元素相加
print(A.sum(axis=1))
print(A.sum(axis=1).shape)
# 消除第1个和第2个括号,先把第1个括号内的n个记录中的对应位置元素相加,再把第2个括号内的n个记录中的对应位置元素相加
print(A.sum(axis=[0,1]))
print(A.sum(axis=[0,1]).shape)# 保留维度
sum_A=A.sum(axis=1,keepdims=True)

累加求和

# cumulation
A.cumsum(axis=0)

基本运算

# 所有的运算都是基于元素的, **是幂运算,//是地板除法
x+y, x-y, x*y, x/y, x**y, x//y# e的x次方
torch.exp(x)

拼接

# 不增加新的维度,在第0维拼接
torch.cat((X,Y),dim=0), torch.cat((X,Y),dim=1)

类型转换

# tensor>numpy
X.numpy()# tensor>基本数据类型
x.item()

对象实体与对象引用

# 更倾向于创建一个新的对象
# 指针变化
# id获取指针
before=id(Y)
# 创建了1个新的对象Y
Y=Y+X
id(Y)==before# 存在优化
# 指针不变
before=id(X)
X+=Y
id(X)==before# 细节创建方式
A=torch.arange(20,dtype=torch.float32).reshape(5,4)# 深拷贝
B=A.clone()
A,A+B# copy不一定是深拷贝
B=A.copy()

3李沐动手学深度学习v2/线性代数

矩阵操作

A.T

乘法

# 点积:元素按位置相乘再求和,就是数学的矩阵运算
m_d=torch.dot(x,y)
# 乘积:元素按位置相乘
m_h=x*y# 点乘
# matrix.vector=矩阵.向量
torch.mv(A,x)# 点乘
# 二维矩阵相乘
# matrix.matrix=矩阵.矩阵
torch.mm(A,B)# 点乘
# 多维矩阵相乘
# matrix multiple
y=torch.matmul(X,w)+b

范数

# L1范数=向量元素绝对值求和
x=torch.tensor([3.0,4.0])
l1=torch.abs(x).sum()
l1# L2范数=向量元素平方和开根号
x=torch.tensor([3.0,4.0])
# norm规范
l2=torch.norm(x)
l2# F范数=矩阵元素平方和开根号
x=torch.arange(6,dtype=torch.float32).reshape(2,3)
torch.norm(x)

4李沐动手学深度学习v2/自动求导

梯度


# 存储梯度
# 等价于x=torch.arange(4.0,requires_grad=True)
x.requires_grad_(True)# 访问梯度 默认None
x.grad# 清空梯度,pytorch模型进行梯度累积
x.grad.zero_()# 计算梯度,反向传播,y对x的每个分量求梯度
y.backward()# 不计算梯度
# detach离开,移出梯度计算图
u=y.detach()
z=u*x
# z.sum()对x的各个分量求梯度
z.sum().backward()
# u被移出计算图,u是常数,所以相等
print(x.grad==u)

问题

为什么loss是标量
答:因为标量对矩阵或向量求导的结果shape不会变大

5李沐动手学深度学习v2/线性回归-从0开始实现

移出计算图再转ndarray

# features[:,1].detach().numpy()
# 要转为numpy类型需要先从计算图中移除detach(隐式构造计算图)
d2l.plt.scatter(features[:,1].detach().numpy(),labels.detach().numpy(),1);

不计算梯度的时机

# 优化算法更新参数时不需要计算梯度,需要清空梯度
# 展示n个epoch的训练情况时不需要计算梯度,不需要情况梯度# 定义优化函数
# 随机梯度下降,随机从样本中选取batch_size的数据,所有样本都会取到。知识对所有样本进行了shuffle
def sgd(params,lr,batch_size):'''小批量梯度下降:param params 初始化参数:param lr learning rate:param batch_size''''''with A:block进入block时,执行A的__enter__()退出block时,执行A的__exit__()'''# 进入环境管理器时记录梯度状态和禁止梯度计算, 退出环境管理器时还原# 为什么使用with语句。因为 更新param时不需要梯度计算with torch.no_grad():for param in params:# batch_size本来放到squared_loss中,线性回归模型放到这里也可以param-=lr*param.grad/batch_size# 清空梯度param.grad.zero_() # 训练多少轮,每轮有多个小批量
for epoch in range(num_epochs):for X,y in data_iter(batch_size,features,labels):# 小批量损失l=loss(net(X,w,b),y)# l shape batch_size*1所以要sum()弄成标量求梯度# 标量对向量求梯度 向量只是转置了。向量对向量求梯度成矩阵了,矩阵对向量求梯度成三维张量了# 计算关于x,关于b的梯度l.sum().backward()# 使用优化函数更新w, bsgd([w,b],lr,batch_size)# 展示1个epoch(1轮)的训练过程with torch.no_grad():# 1个epoch后,使用被更新的w, b得到的损失train_1=loss(net(features,w,b),labels)print(f'epoch {epoch+1}, loss {float(train_1.mean()):f}')

梯度归0的时机

# 优化算法使用梯度更新完参数之后,需要重新计算梯度,先要清空梯度

6李沐动手学深度学习v2/线性回归的简洁实现

全连接层

# 全连接层就是线性层。入参(输入神经元个数,输出神经元个数)
# linear层 全连接层 2,1 输入维度,输出维度
# Sequential 神经网络层的容器
net=nn.Sequential(nn.Linear(2,1))

网络参数

# 获取神经网络第1层的权重参数
net[0].weight
# 获取神经网络第1层的偏置参数
net[0].bias

参数初始化方法

# net[0]表示神经网络的第1层
# 初始化模型参数
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)

李沐动手学深度学习v2/总结1相关推荐

  1. 14李沐动手学深度学习v2/权重衰退简洁实现

    # 权重衰退是广泛应用的正则化技术 %matplotlib inline import torch from torch import nn from d2l import torch as d2l ...

  2. 李沐动手学深度学习V2-全卷积网络FCN和代码实现

    一.全卷积网络FCN 1. 介绍 语义分割是对图像中的每个像素分类,全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换 ,与前 ...

  3. 李沐动手学深度学习(pytorch版本)d2lzh_pytorch包的缺少安装问题

    学习深度学习时候,很多人参考的是李沐的动手学深度学习Pytorch版本(附上官方地址:https://tangshusen.me/Dive-into-DL-PyTorch/#/). 在学习3.5.1节 ...

  4. 【李沐动手学深度学习】读书笔记 01前言

    虽然之前已经学过这部分内容和深度学习中的基础知识,但总觉得学的不够系统扎实,所以希望再通过沐神的课程以及书籍,系统条理的学习一遍.在读书过程中,利用导图做了一下梳理,形成了这个读书笔记.如有侵权,请联 ...

  5. 关于李沐动手学深度学习(d2l)pytorch环境本地配置

    本地安装d2l 由于之前试了很多次d2l课本的安装方法失败了,这里提供一种我可以成功安装d2l包的方法. pytorch安装 首先安装cuda.cudnn.pytroch(gpu版本).可以参考这篇文 ...

  6. 李沐动手学深度学习:08 线性回归(代码逐行理解)

    目录 一.相关资料连接 1.1 李沐视频 1.2 代码.PPT 二.代码及笔记(使用Jupyter Notebook) 2.1 线性回归从零开始实现 2.1.1 基本概念 2.1.2 基础优化算法 2 ...

  7. windows上配置深度学习(李沐-动手学深度学习)

    1.安装miniconda windows下安装,去清华大学开源镜像下载,速度比较快. 选中Miniconda3-latest-Windos-x86_64.exe下载安装包(目前最新的是py3.9) ...

  8. 李沐动手学深度学习第四章-4.9.环境和分布偏移

    我们从来没有想过数据最初从哪里来?以及我们计划最终如何处理模型的输出? 根据测试集的精度衡量,模型表现得非常出色. 但是当数据分布突然改变时,模型在部署中会出现灾难性的失败. 解决方案很简单(要求&q ...

  9. 李沐动手学深度学习V2-图像增广和代码实现

    图像增广 大型数据集是成功应用深度神经网络的先决条件,因为解决了大型复杂网络的过拟合性. 图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模. 此外,应用图 ...

最新文章

  1. SAP MM 公司间退货STO的交货单PGI报错 -Purchase order 4500000773 does not contain items for a stock transfer-
  2. 实现无锁的栈与队列(1)
  3. perl中的几个模块使用.
  4. SAP ABAP常用正则表达式大全
  5. Android入门之常用控件
  6. java fileinputstream.read(byte[])_Java分享笔记:FileInputStream流的 read()方法 和 read(byte[] b)方法...
  7. 查看Scala编译的.class文件
  8. Mr.J--俄罗斯方块实现(框架)
  9. c++中的system函数
  10. 实现机器学习的循序渐进指南系列汇总
  11. idea 查询项目代码行数_程序员的福利,四个技巧,让OneNote支持代码高亮
  12. Shell中判断文件,目录是否存在
  13. mac M1 IDEA配置SVN
  14. 使用 ESP-Prog / Jlink 进行 JTAG 调试时的常见错误及解决办法
  15. 反转一个英语句子c++
  16. session_Composite(组合模式)
  17. V2X和D2D的链路级sidelink上的区别
  18. html+word+clou,AE脚本:Word Cloud 1.0.3_文字云排版动画脚本+教程
  19. linux文件系统研究与设计,Linux下实时文件系统的设计
  20. 计算机-IEEE ACCESS-论文投稿上岸经验分享

热门文章

  1. 我是如何走上Java开发这条路的
  2. [转载]不等式证明中的待定系数法(基本不等式+平衡系数法)_Simplelife_新浪博客...
  3. esp32和显示屏交互
  4. CompletableFuture使用详解(全网看这一篇就行)
  5. 小程序生成分享海报并转发朋友圈(超全版)
  6. 华夏名网Discuz虚拟主机论坛空间推荐
  7. Android 代理自动配置PAC研究
  8. Parenthese sequence -模拟
  9. 实现财务自由 之 收割你的 “韭菜” 思维,学会做价值投资
  10. 【​观察】广汽菲克数字化转型“尝鲜记”