学习笔记之Pytorch:线性回归的实现

学习笔记之Pytorch:线性回归的实现

  • 写在前面
  • Pytorch实现
    • loss的计算
    • 梯度下降
    • 迭代计算
    • 完整代码
  • 写在后面

写在前面

小编写博客的初心是为了记录自己的学习历程,所以以下内容可能会有不严谨的地方,如果各位大佬发现内容有错或者有更好的方法,欢迎在评论区留言,一起进步!

Pytorch实现

本文只涉及线性回归代码的实现,不会太多的涉及到线性回归到数学原理,如果需要了解线性回归原理,可以在CSDN上搜索,有很多好的文章可供参考!

loss的计算

在计算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)

写在后面

这是小编的第一篇博客,写得稍微简略了一点,但满满都是实战干货。因为是记录学习的博客,所以小编后续应该还会更新其他的内容,如果对你有帮助,希望能点赞、关注、收藏三连!!!

你可能感兴趣的:(学习笔记之Pytorch,python,机器学习,人工智能)