系列文章目录
机器学习笔记——梯度下降、反向传播
机器学习笔记——用pytorch实现线性回归
机器学习笔记——pytorch实现逻辑斯蒂回归Logistic regression
机器学习笔记——多层线性(回归)模型 Multilevel (Linear Regression) Model
深度学习笔记——pytorch构造数据集 Dataset and Dataloader
深度学习笔记——pytorch解决多分类问题 Multi-Class Classification
深度学习笔记——pytorch实现卷积神经网络CNN
深度学习笔记——卷积神经网络CNN进阶
深度学习笔记——循环神经网络 RNN
深度学习笔记——pytorch实现GRU
前言
参考视频——B站刘二大人《pytorch深度学习实践》
pytorch使用的官方文档
一、流程设计
1.数据准备
用pytorch可以帮助我们计算梯度和loss,所以我们更多关注的是怎么构建计算图。
确定输入x和输出y的维度,就可以退出权重w和偏移量b的维度。在loss调用backward就可以通过反向传播计算出梯度,并通过梯度下降更新权重。
注意:loss必须是一个标量。
2.模型设计
用类来继承模板,继承torch中的module。
继承module至少必须实现init和forward方法。backward由module自动实现。
注:module的回调函数__call__会自动调用forward函数,因此model(x)==model.forward(x)
Linear的构造函数。
in_features:输入样本的维度
out_features:输出样本的维度
注:矩阵的列表示维度,矩阵的行表示样本,如:5X3的矩阵,表示有5个样本,每个样本的维度是3。
bias:表示需不需要偏置量,默认为True。
Linear也是继承于module,Linear包含权重和偏置量。
3.损失值和优化器
MSELoss也是继承于medoule,求损失值
size_average:是否需要求均值
reduce:是否需要降维,降成一维的标量
优化器,对模型里的参数进行优化,学习率设为0.01
pytorch里提供了多种优化器
4.训练
1.求预测值
2.求loss值
3.反向传播
4.更新参数
二、代码
#!/user/bin/env python3
# -*- coding: utf-8 -*-
"""
基于pytorch实现线性回归
"""
import torch
# 数据集
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
# 模型设计
class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel, self).__init__() # 调用父类构造
self.linear = torch.nn.Linear(1, 1) # 创建Linear对象,Linear也是继承于module,Linear包含权重和偏置量
def forward(self, x):
y_pred = self.linear(x)
return y_pred
if __name__ == '__main__':
# 模型
model = LinearModel()
# 优化
criterion = torch.nn.MSELoss(size_average=False) # loss函数,不求损失的平均值
optimizer = torch.optim.SGD(model.parameters(),
lr=0.01) # 优化器,优化model中的所有参数,学习率为0.01. 在我们的model中只有Linear,Linear只有权重和偏置量两个参数
# 训练
for epoch in range(100):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print('epoch:', epoch, 'loss:', loss.item())
optimizer.zero_grad() # 梯度归零
loss.backward() # 反向传播,求出梯度
optimizer.step() # 更新参数
# 输出
print('w=', model.linear.weight.item())
print('b=', model.linear.bias.item())
# 测试集
x_test = torch.Tensor([[4.0]])
# 测试
y_test = model(x_test)
print('predict(after training):', y_test.item())
运行结果: