
权重维度增加,层数增加,模型变得复杂

但是化简后仍是线性,因此增加层数意义不大
![[图片]](https://1000bd.com/contentImg/2024/03/29/9452e8a017171181.png)
引入激活函数,从而增加非线性
![[图片]](https://1000bd.com/contentImg/2024/03/29/a42a68feb7962e49.png)
反向传播计算梯度,使用链式法则
![[图片]](https://1000bd.com/contentImg/2024/03/29/5e067a257e472c9c.png)
![[图片]](https://1000bd.com/contentImg/2024/03/29/f5b2642e6db1ad09.png)
![[图片]](https://1000bd.com/contentImg/2024/03/29/663d9daa224dfcb8.png)
Tenso(张量):PyTorch中存储数据的基本元素。
Tensor两个重要的成员,data和grad。(grad也是个张量)
import torch
# 已知数据:
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
# 线性模型为y = wx, 预测x = 4时, y的值
# 假设 w = 1
w = torch.Tensor([1.0])
w.requires_grad = True
# 定义模型:
def forward(x):
return x*w
# 定义损失函数:
def loss(x,y):
y_pred = forward(x)
return (y_pred - y)**2
print("Prediction before training:",4,'%.2f'%(forward(4)))
for epoch in range(100):
for x, y in zip(x_data,y_data):
l = loss(x,y)
l.backward() # 对requires_grad = True的Tensor(w)计算其梯度并进行反向传播,并且会释放计算图进行下一次计算
print("\tgrad:%.1f %.1f %.2f" % (x,y,w.grad.item()))
w.data = w.data - 0.01 * w.grad.data # 通过梯度对w进行更新
w.grad.data.zero_() #梯度清零
print("Epoch:%d, w = %.2f, loss = %.2f" % (epoch,w,l.item()))
print("Prediction after training:",4,'%.2f'%(forward(4)))

1. 计算y=xw的梯度

2. 计算仿射模型y=xw+b的梯度

3. 使用计算图计算y=w1x^2+w2x+b的梯度

4. 使用Pytorch计算y=w1x^2+w2x+b的梯度
二次模型 Quadratic Model

代码如下:
import torch
# 已知数据:
x_data = [1.0,2.0,3.0]
y_data = [6.0,11.0,18.0]
# 线性模型为y = w1x²+w2x+b时, 预测x = 4时, y的值
# 假设 w = 1, b = 1
w1 = torch.Tensor([1.0])
w1.requires_grad = True
w2 = torch.Tensor([1.0])
w2.requires_grad = True
b = torch.Tensor([1.0])
b.requires_grad = True
# 定义模型:
def forward(x):
return x*x*w1+x*w2+b
# 定义损失函数:
def loss(x,y):
y_pred = forward(x)
return (y_pred - y)**2
print("Prediction before training:",4,'%.2f'%(forward(4)))
for epoch in range(1000):
for x, y in zip(x_data,y_data):
l = loss(x,y)
l.backward() # 对requires_grad = True的Tensor(w)计算其梯度并进行反向传播,并且会释放计算图进行下一次计算
w1.data = w1.data - 0.02 * w1.grad.data # 通过梯度对w进行更新
w2.data = w2.data - 0.02 * w2.grad.data
b.data = b.data - 0.02 * b.grad.data
# 梯度清零
w1.grad.data.zero_()
w2.grad.data.zero_()
b.grad.data.zero_()
print("Epoch:%d, w1 = %.4f,w2 = %.4f,b = %.4f, loss = %.4f" % (epoch,w1,w2,b,l.item()))
print("Prediction after training:",4,'%.4f'%(forward(4)))
结果:

教程指路:【《PyTorch深度学习实践》完结合集】 https://www.bilibili.com/video/BV1Y7411d7Ys?share_source=copy_web&vd_source=3d4224b4fa4af57813fe954f52f8fbe7