前几天实现了梯度下降,今天尝试使用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("progress:", epoch, l.item(), ‘ w:‘, w.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())
在执行backward() 之后会删除计算图,对于pytorch 的计算图机制很多老师都已经分析了很多了,对于我个人还没有理解透,所以在此先不做详细说明。
其次是对于tensor,个人理解是在类中嵌套另一个类,使用C 语言结构体来表示的话就是:
struct tensor{
int data;
tensor grad;
}
同时对于tensor 之间的计算符也被重载了。
这两天做的主要就是pytorch 的学习,但是对其中的机制没什么特别有感觉的,可能往后学了之后就会有点自己的感悟了吧。
原文:https://www.cnblogs.com/RabbitKeeper/p/14744975.html