介绍了反向传播的相关知识,代码中有很多注释
# In PyTorch,Tensoris the importantcomponent in constructing dynamiccomputational graph. # It containsdataandgrad, which storage the value of node and gradient and loss respectively. import torch x_data=[1.0,2.0,3.0] y_data=[2.0,4.0,6.0] # 为w创建Tensor变量,并且指名w需要计算梯度 # w相关的变量也会自动计算梯度 w=torch.Tensor([1.0]) w.requires_grad= True # 注意:因为w是一个tensor,乘法已经被重载了 # 进行的是tensor之间的数乘,x自动类型转换变成tensor # 这一步实际上是构建了一个最简单的计算图 # 因为w需要计算梯度,所以forward的那个输出也会计算梯度,并且也是tensor类型 def forward(x): return x*w # y_pred也是tensor需要计算梯度,而这个函数返回值也一样 # loss和forward函数实际上就是构建了完整的计算图 # 我们每一次调用loss函数,就动态的建立了一个计算图 def loss(x,y): y_pred=forward(x) return (y_pred-y)**2 print('predict(before training)',4,forward(4).item()) # item()是吧tensor里面的数据拿出来变成标量 for epoch in range(100): for x,y in zip(x_data,y_data): l=loss(x,y) # 前馈过程,很简单 l.backward() # 自动计算l的计算图上所有需要梯度 # 并且把梯度储存到w上(先前定义的) # 当存到w里后,计算图被释放(节省空间) print('\t grad:',x,y,w.grad.item()) # item()是吧tensor里面的数据拿出来变成标量,这里grad是一个tensor,所以指的是取出grad的值 w.data=w.data-0.01*w.grad.data # tensor中包含data、grad等数据,而grad实际上也是一个tensor # 所以我们如果想访问grad的值,我们需要再 .data 一下 # 否则就是又进行了tensor之间的运算,又创建了计算图 w.grad.data.zero_() # abckward后仅仅是计算图被释放,但是grad.data还在 # 这一步实际上就是把它清空 print('progress:',epoch,l.item()) print('predict(after training)',4,forward(4).item)