个人主页:Icomi
专栏地址:PyTorch入门
在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术,能够处理复杂的数据模式。通过 PyTorch,我们可以轻松搭建各类神经网络模型,实现从基础到高级的人工智能应用。接下来,就让我们一同走进 PyTorch 的世界,探索神经网络与人工智能的奥秘。本系列为PyTorch入门文章,若各位大佬想持续跟进,欢迎与我交流互关。
回顾我们在机器学习的学习历程,线性回归模型就像是一座重要的基石,为我们开启了预测和数据分析的大门。当初,我们使用 scikit-learn 的 API 来应用这个模型,感受了它在处理数据、进行预测方面的强大能力。那时候,scikit-learn 就像一位贴心的助手,为我们封装好了许多复杂的操作,让我们能够快速上手使用线性回归模型。
然而,深度学习的世界充满了无限的可能性,PyTorch 作为一个强大的深度学习框架,为我们提供了更加灵活和深入的方式来探索和实现线性回归模型。在本章节,我们将迎来一个全新的挑战与机遇 —— 使用 PyTorch 的 API 来手动构建一个线性回归模型的各个关键部分。
我们要从零开始,亲手构建一个线性回归的假设函数,这就如同我们要亲手设计一把精准的测量工具,去探索数据之间的关系。接着,我们还要搭建数据加载器,它就像是一个高效的 “数据搬运工”,把数据有序地输送到模型中进行处理。
损失函数在这个过程中也至关重要,它就像一个 “质量检测员”,衡量着我们模型的预测结果与真实数据之间的差距,帮助我们判断模型的好坏。而优化方法,则像是一位 “智能调优师”,根据损失函数的反馈,不断调整模型的参数,让模型的预测更加准确。
我们还要绘制出训练过程中的损失变化,这就像是绘制一幅模型成长的 “轨迹图”,让我们能够直观地看到模型在训练过程中是如何不断优化和进步的。
1. 构建数据集
import torch
from sklearn.datasets import make_regression
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
import random
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 数据集函数
def create_dataset():
x, y, coef = make_regression(n_samples=100,
n_features=1,
noise=10,
coef=True,
bias=14.5,
random_state=0)
# 转换为张量
x = torch.tensor(x)
y = torch.tensor(y)
return x, y, coef
# 构建数据加载器
def data_loader(x, y, batch_size):
data_len = len(y)
data_index = list(range(data_len))
random.shuffle(data_index)
batch_number = data_len // batch_size
for idx in range(batch_number):
start = idx * batch_size
end = start + batch_size
batch_train_x = x[start: end]
batch_train_y = y[start: end]
yield batch_train_x, batch_train_y
2. 构建假设函数
# 模型参数
w = torch.tensor(0.1, requires_grad=True, dtype=torch.float64)
b = torch.tensor(0.0, requires_grad=True, dtype=torch.float64)
def linear_regression(x):
return w * x + b
3. 损失函数
def square_loss(y_pred, y_true):
return (y_pred - y_true) ** 2
4. 优化方法
def sgd(lr=0.01):
# 使用批量样本的平均梯度
w.data = w.data - lr * w.grad.data / 16
b.data = b.data - lr * b.grad.data / 16
5. 训练函数
def train():
# 加载数据集
x, y, coef = create_dataset()
# 定义训练参数
epochs = 100
learning_rate = 0.01
# 存储损失
epoch_loss = []
total_loss = 0.0
train_sample = 0
for _ in range(epochs):
for train_x, train_y in data_loader(x, y, 16):
# 训练数据送入模型
y_pred = linear_regression(train_x)
# 计算损失值
loss = square_loss(y_pred, train_y.reshape(-1, 1)).sum()
total_loss += loss.item()
train_sample += len(train_y)
# 梯度清零
if w.grad is not None:
w.grad.data.zero_()
if b.grad is not None:
b.grad.data.zero_()
# 反向传播
loss.backward()
# 更新参数
sgd(learning_rate)
print('loss: %.10f' % (total_loss / train_sample))
epoch_loss.append(total_loss / train_sample)
# 绘制拟合直线
print(coef, w.data.item())
plt.scatter(x, y)
x = torch.linspace(x.min(), x.max(), 1000)
y1 = torch.tensor([v * w + 14.5 for v in x])
y2 = torch.tensor([v * coef + 14.5 for v in x])
plt.plot(x, y1, label='训练')
plt.plot(x, y2, label='真实')
plt.grid()
plt.legend()
plt.show()
# 打印损失变化曲线
plt.plot(range(epochs), epoch_loss)
plt.title('损失变化曲线')
plt.grid()
plt.show()
调用 train 函数, 最后输出的结果为: