pytorch日积月累2:掌握张量操作,构建简单的线性回归模型

文摘   2024-10-07 09:08   浙江  

1. 引言

在前一篇文章中,我们介绍了 PyTorch 中的 Tensor 数据类型,了解了如何创建和使用张量。在本篇文章中,我们将进一步探讨 张量的操作,并通过一个简单的 线性回归模型,展示 PyTorch 的强大计算能力。张量是深度学习的基础,掌握张量的操作将帮助我们更好地理解和构建各种机器学习模型。


2. 张量操作:基础与进阶

2.1 张量的基本操作

在深度学习模型中,张量的操作非常频繁,比如加减乘除、矩阵乘法、索引与切片等。我们先来看看如何在 PyTorch 中执行这些基本操作。

张量加法与乘法:

import torch
# 创建两个张量x = torch.tensor([1.0, 2.0, 3.0])y = torch.tensor([4.0, 5.0, 6.0])
# 张量加法z_add = x + yprint("加法结果:", z_add)
# 张量乘法z_mul = x * yprint("乘法结果:", z_mul)


矩阵乘法(点积与矩阵相乘):

# 创建矩阵a = torch.tensor([[1, 2], [3, 4]])b = torch.tensor([[5, 6], [7, 8]])
# 矩阵相乘(矩阵乘法)mat_mul = torch.matmul(a, b)print("矩阵相乘结果:\n", mat_mul)
# 矩阵与向量相乘vec_mul = torch.matmul(a, x[:2]) # 注意:x[:2] 用于取出前两个元素,形成 2x1 的向量print("矩阵与向量相乘结果:", vec_mul)


2.2 张量的索引与切片

在实际应用中,我们常常需要对张量进行部分提取或操作,PyTorch 提供了丰富的索引与切片操作方法。

# 创建一个 3x3 的张量matrix = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 取出第一行first_row = matrix[0, :]print("第一行:", first_row)
# 取出第一列first_col = matrix[:, 0]print("第一列:", first_col)
# 取出子矩阵sub_matrix = matrix[:2, 1:3]print("子矩阵:\n", sub_matrix)


2.3 张量的形状变换

在深度学习中,常常需要对张量进行维度的变换,比如将 2D 的张量拉平成 1D,或者将 1D 张量扩展为 2D 张量等。PyTorch 提供了 view()reshape() 等操作来实现这些功能。

# 创建一个 2x3 的张量tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 拉平成 1D 张量flattened_tensor = tensor.view(-1) # -1 表示自动计算维度print("拉平成 1D 的结果:", flattened_tensor)
# 重新变换为 3x2 的张量reshaped_tensor = tensor.view(3, 2)print("重新变换为 3x2 的张量:\n", reshaped_tensor)



3. 线性回归:原理与实现

3.1 什么是线性回归?

线性回归 是最基本的机器学习模型之一,用于找到输入变量与输出变量之间的线性关系。假设我们有一组数据(x,y)(x, y),我们希望找到最佳拟合的直线y = wx + b,其中
w
是权重,b是偏置项。

3.2 使用 PyTorch 实现线性回归

我们将使用 PyTorch 来实现一个简单的线性回归模型,解决一个回归问题。首先,我们需要生成一些模拟数据。

# 生成模拟数据torch.manual_seed(42)  # 为了结果可重复
# 创建数据集X = torch.rand(100, 1) * 10 # 100个样本,每个样本有1个特征Y = 2 * X + 3 + torch.randn(100, 1) # y = 2x + 3,并加上随机噪声
# 打印部分数据print("输入数据 X:", X[:5])print("目标输出 Y:", Y[:5])


3.3 定义线性回归模型

我们可以使用 torch.nn.Module 定义一个简单的线性回归模型,它包括一层线性变换,即输入直接映射到输出。

import torch.nn as nn
# 定义线性回归模型class LinearRegressionModel(nn.Module): def __init__(self): super(LinearRegressionModel, self).__init__() self.linear = nn.Linear(1, 1) # 输入特征数为1,输出也为1
def forward(self, x): return self.linear(x)
# 创建模型实例model = LinearRegressionModel()


3.4 定义损失函数和优化器

在线性回归中,我们通常使用均方误差(MSE)作为损失函数,用于衡量模型预测值与真实值之间的差距。PyTorch 提供了现成的损失函数和优化器工具。

# 定义损失函数和优化器criterion = nn.MSELoss()  # 均方误差损失函数optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # 使用随机梯度下降优化器


3.5 训练模型

我们通过循环多次遍历数据集(称为 训练周期,epoch),在每次迭代中计算预测值、损失值并更新模型参数,最终训练出一个能够较好拟合数据的模型。

# 训练模型epochs = 1000for epoch in range(epochs):    model.train()
# 前向传播:通过模型计算预测值 outputs = model(X) loss = criterion(outputs, Y) # 反向传播与优化 optimizer.zero_grad() # 清空上一步的梯度 loss.backward() # 反向传播计算梯度 optimizer.step() # 更新模型参数
# 打印损失值 if (epoch+1) % 100 == 0: print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')


3.6 结果可视化

我们可以绘制训练后的模型结果,看看拟合效果如何。

import matplotlib.pyplot as plt
# 绘制训练数据点plt.scatter(X.detach().numpy(), Y.detach().numpy(), label='True Data')
# 绘制回归直线predicted = model(X).detach().numpy() # 模型预测值plt.plot(X.detach().numpy(), predicted, 'r', label='Fitted Line')
plt.legend()plt.show()




4. 总结与展望

在本篇文章中,我们详细介绍了 PyTorch 中的张量操作,包括基本的数学运算、索引与切片、矩阵操作等。同时,我们还通过线性回归模型,展示了如何利用张量完成一个实际的机器学习任务。

不摸鱼的小律
互联网大厂算法工程师一枚,分享各种技术、职场热点和感悟。不做每日打卡的路人。
 最新文章