卷积神经网络04补充(反向传播)超级详细的pytorch基础知识实操

43 篇文章 3 订阅
18 篇文章 1 订阅

在这里插入图片描述
为了提高模型的复杂度,使用非线性函数(sigmoid,relu等)
求导,链式求导。
前馈运算

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
tensor介绍:
data和 grad
数据存放在tensor中:常亮,向量,矩阵,张量

grad用于存放导数
创建模型,其实就是在构建于
在这里插入图片描述

import torch

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

w = torch.tensor([1.0])
w.requires_grad = True

w.requires_grad = True w是需要计算梯度的,自己设定
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
l.backward可以自动计算出梯度,可以把计算图上所有的需要梯度的地方都计算出来。
然后把梯度都存放到w中,之后计算图就会被释放(backward)出现以后,计算图就会被释放。
每一次释放都是为下一次构建图做准备。
在这里插入图片描述
权重更新的时候不需要进行图构建
上面这一步一定要取到数据,不然tensor进行,其实会继续建立图,因此需要取到里面的data
说白了就是做一个纯数值运算,并不需要搭建图
w.grad.item()就是拿出一个标量防止产生计算图
在这里插入图片描述
如果不进行控制(不释放),就会出现以下的循环图搭建

在这里插入图片描述
造成的后果是,不停地搭建图,如果数据量不较大的时候,就会把内存用完,程序崩掉。
因此主要到底是图的计算,还是标量的计算。
可以这样使用,使用item()进行
在这里插入图片描述

在这里插入图片描述
每一次更新完需要清零

"""
下面我根据自己的理解详细的把这段代码分析一遍
希望对学习pytorch的朋友有所帮助
"""
# 1 首先导入需要的库(torch和绘图)
import torch
import matplotlib.pyplot as plt

# 2 准备需要的数据 x_data,y_data
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

# 3 定义一个初始张量(权重w),注意,这个权重后面是需要进行更新设置的,因此需要计算梯度,这个需要w.requires_grad = True
w = torch.tensor([1.0])
w.requires_grad = True

# 4 定义一个前向函数,计算预测值,同时要知道,由于上面我们使用的是w,具有tensor权重的,因此在与常亮x_data做计算的时候,x_data会自动转换成tensor
def forward(x):
    return x*w  # w是tensor
# w是一个tensor,x不一定是一个tensor,因此需要自动转换为tensor,类似C语言中的数据类型转换

# 5 定义一个损失,采用均方差进行
def loss(x,y):
    y_pred = forward(x)
    return (y_pred - y)**2

# 6 定义两个空列表,为了接受计算的结果,用于可视化显示
print("predict (befor training)",4,forward(4).item())
epoch_l = []
loss_l = []

# 7 进行迭代,使用zip进行分离,然后计算损失,计算后需要使用backward进行导数计算
for  epoch in range(100):
    for x,y in zip(x_data,y_data):
        l = loss(x,y)
        l.backward()
        print('\tgrad:',x,y,w.grad.item())  # 注意,这里的item是一定需要的,因为w是tensor类型,这里需要得到具体的值
        w.data = w.data - 0.01*w.grad.data  # 注意:更新权重也是一样的,是数值的更新

        w.grad.data.zero_()  # 这一步很重要,如果没有这一步,计算的w是混乱的,因为计算的时候会在上一步的基础上进行,因此需要做清零操作

        print("prograss:",epoch,l.item())
    # 这里就是为了把里面处理后的结果拿到,用户可视化
    epoch_l.append(epoch)
    loss_l.append(l.item())

print("predict (after training)",4,forward(4).item())

# 8 可视化显示(epoch和loss)
plt.plot(epoch_l,loss_l,c='r')
plt.show()

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值