深度学习05-pytorch 实现梯度下降

前几天实现了梯度下降,今天尝试使用pytorch 实现梯度下降,话不多说,上代码!还是使用之前的简单一元线性回归数据集。

import torch
import pandas as pd

# 从文件读取数据
df = pd.read_csv(filepath_or_buffer='archive/train.csv')

# 给一个随机值 5.0
w = torch.Tensor([25.0])
l = torch.Tensor([0.0])
# 计算梯度
w.requires_grad = True


def forward(x):
    return x * w


def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2



# epoch表示执行轮数,学习100轮
for epoch in range(100):
    for x, y in zip(df['x'], df['y']):
        l = loss(x, y)
        # 反向传播,反馈,执行后删除计算图
        l.backward()
        # 更新w,grad也是tensor变量,所以使用data取出值
        w.data = w.data - 0.001 * w.grad.data / len(df)
        # 将梯度手动清零,否则会叠加
        w.grad.data.zero_()
# w是tensor量,所以计算出的l也是tensor量,使用item()取出具体的数值
print('train w = ', w.item())



df = pd.read_csv(filepath_or_buffer='archive/test.csv')
for x, y in zip(df['x'], df['y']):
    l += loss(x, y) / len(df)
print("test loss = ", l.item())

输出:

train w = 0.999427318572998
test loss = 13.52737808227539

在执行backward() 之后会删除计算图,对于pytorch 的计算图机制很多老师都已经分析了很多了,对于我个人还没有理解透,所以在此先不做详细说明。

其次是对于tensor,个人理解是在类中嵌套另一个类,使用C 语言结构体来表示的话就是:

struct tensor{
	int data;
	tensor grad;
}

同时对于tensor 之间的计算符也被重载了。

这两天做的主要就是pytorch 的学习,但是对其中的机制没什么特别有感觉的,可能往后学了之后就会有点自己的感悟了吧。

posted @ 2021-05-08 15:02  RabbitKeeper  阅读(360)  评论(0编辑  收藏  举报