PyTorch 主要有以下几个基础概念张量Tensor、自动求导Autograd、神经网络模块nn.Module、优化器optim等。张量Tensor张量Tensor是 PyTorch 中的核心数据结构用于存储和操作多维数组。张量可以视为一个多维数组支持加速计算的操作。在 PyTorch 中张量的概念类似于 NumPy 中的数组但是 PyTorch 的张量可以运行在不同的设备上比如 CPU 和 GPU这使得它们非常适合于进行大规模并行计算特别是在深度学习领域。维度Dimensionality张量的维度指的是数据的多维数组结构。例如一个标量0维张量是一个单独的数字一个向量1维张量是一个一维数组一个矩阵2维张量是一个二维数组以此类推。形状Shape张量的形状是指每个维度上的大小。例如一个形状为(3, 4)的张量意味着它有3行4列。数据类型Dtype张量中的数据类型定义了存储每个元素所需的内存大小和解释方式。PyTorch支持多种数据类型包括整数型如torch.int8、torch.int32、浮点型如torch.float32、torch.float64和布尔型torch.bool。张量创建import torch# 创建一个 2x3 的全 0 张量a torch.zeros(2, 3)print(a)# 创建一个 2x3 的全 1 张量b torch.ones(2, 3)print(b)# 创建一个 2x3 的随机数张量c torch.randn(2, 3)print(c)# 从 NumPy 数组创建张量import numpy as npnumpy_array np.array([[1, 2], [3, 4]])tensor_from_numpy torch.from_numpy(numpy_array)print(tensor_from_numpy)# 在指定设备CPU/GPU上创建张量device torch.device(cuda if torch.cuda.is_available() else cpu)d torch.randn(2, 3, devicedevice)print(d)常用张量操作import torch# 张量相加e torch.randn(2, 3)f torch.randn(2, 3)print(e)print(f)print(e f)# 逐元素乘法print(e * f)# 张量的转置g torch.randn(3, 2)print(g)print(g.t()) # 或者 g.transpose(0, 1)# 张量的形状print(g.shape)# 返回形状梯度和自动微分PyTorch的张量支持自动微分。当创建一个需要梯度的张量时PyTorch可以自动计算其梯度import torch# 创建一个需要梯度的张量tensor_requires_grad torch.tensor([3.0], requires_gradTrue)print(tensor_requires_grad)# 进行一些操作tensor_result tensor_requires_grad * 3print(tensor_result)# 计算梯度tensor_result.backward()print(tensor_requires_grad.grad) # 输出梯度自动求导AutogradPyTorch 提供了自动求导功能通过autograd模块来自动计算梯度。torch.Tensor对象有一个 requires_grad 属性用于指示是否需要计算该张量的梯度。当你创建一个 requires_gradTrue 的张量时PyTorch 会自动跟踪所有对它的操作以便在之后计算梯度。创建需要梯度的张量:import torch # 创建一个需要计算梯度的张量 x torch.randn(2, 2, requires_gradTrue) print(x) # 执行某些操作 y x 2 z y * y * 3 out z.mean() print(out)定义了计算图可以通过 .backward() 方法来计算梯度。在神经网络训练中自动求导主要用于实现反向传播算法。# 反向传播计算梯度out.backward()# 查看 x 的梯度print(x.grad)神经网络nn.Module神经网络nn.Module神经网络是一种模仿人脑神经元连接的计算模型由多层节点神经元组成用于学习数据之间的复杂模式和关系。神经网络通过调整神经元之间的连接权重来优化预测结果这一过程涉及前向传播、损失计算、反向传播和参数更新。神经网络的类型包括前馈神经网络、卷积神经网络CNN、循环神经网络RNN和长短期记忆网络LSTM它们在图像识别、语音处理、自然语言处理等多个领域都有广泛应用。PyTorch 提供了一个非常方便的接口来构建神经网络模型即 torch.nn.Module。我们可以继承 nn.Module 类并定义自己的网络层。创建一个简单的神经网络import torch.nn as nnimport torchimport torch.optim as optim# 定义一个简单的全连接神经网络class SimpleNN(nn.Module):def __init__(self):super(SimpleNN, self).__init__()self.fc1 nn.Linear(2, 2) # 输入层到隐藏层self.fc2 nn.Linear(2, 1) # 隐藏层到输出层def forward(self, x):x torch.relu(self.fc1(x)) # ReLU 激活函数x self.fc2(x)return x# 创建网络实例model SimpleNN()# 打印模型结构print(model)前向传播与损失计算# 随机输入x torch.randn(1, 2)# 前向传播output model(x)print(output)# 定义损失函数例如均方误差 MSEcriterion nn.MSELoss()# 假设目标值为 1target torch.randn(1, 1)# 计算损失loss criterion(output, target)print(loss)优化器Optimizers优化器在训练过程中更新神经网络的参数以减少损失函数的值。使用优化器进行参数更新# 定义优化器使用 Adam 优化器optimizer optim.Adam(model.parameters(), lr0.001)# 训练步骤optimizer.zero_grad() # 清空梯度loss.backward() # 反向传播optimizer.step() # 更新参数训练模型import torch import torch.nn as nn import torch.optim as optim # 1. 定义一个简单的神经网络模型 class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.fc1 nn.Linear(2, 2) # 输入层到隐藏层 self.fc2 nn.Linear(2, 1) # 隐藏层到输出层 def forward(self, x): x torch.relu(self.fc1(x)) # ReLU 激活函数 x self.fc2(x) return x # 2. 创建模型实例 model SimpleNN() # 3. 定义损失函数和优化器 criterion nn.MSELoss() # 均方误差损失函数 optimizer optim.Adam(model.parameters(), lr0.001) # Adam 优化器 # 4. 假设我们有训练数据 X 和 Y X torch.randn(10, 2) # 10 个样本2 个特征 Y torch.randn(10, 1) # 10 个目标值 # 5. 训练循环 for epoch in range(100): # 训练 100 轮 optimizer.zero_grad() # 清空之前的梯度 output model(X) # 前向传播 loss criterion(output, Y) # 计算损失 loss.backward() # 反向传播 optimizer.step() # 更新参数 # 每 10 轮输出一次损失 if (epoch 1) % 10 0: print(fEpoch [{epoch 1}/100], Loss: {loss.item():.4f})在每 10 轮程序会输出当前的损失值帮助我们跟踪模型的训练进度。随着训练的进行损失值应该会逐渐降低表示模型在不断学习并优化其参数。训练模型是一个迭代的过程需要不断地调整和优化直到达到满意的性能。这个过程涉及到大量的实验和调优目的是使模型在新的、未见过的数据上也能有良好的泛化能力。设备DevicePyTorch 允许你将模型和数据移动到 GPU 上进行加速。使用 torch.device 来指定计算设备。将模型和数据移至 GPU:device torch.device(cuda if torch.cuda.is_available() else cpu)# 将模型移动到设备model.to(device)# 将数据移动到设备X X.to(device)Y Y.to(device)