学习pytorch(一) 利用pytorch 构建计算图,进行最简单的机器学习。

在这里插入图片描述

import torch
#构建的例子模型是线性模型 y=w*x
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]
w=torch.tensor([1.0]) #构建一个1阶张量,就是一个一维数组。张量是神经网络的计算单元
w.requires_grad=True #这个张量是需要计算梯度的,默认不计算,让张量计算梯度,才能进行反向传播
def forward(x):
    return x*w  #*号已经被重载了。x会转换为张量。张量的运算实际上是在构建计算图。
    #返回的结果也是一个张量。这个结果张量是可以反向传播的。

def loss(x,y):
    y_hat=forward(x) #y_hat 是预测值。它是个张量,尽管这个张量只有一个数,
    #但是张量的计算是构建计算图,如果用这个张量去计算,也能得到结果,
    #但由于构建的是计算图,内存消耗会非常大。
    return (y_hat-y)**2 #返回预测值相对于实际值的损失。返回的是个张量

for cycle in range(1000): #进行1000轮学习
    for x,y in zip(x_data,y_data):
        l=loss(x,y)
        l.backward()
        print('\tgrad:',x,y,w.grad.item()) #注意grad也是张量,打印是我们只关心它的值,
        #通过item()就能访问它的值。
        w.data=w.data-0.01*w.grad.data#注意不能写成:w=w-0.01*w。这样子是构建计算图。
        #原来的w还是在内存中的。只是无法被直接访问。而我们希望的是更新原来的w的值,不希望构建计算图。
        #所以修改的只是w.data。
        w.grad.data.zero_() #这里要显式得对之前计算过的梯度清0。
        #我们修改了data,但是原来的梯度其实还在的。如果不清零。
        #下次计算梯度的时候,会把上次计算的加上去,使下次的梯度不是真正的梯度。而是梯度和。
    print("cycle:",cycle,l.item())

print("1000轮训练后预测当x=4时,y=",forward(4).item())

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ld_long/article/details/113625347