深度学习篇---深度学习中的超参数张量转换模型训练


文章目录

  • 前言
  • 第一部分:深度学习中的超参数
    • 1. 学习率(Learning Rate)
      • 定义
      • 重要性
      • 常见设置
    • 2. 批处理大小(Batch Size)
      • 定义
      • 重要性
      • 常见设置
    • 3. 迭代次数(Number of Epochs)
      • 定义
      • 重要性
      • 常见设置
    • 4. 优化器(Optimizer)
      • 定义
      • 重要性
      • 常见设置
    • 5. 损失函数(Loss Function)
      • 定义
      • 重要性
      • 常见设置
    • 6. 正则化(Regularization)
      • 定义
      • 重要性
      • 常见设置
    • 7. 网络架构(Network Architecture)
      • 定义
      • 重要性
      • 常见设置
    • PaddlePaddle中的超参数设置示例
    • PyTorch中的超参数设置示例
  • 第二部分:张量转换
    • PaddlePaddle 示例
    • PyTorch 示例
  • 第三部分:模型训练流程
    • PaddlePaddle 模型训练示例
      • 程序解释
        • 1. 导入必要的库
        • 2. 定义卷积神经网络模型
        • 3. 实例化模型
        • 4. 定义损失函数和优化器
        • 5. 训练循环
        • 6. 保存模型
    • PyTorch 模型训练示例
      • 程序解释
        • 1. 导入必要的库
        • 2. 定义卷积神经网络模型
        • 3. 实例化模型
        • 4. 定义损失函数和优化器
        • 5. 训练循环
        • 6. 保存模型
  • 总结


前言

以上就是今天要讲的内容,本文简单介绍了深度学习中的超参数以及PaddlePaddle、pytorch框架下的张量转换模型训练


第一部分:深度学习中的超参数

深度学习中,超参数模型配置的一部分,它们不是通过训练数据学习得到的,而是根据经验或实验预先设定的。以下是一些常见的超参数及其在PaddlePaddle和PyTorch框架中的详细解释:

1. 学习率(Learning Rate)

定义

定义:在优化算法中更新模型权重时的步长大小

重要性

重要性:学习率太大可能导致训练不稳定太小则可能导致训练过程缓慢。

常见设置

常见设置:通常开始时设置一个较大的学习率,然后根据训练进度进行衰减。

2. 批处理大小(Batch Size)

定义

定义:每次训练迭代中使用的样本数量

重要性

重要性:较大的批处理大小可以减少梯度估计的方差,但可能需要更多的内存。较小的批处理大小可能导致训练更不稳定

常见设置

常见设置:32, 64, 128, 256等。

3. 迭代次数(Number of Epochs)

定义

定义:整个数据集被训练模型遍历的次数

重要性

重要性:足够的迭代次数可以确保模型有足够的时间学习,但过多的迭代可能导致过拟合

常见设置

常见设置:根据数据集大小和问题的复杂性来定。

4. 优化器(Optimizer)

定义

定义:用于更新模型权重的算法

重要性

重要性:不同的优化器可能对模型的收敛速度和最终性能有显著影响。

常见设置

常见设置:SGD, Adam, RMSprop等。

5. 损失函数(Loss Function)

定义

定义:用于量化模型预测与真实值之间差异的函数

重要性

重要性:损失函数的选择直接影响模型的训练过程和性能

常见设置

常见设置:均方误差(MSE)用于回归问题交叉熵用于分类问题

6. 正则化(Regularization)

定义

定义:用于防止模型过拟合的技术

重要性

重要性:通过限制模型复杂度来提高泛化能力

常见设置

常见设置:L1正则化、L2正则化、Dropout等。

7. 网络架构(Network Architecture)

定义

定义:构成神经网络的各种层的配置。

重要性

重要性:网络架构直接影响模型的表达能力

常见设置

常见设置:卷积神经网络(CNN)用于图像任务循环神经网络(RNN)用于序列数据

PaddlePaddle中的超参数设置示例

import paddle
from paddle.optimizer import Adam
from paddle.regularizer import L2Decay

#定义模型
model = paddle.vision.models.resnet50()

#设置学习率
learning_rate = 0.001

#设置批处理大小
batch_size = 64

#设置优化器
optimizer = Adam(parameters=model.parameters(), learning_rate=learning_rate, weight_decay=L2Decay(1e-4))

#设置损失函数
loss_fn = paddle.nn.CrossEntropyLoss()

PyTorch中的超参数设置示例

import torch
import torch.nn as nn
import torch.optim as optim

#定义模型
model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet50', pretrained=False)

#设置学习率
learning_rate = 0.001

#设置批处理大小
batch_size = 64

#设置优化器
optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=1e-4)

#设置损失函数
criterion = nn.CrossEntropyLoss()

在实际应用中,超参数的设置通常需要通过多次实验和验证来确定。此外,还可以使用超参数优化技术,如网格搜索、随机搜索、贝叶斯优化等,来寻找最佳的超参数组合。

第二部分:张量转换

PaddlePaddle 示例

在PaddlePaddle中,可以使用paddle.io.Datasetpaddle.io.DataLoader来加载数据并进行批处理。

import paddle
from paddle.io import Dataset, DataLoader
from paddle.vision.transforms import ToTensor

#定义一个自定义的数据集类
class CustomDataset(Dataset):
    def __init__(self, image_paths, transform=None):
        self.image_paths = image_paths
        self.transform = transform

    def __len__(self):
        return len(self.image_paths)

    def __getitem__(self, idx):
        # 读取图像路径
        image_path = self.image_paths[idx]
        # 使用paddle.io.read_image读取图像,并转换为HWC格式
        image = paddle.io.read_image(image_path, dtype='float32')
        # 如果定义了转换,则应用转换
        if self.transform:
            image = self.transform(image)
        return image

#图像路径列表
image_paths = ['path/to/image1.jpg', 'path/to/image2.jpg']

#定义图像预处理转换
transform = ToTensor()  # 将图像转换为张量

#创建数据集实例
dataset = CustomDataset(image_paths=image_paths, transform=transform)

#创建DataLoader
data_loader = DataLoader(dataset, batch_size=32, shuffle=True)

#使用DataLoader迭代数据
for images in data_loader:
    # 这里images已经是张量格式,可以直接用于训练
    # images的形状为[batch_size, channels, height, width]
    pass

PyTorch 示例

在PyTorch中,可以使用torch.utils.data.Datasettorch.utils.data.DataLoader来加载数据并进行批处理。

import torch
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
from PIL import Image

#定义一个自定义的数据集类
class CustomDataset(Dataset):
    def __init__(self, image_paths, transform=None):
        self.image_paths = image_paths
        self.transform = transform

    def __len__(self):
        return len(self.image_paths)

    def __getitem__(self, idx):
        # 读取图像路径
        image_path = self.image_paths[idx]
        # 使用PIL库读取图像
        image = Image.open(image_path)
        # 如果定义了转换,则应用转换
        if self.transform:
            image = self.transform(image)
        return image

#图像路径列表
image_paths = ['path/to/image1.jpg', 'path/to/image2.jpg']

#定义图像预处理转换
transform = transforms.Compose([
    transforms.ToTensor(),  # 将图像转换为张量
])

#创建数据集实例
dataset = CustomDataset(image_paths=image_paths, transform=transform)

#创建DataLoader
data_loader = DataLoader(dataset, batch_size=32, shuffle=True)

#使用DataLoader迭代数据
for images in data_loader:
    # 这里images已经是张量格式,可以直接用于训练
    # images的形状为[batch_size, channels, height, width]
    pass

详细解释

  1. 自定义数据集类:CustomDataset类继承自Dataset,用于定义如何从图像路径中读取数据
  2. init 方法:初始化方法接收图像路径列表和转换函数
  3. len 方法:返回数据集中图像的数量
  4. getitem 方法:实现如何根据索引idx读取单个图像
  5. PaddlePaddle中,使用paddle.io.read_image来读取图像
  6. PyTorch中,使用PIL.Image.open来读取图像。

图像预处理转换:
7. 在PaddlePaddle中,ToTensor转换用于将图像数据转换PaddlePaddle的张量格式,其形状为**[channels, height, width]
8. 在
PyTorch中,transforms.ToTensor()同样用于将图像数据转换PyTorch的张量格式**,其形状为**[channels, height, width]
9. DataLoader:DataLoader用于
封装数据集**,提供批量加载、打乱数据集、多线程加载等功能。
10. 迭代数据:在训练循环中,通过迭代data_loader来获取批量的图像数据,这些数据已经是张量格式,可以直接用于模型的训练
在上述代码中,我们只进行了最基础的图像到张量的转换。在实际应用中,可能还需要进行其他预处理步骤,如调整图像大小、裁剪、翻转、标准化等。这些步骤可以通过在transforms.Compose中添加相应的转换来实现。

第三部分:模型训练流程

PaddlePaddle 模型训练示例

在PaddlePaddle中,我们首先定义一个简单的卷积神经网络模型,然后进行训练。

import paddle
import paddle.nn as nn
import paddle.optimizer as optim
from paddle.io import DataLoader

#定义一个简单的卷积神经网络
class SimpleCNN(nn.Layer):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2D(in_channels=3, out_channels=32, kernel_size=3)
        self.pool1 = nn.MaxPool2D(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2D(in_channels=32, out_channels=64, kernel_size=3)
        self.pool2 = nn.MaxPool2D(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(in_features=64*6*6, out_features=128)
        self.fc2 = nn.Linear(in_features=128, out_features=10)

    def forward(self, x):
        x = self.pool1(self.conv1(x))
        x = self.pool2(self.conv2(x))
        x = paddle.flatten(x, 1)  # 展平操作
        x = self.fc1(x)
        x = self.fc2(x)
        return x

#实例化模型
model = SimpleCNN()

#定义损失函数
loss_fn = nn.CrossEntropyLoss()

#定义优化器
optimizer = optim.Adam(parameters=model.parameters(), learning_rate=0.001)

#假设我们已经有了一个DataLoader
#data_loader = DataLoader(...)

#训练循环
for epoch in range(10):  # 进行10个训练周期
    for images, labels in data_loader:
        # 前向传播
        outputs = model(images)
        loss = loss_fn(outputs, labels)

        # 反向传播和优化
        loss.backward()
        optimizer.step()
        optimizer.clear_grad()

    print(f'Epoch [{epoch+1}/{10}], Loss: {loss.numpy()[0]}')

#保存模型
paddle.save(model.state_dict(), 'model.pdparams')

程序解释

1. 导入必要的库
import paddle
import paddle.nn as nn
import paddle.optimizer as optim
from paddle.io import DataLoader

这些是PaddlePaddle框架中用于构建和训练神经网络的必要模块

2. 定义卷积神经网络模型
class SimpleCNN(nn.Layer):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        # 第一层卷积,输入通道3(RGB图像),输出通道32,卷积核大小3x3
        self.conv1 = nn.Conv2D(in_channels=3, out_channels=32, kernel_size=3)
        # 第一层池化,池化窗口大小2x2,步长2
        self.pool1 = nn.MaxPool2D(kernel_size=2, stride=2)
        # 第二层卷积,输入通道32,输出通道64,卷积核大小3x3
        self.conv2 = nn.Conv2D(in_channels=32, out_channels=64, kernel_size=3)
        # 第二层池化,池化窗口大小2x2,步长2
        self.pool2 = nn.MaxPool2D(kernel_size=2, stride=2)
        # 全连接层,输入特征64*6*6(取决于输入图像大小和前面的层),输出特征128
        self.fc1 = nn.Linear(in_features=64*6*6, out_features=128)
        # 输出层,输入特征128,输出特征10(假设有10个类别)
        self.fc2 = nn.Linear(in_features=128, out_features=10)

    def forward(self, x):
        # 前向传播过程
        x = self.pool1(self.conv1(x))  # 第一层卷积和池化
        x = self.pool2(self.conv2(x))  # 第二层卷积和池化
        x = paddle.flatten(x, 1)        # 展平操作,将多维数据转换为一维
        x = self.fc1(x)                 # 第一层全连接
        x = self.fc2(x)                 # 输出层
        return x

在这个类中,我们定义了一个简单的CNN结构,包括两个卷积层、两个池化层和两个全连接层。

3. 实例化模型
model = SimpleCNN()

创建了一个SimpleCNN类的实例,即我们的模型。

4. 定义损失函数和优化器
loss_fn = nn.CrossEntropyLoss()
optimizer = optim.Adam(parameters=model.parameters(), learning_rate=0.001)

损失函数使用了交叉熵损失,适用于多分类问题。优化器选择了Adam,并设置了学习率为0.001。

5. 训练循环
for epoch in range(10):  # 进行10个训练周期
    for images, labels in data_loader:
        # 前向传播
        outputs = model(images)
        loss = loss_fn(outputs, labels)
        
        # 反向传播和优化
        loss.backward()
        optimizer.step()
        optimizer.clear_grad()

    print(f'Epoch [{epoch+1}/{10}], Loss: {loss.numpy()[0]}')

这里是一个标准的训练循环,包括前向传播、计算损失、反向传播和参数更新。每个epoch结束后,打印出当前的损失值。

6. 保存模型
paddle.save(model.state_dict(), 'model.pdparams')

训练完成后,保存模型的参数,以便后续可以加载模型进行推理或继续训练。

请注意,这段代码中的data_loader是假设已经定义好的,它应该是一个DataLoader实例,用于加载数据集并提供批处理功能。实际使用时,需要根据具体的数据集来创建DataLoader。

整体来说,这段代码展示了如何使用PaddlePaddle构建、训练和保存一个简单的CNN模型。

PyTorch 模型训练示例

在PyTorch中,我们同样定义一个简单的卷积神经网络模型,并进行训练。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader

#定义一个简单的卷积神经网络
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3)
        self.fc1 = nn.Linear(in_features=64*6*6, out_features=128)
        self.fc2 = nn.Linear(in_features=128, out_features=10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 64*6*6)  # 展平操作
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

#实例化模型
model = SimpleCNN()

#定义损失函数
loss_fn = nn.CrossEntropyLoss()

#定义优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)

#假设我们已经有了一个DataLoader
#data_loader = DataLoader(...)

#训练循环
for epoch in range(10):  # 进行10个训练周期
    for images, labels in data_loader:
        # 前向传播
        outputs = model(images)
        loss = loss_fn(outputs, labels)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    print(f'Epoch [{epoch+1}/{10}], Loss: {loss.item()}')

#保存模型
torch.save(model.state_dict(), 'model.pth')

程序解释

1. 导入必要的库
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader

这些是PyTorch框架中用于构建和训练神经网络的必要模块

2. 定义卷积神经网络模型
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        # 第一层卷积,输入通道3(RGB图像),输出通道32,卷积核大小3x3
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3)
        # 池化层,池化窗口大小2x2,步长2
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        # 第二层卷积,输入通道32,输出通道64,卷积核大小3x3
        self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3)
        # 全连接层,输入特征64*6*6(取决于输入图像大小和前面的层),输出特征128
        self.fc1 = nn.Linear(in_features=64*6*6, out_features=128)
        # 输出层,输入特征128,输出特征10(假设有10个类别)
        self.fc2 = nn.Linear(in_features=128, out_features=10)

    def forward(self, x):
        # 前向传播过程
        x = self.pool(F.relu(self.conv1(x)))  # 第一层卷积、ReLU激活和池化
        x = self.pool(F.relu(self.conv2(x)))  # 第二层卷积、ReLU激活和池化
        x = x.view(-1, 64*6*6)                 # 展平操作,将多维数据转换为一维
        x = F.relu(self.fc1(x))                # 第一层全连接和ReLU激活
        x = self.fc2(x)                        # 输出层
        return x

在这个类中,我们定义了一个简单的CNN结构,包括两个卷积层、一个池化层(两个卷积层共享同一个池化层)、两个全连接层,并在卷积层和全连接层之后使用了ReLU激活函数

3. 实例化模型
model = SimpleCNN()

创建了一个SimpleCNN类的实例,即我们的模型。

4. 定义损失函数和优化器
loss_fn = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

损失函数使用了交叉熵损失,适用于多分类问题。优化器选择了Adam,并设置了学习率为0.001

5. 训练循环
for epoch in range(10):  # 进行10个训练周期
    for images, labels in data_loader:
        # 前向传播
        outputs = model(images)
        loss = loss_fn(outputs, labels)
        
        # 反向传播和优化
        optimizer.zero_grad()  # 清空过往梯度
        loss.backward()        # 反向传播,计算当前梯度
        optimizer.step()       # 根据梯度更新网络参数

    print(f'Epoch [{epoch+1}/{10}], Loss: {loss.item()}')

这里是一个标准的训练循环,包括**前向传播、计算损失、反向传播和参数更新。**每个epoch结束后,打印出当前的损失值。

6. 保存模型
torch.save(model.state_dict(), 'model.pth')

训练完成后,保存模型的参数,以便后续可以加载模型进行推理或继续训练。

请注意,这段代码中的data_loader是假设已经定义好的,它应该是一个DataLoader实例,用于加载数据集并提供批处理功能。实际使用时,需要根据具体的数据集来创建DataLoader。另外,代码中使用了F.relu,但没有导入F模块,应该添加import torch.nn.functional as F

整体来说,这段代码展示了如何使用PyTorch构建、训练和保存一个简单的CNN模型。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了深度学习中的超参数以及PaddlePaddle、pytorch框架下的张量转换模型训练


http://www.niftyadmin.cn/n/5843170.html

相关文章

tp6用户上传的图片存储目录防木马(限制仅访问图片不可访问php文件)

问题: 最近一个旧项目中发现专供用户上传图片的uploads目录因之前上传入口限制不严格导致用户上传了php文件上来,为防止此类问题出现。除了严格限制入口文件的上传类型,又专门对此上传目录的访问权限做了一定限制。使其仅可访问除php文件外的…

亚博microros小车-原生ubuntu支持系列:22 物体识别追踪

背景知识 跟上一个颜色追踪类似。也是基于opencv的,不过背后的算法有很多 BOOSTING:算法原理类似于Haar cascades (AdaBoost),是一种很老的算法。这个算法速度慢并且不是很准。MIL:比BOOSTING准一点。KCF:速度比BOOST…

Java进阶(ElasticSearch的安装与使用)

目录 1.ElasticSearch环境搭建 elasticSearch,elastic Search head ,kibana ?二.使用ES 2.1 ?Ik分词器 ?2.2 restful与索引操作 2.3 文档操作 三.集成springboot 1.ElasticSearch环境搭建 elasticSearch,el…

把web3=区块链接,那就太小看web3,带你全面认识web3技术栈。

Web3的定义与特点 Web3,也被称为互联网的第三阶段,是建立在区块链技术、人工智能、大数据等先进技术基础上的全新互联网形态。与Web1(信息互联网)和Web2(互动互联网)相比,Web3具有更强的智能化…

双系统共用一个蓝牙鼠标

前言 由于蓝牙鼠标每次只能配置一个系统,每次切换系统后都需要重新配对,很麻烦,双系统共用一个鼠标原理就是通过windows注册表中找到鼠标每次生成的mac地址以及配置,将其转移到linux上。 解决 1. 首先进入linux系统 进行蓝牙鼠…

数据库索引:秋招面试中的经典高频题目 [特殊字符](索引原理/操作/优缺点/B+树)

在数据库的秋招面试中,索引(Index)是一个经典且高频的题目。索引的作用类似于书中的目录📖,它能够显著加快数据库查询的速度。本文将深入探讨索引的概念、作用、优缺点以及背后的数据结构,帮助你从原理到应…

第五天 初步了解ArkTS和ArkUI

初步了解ArkTS和ArkUI,可以从以下几个方面进行概述: 一、ArkTS简介 定义与关系: ArkTS是HarmonyOS(鸿蒙系统)优选的主力应用开发语言。它基于TypeScript(TS)进行扩展,兼容TS的所有特…

Android 常用命令和工具解析之Battery Historian

Batterystats是包含在 Android 框架中的一种工具,用于收集设备上的电池数据。您可以使用adb bugreport命令抓取日志,将收集的电池数据转储到开发机器,并生成可使用 Battery Historian 分析的报告。Battery Historian 会将报告从 Batterystats…