课程视频:传送门 反向传播 Back Propagation
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())
结果:
反向传播过程中,每个Epoch对应的Loss可以存放在list中,并画出这个方向传播的Loss趋势,如下图所示。