PyTorch(四) --反向传播 back propagation

课程视频:传送门 反向传播 Back Propagation
Tensor和tensor的区别:传送门 Tensor & tensor

一、Tensor和tensor的区别

在Pytorch官方文档中,对于 Tensor 与 tensor 的定义:
传送门:Tensor
传送门:tensor
简单总结:
在PyTorch中,Tensor和tensor都能用于生成新的张量:

>>> a=torch.Tensor([1,2])
>>> a
tensor([1., 2.])
>>> a=torch.tensor([1,2])
>>> a
tensor([1, 2])

区别:
Tensor 是多维矩阵,矩阵的元素都是同一种数据类型。torch.Tensor()是python类。例如:输入数据为>>> a=torch.Tensor([1,2])时,它会生成一个 1行两列矩阵
tensor 需要确切的数据对它进行赋值。而torch.tensor()仅仅是python函数:tensor
函数原型是:

torch.tensor(data, dtype=None, device=None, requires_grad=False) #其中data可以是:list, tuple, NumPy ndarray, scalar和其他类型。

二、反向传播

代码:

# -*- coding: UTF-8 -*-
'''===============================================
@Author :kidding
@Date   :2021/2/3 17:11
@File   :Back_Propagation
@IDE    :PyCharm
=================================================='''
import torch
import matplotlib.pyplot as plt

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

'''
w是Tensor(张量类型),Tensor中包含data和grad,data和grad也是Tensor了。
grad初始为None,调用l.backward()方法后w.grad为Tensor,故更新w.data时需使用w.grad.data。
如果w需要计算梯度,那构建的计算图中,跟w相关的tensor都默认需要计算梯度。
'''
w = torch.Tensor([1.0])
w.requires_grad = True  #计算梯度

#前向传播
def forward(x):
    return x * w  #此时的 w 是Tensor,此处 x 会进行自动类型转换为Tensor

#定义损失函数loss
def loss(x,y):
    y_pred = forward(x)
    return (y_pred-y)**2

print("predict (Befor Training)",4,forward(4).item())

Epoch_list =[]  #保存epoch
Loss_list = []  #保存每个epoch对应的loss

for epoch in range(100):
    for x,y in zip(x_data,y_data):
        l = loss(x,y) #前馈过程计算loss
        l.backward()  #反向传播计算backward(),它会自动计算出计算图中所有需要梯度的Tensor,并存在相应的变量中
        print("\t grad:",x,y,w.grad.item()) #.item()是为了取梯度中的标量
        w.data = w.data-0.01*w.grad.data    #.data 是为了直接对数值进行操作,防止产生计算图(以为grad是一个Tensor)

        Epoch_list.append(epoch)
        Loss_list.append(l)

        w.grad.data.zero_()

    print("Epoch:",epoch,"Loss={:.4f}".format(l.item()))

plt.plot(Epoch_list,Loss_list)
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.grid(ls='--')  # 生成网格
plt.show()

print("predict (After Training):",4,forward(4).item())

结果:
PyTorch(四) --反向传播 back propagation_第1张图片
PyTorch(四) --反向传播 back propagation_第2张图片
反向传播过程中,每个Epoch对应的Loss可以存放在list中,并画出这个方向传播的Loss趋势,如下图所示。
PyTorch(四) --反向传播 back propagation_第3张图片

你可能感兴趣的:(PyTorch学习,python,pytorch,神经网络)