深度学习2-pyTorch学习-第一个神经网络

第一个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。

神经网络的训练和部署一般流程

训练模型是机器学习和深度学习中的核心过程,旨在通过大量数据学习模型参数,以便模型能够对新的、未见过的数据做出准确的预测。

训练模型通常包括以下几个步骤:

  1. 数据准备:
    收集和处理数据,包括清洗、标准化和归一化。
    将数据分为训练集、验证集和测试集。
  2. 定义模型:
    选择模型架构,例如决策树、神经网络等。
    初始化模型参数(权重和偏置)。
  3. 选择损失函数:
    根据任务类型(如分类、回归)选择合适的损失函数。
  4. 选择优化器:
    选择一个优化算法,如SGD、Adam等,来更新模型参数。
  5. 前向传播:
    在每次迭代中,将输入数据通过模型传递,计算预测输出。
  6. 计算损失:
    使用损失函数评估预测输出与真实标签之间的差异。
  7. 反向传播:
    利用自动求导计算损失相对于模型参数的梯度。
  8. 参数更新:
    根据计算出的梯度和优化器的策略更新模型参数。
  9. 迭代优化:
    重复步骤5-8,直到模型在验证集上的性能不再提升或达到预定的迭代次数。
    评估和测试:
  10. 使用测试集评估模型的最终性能,确保模型没有过拟合。
    模型调优:
  11. 根据模型在测试集上的表现进行调参,如改变学习率、增加正则化等。
  12. 部署模型:
    将训练好的模型部署到生产环境中,用于实际的预测任务。

第一个神经

网络的代码如下:

复制代码
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()      #更新参数
相关推荐
Yeats_Liao41 分钟前
评估体系构建:基于自动化指标与人工打分的双重验证
运维·人工智能·深度学习·算法·机器学习·自动化
浅念-1 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
ZH15455891311 小时前
Flutter for OpenHarmony Python学习助手实战:API接口开发的实现
python·学习·flutter
爱吃生蚝的于勒1 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
Tadas-Gao1 小时前
缸中之脑:大模型架构的智能幻象与演进困局
人工智能·深度学习·机器学习·架构·大模型·llm
奶茶精Gaaa1 小时前
工具分享--F12使用技巧
学习
2301_818730562 小时前
transformer(上)
人工智能·深度学习·transformer
久邦科技2 小时前
奈飞工厂中文官网入口,影视在线观看|打不开|电脑版下载
学习
木枷2 小时前
Online Process Reward Learning for Agentic Reinforcement Learning
人工智能·深度学习·机器学习
好好学习天天向上~~2 小时前
6_Linux学习总结_自动化构建
linux·学习·自动化