小编写博客的初心是为了记录自己的学习历程,所以以下内容可能会有不严谨的地方,如果各位大佬发现内容有错或者有更好的方法,欢迎在评论区留言,一起进步!
本文只涉及线性回归代码的实现,不会太多的涉及到线性回归到数学原理,如果需要了解线性回归原理,可以在CSDN上搜索,有很多好的文章可供参考!
在计算loss值的时候一开始是用到了被注释掉的代码,但是后面发现torch.mean()函数会自动的根据数据量算均值,而且更简洁。
def calculation_loss(data, weight, bias):
"""功能:计算损失值"""
# 定义并赋值标准输入和输出
x_input = data[:, 0]
y_input = data[:, 1]
# 计算预测值
y_predict = weight * x_input + bias
# 计算损失值
# loss = torch.sum((y_predict - y_input) ** 2) / len(x_input)
loss = torch.mean((y_predict - y_input) ** 2)
return loss
我觉得用Pytorch实现和用纯python(也就是numpy)实现的最大区别就在于torch.autograd.grad()函数的使用。torch.autograd.grad()可以对需要求导的参数进行自动求导,但是里面有很多需要注意的地方,可以详见官方文档。自动求导会极大的方便代码的编写,因为有些损失函数的导数求解会很困难!
def gradient_descent(data, weight, bias, learning_rate):
"""功能:计算w和b的梯度并更新"""
# 定义并赋值标准输入和输出
x_input = data[:, 0]
y_input = data[:, 1]
# 定义损失函数
y_predict = weight * x_input + bias
loss_function = torch.mean((y_predict - y_input) ** 2)
# 用pytorch的自动求导功能计算w和b的导数
grads = torch.autograd.grad(loss_function, [weight, bias])
# 更新权值
weight = weight - learning_rate * grads[0]
bias = bias - learning
在这一个函数模块可以根据需要自己设定一些超参数,比如学习率、迭代次数之类的。权值的初始化也会在该模块进行,而且需要注意的一点是如果要进行自动求导,需要在参数初始化的时候定义requires_grad=True,否则无法进行自动求导!
def run(data):
"""功能:进行线性回归的计算"""
# 初始化权值和一些超参数
weight = torch.tensor(0., requires_grad=True)
bias = torch.tensor(0., requires_grad=True)
num_iterations = 1000
learning_rate = 0.002
# 进行迭代计算
for i in range(num_iterations):
loss = calculation_loss(data, weight, bias)
gradients = gradient_descent(data, weight, bias, learning_rate)
weight = gradients[0]
bias = gradients[1]
print('iteration:{} loss:{}'.format(i + 1, loss))
如果要测试自己的数据,请根据需要修改data_path和相应的数据读入语句!
import torch
import numpy as np
def calculation_loss(data, weight, bias):
"""功能:计算损失值"""
# 定义并赋值标准输入和输出
x_input = data[:, 0]
y_input = data[:, 1]
# 计算预测值
y_predict = weight * x_input + bias
# 计算损失值
loss = torch.mean((y_predict - y_input) ** 2)
return loss
def gradient_descent(data, weight, bias, learning_rate):
"""功能:计算w和b的梯度并更新"""
# 定义并赋值标准输入和输出
x_input = data[:, 0]
y_input = data[:, 1]
# 定义损失函数
y_predict = weight * x_input + bias
loss_function = torch.mean((y_predict - y_input) ** 2)
# 用pytorch的自动求导功能计算w和b的导数
grads = torch.autograd.grad(loss_function, [weight, bias])
# 更新权值
weight = weight - learning_rate * grads[0]
bias = bias - learning_rate * grads[1]
return weight, bias
def run(data):
"""功能:进行线性回归的计算"""
# 初始化权值和一些超参数
weight = torch.tensor(0., requires_grad=True)
bias = torch.tensor(0., requires_grad=True)
num_iterations = 1000
learning_rate = 0.002
# 进行迭代计算
for i in range(num_iterations):
loss = calculation_loss(data, weight, bias)
gradients = gradient_descent(data, weight, bias, learning_rate)
weight = gradients[0]
bias = gradients[1]
print('iteration:{} loss:{}'.format(i + 1, loss))
if __name__ == '__main__':
# 引入数据
data_path = ''
data_tensor = torch.from_numpy(np.loadtxt(data_path, dtype='float', delimiter=','))
run(data_tensor)
这是小编的第一篇博客,写得稍微简略了一点,但满满都是实战干货。因为是记录学习的博客,所以小编后续应该还会更新其他的内容,如果对你有帮助,希望能点赞、关注、收藏三连!!!