第一个PyTorch神经网络代码
面向对象编程OOP
首先,我们来理解一下类(Class)和对象(Object):
-
类(Class)是创建对象的蓝图或模板。它定义了一组属性(变量)和方法(函数),这些属性和方法属于该类创建的任何对象。
-
对象(Object)是类的实例。当根据类创建对象时,每个对象都拥有类中定义的属性和方法。
self是类的实例(对象)的引用。
fc1是实例的一个属性,
什么是方法的应用
x.y 表示访问对象的属性y。
x.y(z1,z2),这表示调用对象x的方法y,并传入参数z1,z2。注意,这里的y是一个方法(函数)。
在python中,函数也是一等公民,可以像变量一样传递,当传递函数的时候,是不需要括号的:
# 当你想:
# 1. 执行函数/方法 → 用括号
# 2. 传递函数/方法本身 → 不用括号
# 例子:
func = torch.relu # 把relu函数赋值给func(不用括号)
result = func(tensor) # 使用func计算(用括号)
result2 = torch.relu(tensor) # 直接使用(用括号)
def _init(self)
是一个特殊的方法,被称为"构造方法"或"初始化方法"。当你创建一个类的实例(对象)时,Python会自动调用这个方法。它的作用是初始化对象的属性。
self
在Python类的方法中是一个指向对象实例本身的引用。它是一个约定俗成的名称(你可以用其他名字,但强烈建议使用self)。当你调用一个对象的方法时,Python会自动将对象实例作为第一个参数传递给该方法,这个参数就是self。
神经网络的训练和部署一般流程
训练模型是机器学习和深度学习中的核心过程,旨在通过大量数据学习模型参数,以便模型能够对新的、未见过的数据做出准确的预测。
训练模型通常包括以下几个步骤:
- 数据准备:
收集和处理数据,包括清洗、标准化和归一化。
将数据分为训练集、验证集和测试集。 - 定义模型:
选择模型架构,例如决策树、神经网络等。
初始化模型参数(权重和偏置)。 - 选择损失函数:
根据任务类型(如分类、回归)选择合适的损失函数。 - 选择优化器:
选择一个优化算法,如SGD、Adam等,来更新模型参数。 - 前向传播:
在每次迭代中,将输入数据通过模型传递,计算预测输出。 - 计算损失:
使用损失函数评估预测输出与真实标签之间的差异。 - 反向传播:
利用自动求导计算损失相对于模型参数的梯度。 - 参数更新:
根据计算出的梯度和优化器的策略更新模型参数。 - 迭代优化:
重复步骤5-8,直到模型在验证集上的性能不再提升或达到预定的迭代次数。
评估和测试: - 使用测试集评估模型的最终性能,确保模型没有过拟合。
模型调优: - 根据模型在测试集上的表现进行调参,如改变学习率、增加正则化等。
- 部署模型:
将训练好的模型部署到生产环境中,用于实际的预测任务。
第一个神经
网络的代码如下:
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的全连接神经网络
class SimplenNN(nn.Module):
def __init__(self):
super(SimplenNN, 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 = SimplenNN()
# 打印模型结构
print(model)
模块和类
nn是一个模块(Module),它包含了许多类、函数和其他模块。nn.Module是一个类,它是所有的神经网络的模块的基类。
nn.Module也是一个类,它继承自nn.Module。其层次结构如下:
torch.nn (模块,包含很多类)
├── nn.Module (类:所有神经网络组件的基类)
│ ├── nn.Linear (类:线性层,继承自Module)
│ ├── nn.Conv2d (类:卷积层,继承自Module)
│ ├── nn.ReLU (类:激活函数,继承自Module)
│ └── ... 其他200多个类
继承
类似于class 子类名(父类名)的格式就代表了一种继承。
class SimplenNN()定义了一个类,该类继承了nn.Module
super(SimplenNN, self).init () 作用是继承父类的功能。
nn.Linear(2,2)仅仅是创建对象,
神经网络基类 nn.Module
nn.Module是PyTorch中所有神经网络模块的基类,它提供了一些必要的机制,例如
- 将模型迁移到GPU
- 保存加载模型
- 提供一些必要的魔法方法
- 管理网络的参数(通过parameters())
网络的前向传播与计算损失函数
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的全连接神经网络
class SimplenNN(nn.Module):
def __init__(self):
super(SimplenNN, 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 = SimplenNN()
# 打印模型结构
print(model)
# 随机输入
x = torch.randn(1,2)
# 前向传播
output = model(x)
print(output)
# 定义损失函数
criterion = nn.MSELoss() # 均方根误差
#假设目标值
target = torch.randn(1,1)
print(target)
#计算损失函数
loss = criterion(output, target)
print(loss)
输出一下网络的输出、真实值、损失函数值
tensor([[0.1357]], grad_fn=<AddmmBackward0>)
tensor([[-1.4453]])
tensor(2.4993, grad_fn=<MseLossBackward0>)
可以3个数对应上了。
网络的训练
下面展示1次训练的代码,首先是定义优化器,然后依次:清空梯度、反向传播、更新参数:
#定义优化器(使用Adam优化器)
optimizer = optim.Adam(model.parameters())
# 训练步骤
optimizer.zero_grad() #清空梯度
loss.backward() #反向传播
optimizer.step() #更新参数