【深度学习】与【PyTorch实战】

 2f8ae591c0e54bf1af949ceacd945bab.png

目录

一、深度学习基础

1.1 神经网络简介

1.2 激活函数

1.3 损失函数

1.4 优化算法

二、PyTorch基础

2.1 PyTorch简介

2.2 张量操作

2.3 构建神经网络

 2.4训练模型

2.5 模型评估

三、PyTorch实战

3.1 数据加载与预处理

3.2 模型定义与训练

3.3 模型评估与调优

3.4 模型保存与加载

四、深度学习的实际应用

4.1 图像分类

4.1.1 数据集

4.1 .2构建模型

4.1.3 训练模型 

 4.1.4 模型评估

 4.1.5 可视化

4.1.6 模型保存与加载

4.2 自然语言处理(NLP)

4.3 生成对抗网络(GAN)

五、总结


 

深度学习是机器学习的一个分支,主要通过多层神经网络进行数据特征的自动提取和建模。本文将通过PyTorch这个深度学习框架,从理论到实战,详细介绍深度学习的基本概念、模型构建、训练和评估的过程。我会包含实例和代码,以帮助理解。

一、深度学习基础

823ca3b107a3457289b98733dacec6e1.png

1.1 神经网络简介

神经网络模仿生物神经系统,由许多互联的神经元(人工神经元)组成。主要分为以下几部分:

  • 输入层:接收外部输入数据,每个神经元代表一个输入特征。
  • 隐藏层:位于输入层和输出层之间,负责提取和处理输入特征,数量和结构可以多样化。
  • 输出层:产生最终的输出,每个神经元代表一个输出结果。

神经网络通过调整各层之间的连接权重,学习数据中的模式和特征。

1.2 激活函数

激活函数引入非线性,使神经网络能够拟合复杂的函数。常用的激活函数包括:

  • Sigmoid:输出范围为(0, 1),适合用于输出层进行二分类。
  • Tanh:输出范围为(-1, 1),相比Sigmoid中心对称且梯度较大。
  • ReLU(Rectified Linear Unit):如果输入大于0则输出为输入,否则输出为0,计算简单且有效,广泛应用于隐藏层。
import torch.nn.functional as F

# ReLU激活函数
x = torch.tensor([-1.0, 0.0, 1.0])
relu = F.relu(x)
print(relu)  # tensor([0., 0., 1.])

1.3 损失函数

损失函数用于衡量模型预测值与真实值的差距,是模型优化的目标。常见的损失函数包括:

  • 均方误差损失(MSE):用于回归问题,衡量预测值与真实值之间的平方差的平均值。
  • 交叉熵损失(Cross Entropy Loss):用于分类问题,衡量预测概率分布与真实分布之间的差距。
# MSE Loss
mse_loss = nn.MSELoss()
output = torch.tensor([1.0, 2.0, 3.0])
target = torch.tensor([1.5, 2.5, 3.5])
loss = mse_loss(output, target)
print(loss)  # tensor(0.2500)

1.4 优化算法

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

优化算法用于调整模型参数,以最小化损失函数。常见的优化算法包括:

  • 随机梯度下降(SGD):通过对每个训练样本计算梯度并更新参数,计算简单,但可能会陷入局部最小值。
  • Adam:结合了动量和自适应学习率调整的方法,能够快速收敛且稳定性高,广泛应用于各种深度学习任务。

二、PyTorch基础

2.1 PyTorch简介

PyTorch是一个开源的深度学习框架,具有以下特点:

  • 动态计算图:支持即时计算,便于调试和修改模型结构。
  • 强大的自动微分:通过autograd模块实现自动求导,简化了梯度计算过程。
  • 模块化设计:提供丰富的预定义模块和函数,方便构建和训练复杂的神经网络。
  • import torch
    
    # 创建张量
    x = torch.tensor([[1, 2], [3, 4]])
    y = torch.tensor([[5, 6], [7, 8]])
    
    # 张量运算
    z = x + y
    print(z)  # tensor([[ 6,  8], [10, 12]])
    
    # 自动求导
    x = torch.tensor(2.0, requires_grad=True)
    y = x**2
    y.backward()
    print(x.grad)  # tensor(4.)

     

2.2 张量操作

张量是PyTorch的基本数据结构,类似于Numpy的多维数组,但支持GPU加速。常见的张量操作包括创建、索引、运算和自动求导。

2.3 构建神经网络

在PyTorch中,神经网络可以通过继承nn.Module类来定义。模型的各层通过nn模块提供的预定义层(如nn.Linearnn.Conv2d等)构建,forward方法定义了前向传播过程。

PyTorch中的神经网络可以通过继承nn.Module类来定义

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(1, 10)
        self.fc2 = nn.Linear(10, 1)
    
    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

net = Net()
print(net)

 2.4训练模型

以一个简单的回归任务为例,介绍模型的训练过程

# 生成数据
x = torch.linspace(0, 10, 100).view(-1, 1)
y = 2 * x + 1 + torch.randn(x.size()) * 0.5

# 定义模型、损失函数和优化器
model = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

# 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
    model.train()
    optimizer.zero_grad()
    outputs = model(x)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()

# 打印模型参数
for param in model.parameters():
    print(param.data)

2.5 模型评估

模型训练完成后,需要对模型进行评估。常用的评估指标包括准确率、精确率、召回率等

# 生成测试数据
x_test = torch.linspace(0, 10, 100).view(-1, 1)
y_test = 2 * x_test + 1 + torch.randn(x_test.size()) * 0.5

# 预测
model.eval()
with torch.no_grad():
    predictions = model(x_test)

# 可视化
import matplotlib.pyplot as plt

plt.scatter(x_test.numpy(), y_test.numpy(), label='True Data')
plt.plot(x_test.numpy(), predictions.numpy(), label='Predictions', color='red')
plt.legend()
plt.show()

三、PyTorch实战

372fc8b991bd4e0eb2367b9190219df2.png

3.1 数据加载与预处理

PyTorch提供了torchvisiontorchtext等库,用于处理常见的数据集。数据加载器(DataLoader)可以帮助我们高效地批量加载和预处理数据。

3.2 模型定义与训练

模型定义包括选择合适的层结构和激活函数。训练过程包括以下步骤:

  1. 初始化模型:定义模型结构并初始化参数。
  2. 定义损失函数和优化器:选择合适的损失函数和优化算法。
  3. 训练循环
    • 前向传播:将输入数据传入模型,计算输出。
    • 计算损失:使用损失函数计算预测值与真实值之间的差距。
    • 反向传播:计算梯度,并通过优化器更新模型参数。

3.3 模型评估与调优

训练完成后,需要对模型进行评估。常用的评估指标包括准确率、精确率、召回率和F1分数等。根据评估结果,可以调整模型结构、参数和训练策略,以提高模型性能。

3.4 模型保存与加载

训练好的模型可以保存下来,以便后续使用或部署。PyTorch提供了简单的接口来保存和加载模型,包括保存模型参数和完整模型结构。

四、深度学习的实际应用

4.1 图像分类

图像分类是计算机视觉中的一个基本任务。通过卷积神经网络(CNN)可以高效地提取图像特征并进行分类。经典的数据集包括MNIST、CIFAR-10和ImageNet等。

4.1.1 数据集

我们将使用MNIST数据集,这是一个手写数字的图像数据集。

from torchvision import datasets, transforms

transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])

train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)

train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)

4.1 .2构建模型

我们将构建一个简单的卷积神经网络(CNN)来进行图像分类。

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
        self.fc1 = nn.Linear(64*7*7, 128)
        self.fc2 = nn.Linear(128, 10)
    
    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2)
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2)
        x = x.view(-1, 64*7*7)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = CNN()

4.1.3 训练模型 

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

num_epochs = 10
for epoch in range(num_epochs):
    model.train()
    for images, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

 4.1.4 模型评估

model.eval()
correct = 0
total = 0
with torch.no_grad():
    for images, labels in test_loader:
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy: {100 * correct / total:.2f}%')

 4.1.5 可视化

# 取一些测试数据
images, labels = iter(test_loader).next()
outputs = model(images)
_, predicted = torch.max(outputs, 1)

# 显示图片和预测结果
fig = plt.figure(figsize=(10, 4))
for idx in np.arange(20):
    ax = fig.add_subplot(2, 10, idx+1, xticks=[], yticks=[])
    img = images[idx].numpy().squeeze()
    ax.imshow(img, cmap='gray')
    ax.set_title(f'{predicted[idx].item()}', color='green' if predicted[idx] == labels[idx] else 'red')
plt.show()

4.1.6 模型保存与加载

在训练完模型后,我们可以将其保存下来以便后续使用。PyTorch提供了简单的接口来保存和加载模型。

 

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

# 加载模型
model = CNN()
model.load_state_dict(torch.load('cnn_model.pth'))

4.2 自然语言处理(NLP)

在自然语言处理领域,深度学习用于文本分类、情感分析、机器翻译等任务。常用的模型包括循环神经网络(RNN)、长短期记忆网络(LSTM)和Transformer等。

import torchtext
from torchtext.data import Field, LabelField, TabularDataset, BucketIterator

# 数据预处理
TEXT = Field(tokenize='spacy', tokenizer_language='en_core_web_sm', lower=True)
LABEL = LabelField(dtype=torch.float)
datafields = [("text", TEXT), ("label", LABEL)]

train_data, test_data = TabularDataset.splits(
    path="./data", train='train.csv', test='test.csv', format='csv', skip_header=True, fields=datafields)

TEXT.build_vocab(train_data, max_size=10000, vectors="glove.6B.100d")
LABEL.build_vocab(train_data)

train_iterator, test_iterator = BucketIterator.splits(
    (train_data, test_data), batch_size=64, sort_within_batch=True, sort_key=lambda x: len(x.text), device='cuda')

# 构建模型
class RNN(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim):
        super(RNN, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.rnn = nn.LSTM(embedding_dim, hidden_dim)
        self.fc = nn.Linear(hidden_dim, output_dim)
    
    def forward(self, x):
        embedded = self.embedding(x)
        output, (hidden, cell) = self.rnn(embedded)
        hidden = torch.squeeze(hidden[-1, :, :])
        return self.fc(hidden)

# 初始化模型
vocab_size = len(TEXT.vocab)
embedding_dim = 100
hidden_dim = 256
output_dim = 1
model = RNN(vocab_size, embedding_dim, hidden_dim, output_dim)

# 使用预训练的词向量
pretrained_embeddings = TEXT.vocab.vectors
model.embedding.weight.data.copy_(pretrained_embeddings)

# 定义损失函数和优化器
optimizer = optim.Adam(model.parameters())
criterion = nn.BCEWithLogitsLoss()

# 训练模型
model = model.to('cuda')
criterion = criterion.to('cuda')

num_epochs = 5
for epoch in range(num_epochs):
    model.train()
    for batch in train_iterator:
        optimizer.zero_grad()
        predictions = model(batch.text).squeeze(1)
        loss = criterion(predictions, batch.label)
        loss.backward()
        optimizer.step()

# 评估模型
model.eval()
with torch.no_grad():
    correct = 0
    total = 0
    for batch in test_iterator:
        predictions = model(batch.text).squeeze(1)
        rounded_preds = torch.round(torch.sigmoid(predictions))
        correct += (rounded_preds == batch.label).float().sum()
        total += batch.label.size(0)
    accuracy = correct / total
    print(f'Accuracy: {accuracy.item():.4f}')

4.3 生成对抗网络(GAN)

生成对抗网络(GAN)通过生成器和判别器的对抗性训练,可以生成逼真的图像、文本和其他数据。GAN在图像生成、图像修复、数据增强等方面有广泛应用。

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

# 定义生成器
class Generator(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(Generator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(input_dim, 128),
            nn.ReLU(),
            nn.Linear(128, output_dim),
            nn.Tanh()
        )
    
    def forward(self, x):
        return self.model(x)

# 定义判别器
class Discriminator(nn.Module):
    def __init__(self, input_dim):
        super(Discriminator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(input_dim, 128),
            nn.LeakyReLU(0.2),
            nn.Linear(128, 1),
            nn.Sigmoid()
        )
    
    def forward(self, x):
        return self.model(x)

# 初始化模型
latent_dim = 100
img_dim = 28 * 28
generator = Generator(latent_dim, img_dim)
discriminator = Discriminator(img_dim)

# 定义损失函数和优化器
adversarial_loss = nn.BCELoss()
optimizer_G = optim.Adam(generator.parameters(), lr=0.0002)
optimizer_D = optim.Adam(discriminator.parameters(), lr=0.0002)

# 训练GAN
num_epochs = 20000
for epoch in range(num_epochs):
    # 训练判别器
    real_imgs = torch.randn(64, img_dim)  # 使用随机数据代替真实图像
    valid = torch.ones(64, 1)
    fake = torch.zeros(64, 1)
    
    optimizer_D.zero_grad()
    real_loss = adversarial_loss(discriminator(real_imgs), valid)
    z = torch.randn(64, latent_dim)
    gen_imgs = generator(z)
    fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake)
    d_loss = (real_loss + fake_loss) / 2
    d_loss.backward()
    optimizer_D.step()
    
    # 训练生成器
    optimizer_G.zero_grad()
    g_loss = adversarial_loss(discriminator(gen_imgs), valid)
    g_loss.backward()
    optimizer_G.step()
    
    if epoch % 1000 == 0:
        print(f'Epoch {epoch}, D loss: {d_loss.item()}, G loss: {g_loss.item()}')

五、总结

深度学习是一种基于人工神经网络的机器学习方法,模拟人脑神经元的工作机制,通过多层神经元的组合进行数据特征的提取和模式识别。神经网络由输入层、隐藏层和输出层组成。输入层接收外部数据,隐藏层对数据进行特征提取和非线性变换,输出层生成预测结果。神经网络通过调整神经元之间的连接权重来学习数据中的模式和规律。

PyTorch是一个开源的深度学习框架,以其动态计算图和易用性而广受欢迎。PyTorch的基本数据结构是张量,类似于Numpy的多维数组,但支持GPU加速。PyTorch的核心模块包括torch用于张量操作,torch.nn用于构建神经网络,torch.optim用于定义优化算法,以及torch.autograd用于自动求导。 

0b358190167a4401ad8bd1408871d229.png

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/638240.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

618购物节快递量激增,EasyCVR视频智能分析助力快递网点智能升级

随着网络618购物节的到来,物流仓储与快递行业也迎来业务量暴增的情况。驿站网点和快递门店作为物流体系的重要组成部分,其安全性和运营效率日益受到关注。为了提升这些场所的安全防范能力和服务水平,实施视频智能监控方案显得尤为重要。 一、…

领券拿外卖返利红包,最低0元吃外卖

小蚕荟是利用本地资源和自媒体优势构建的“本地生活服务”平台,总部位于杭州,旨在为用户提供热门的吃喝玩乐本地生活服务类产品。布局已覆盖杭州、南京、上海等一二线城市。 小蚕荟是一款专为用户吃外卖省钱的生活工具,单单可返利15元起&…

【教学类-58-03】黑白三角拼图03(4*4宫格)总数算不出+随机抽取10张

背景需求: 【教学类-58-01】黑白三角拼图01(2*2宫格)256种-CSDN博客文章浏览阅读318次,点赞10次,收藏12次。【教学类-58-01】黑白三角拼图01(2*2宫格)256种https://blog.csdn.net/reasonsummer/…

数组-求和为k的连续子数组

一、题目描述 二、题目思路 这里注意:题目要求时间、空间复杂度都为O(n),所以不能直接通过双层循环来暴力解(时间复杂度为O(n)),可以使用Map实现。 1. 遍历数组计算sum(i),Map记录sum值第一次出现的位置&…

STM32 MAP文件结合固件文件分析

文章目录 加载域的结束地址并不是固件的结束地址?ROM中执行域的描述RAM中执行域的描述问题分析 中断向量表在固件中的存储位置代码段在固件中的位置只读数据Regin$$Table RW Data段其中的内部机理 总结 MAP 文件分析可以参考之前的文章 程序代码在未运行时在存储器…

LeetCode刷题之HOT100之多数元素

2024/5/21 起床走到阳台,外面绵柔细雨,手探出去,似乎感受不到。刚到实验室,窗外声音放大,雨大了。昨天的两题任务中断了,由于下雨加晚上有课。这样似乎也好,不让我有一种被强迫的感觉&#xff0…

SpringCloud Alibaba Nacos分类配置--多方案配置隔离

文章目录 Nacos 分类配置(实现配置隔离)1.DataID 方案需求分析/图解配置实现测试 2.Group 方案需求分析/图解配置实现修改application.yml修改bootstrap.yml测试 3.Namespace 方案需求分析/图解配置实现修改application.yml修改bootstrap.yml测试 Namespace/Group/Data ID 关系…

基于springboot+vue+Mysql的逍遥大药房管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

EfficientSAM分割对象后求其中图像中的高

1 分割对象 EfficientSAM https://github.com/yformer/EfficientSAM 2 计算在图像中最高点即y值最小点 import os import cv2def read_images(folder_path):image_files [f for f in os.listdir(folder_path) iff.endswith(".jpg") or f.endswith(".png&quo…

文心智能体-恋爱专家

⭐简单说两句⭐ ✨ 正在努力的小叮当~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! &a…

邮件系统数据面临的安全问题及解决方法

随着电子邮件的普及,邮件系统已成为企业、学校、个人等用户之间进行信息交流的重要工具。然而,随着数据量的增加和用户对邮件系统的依赖,邮件系统数据安全问题也逐渐凸显。下面U-Mail技术张工就给大家讲解一下邮件系统数据面临的主要安全问题…

CCF-GESP 等级考试 2023年9月认证C++四级真题

2023年9月 一、单选题(每题2分,共30分) 第 1 题 ⼈们所使⽤的⼿机上安装的App通常指的是( )。 A. ⼀款操作系统B. ⼀款应⽤软件C. ⼀种通话设备D. 以上都不对 第 2 题 下列流程图的输出结果是?( ) A. 9B.…

【30天精通Prometheus:一站式监控实战指南】第4天:node_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们👋   欢迎加入【30天精通Prometheus】专栏!📚 在这里,我们将探索Prometheus的强大功能,并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。🚀   Prometheus是云原生和DevOps的…

搜索插入位置 ---- 二分查找

题目链接 题目: 分析: 因为数排序数组, 所以具有"二段性", 可以使用二分查找题目中, 我们如果找到目标值 , 则返回下标, 如果没找到目标值, 应该返回的是>target的第一个位置, 所以应该将数组分成< target 和 > target当<target时, 应该移动left, left…

3DMax

先转换为可编辑多边形 按“1”选择为点&#xff0c;点击目标焊接&#xff08;CtrlShiftw&#xff09;&#xff0c;然后点击一个顶点拉到另一个定点上&#xff1b; 选择一个面&#xff0c;点击塌陷&#xff08;CtrlAltC&#xff09;&#xff0c;四点合并为一个点&#xff1b; …

《艺术大观》知网艺术刊:可加急, 出刊上网快

《艺术大观》 《艺术大观》征文通知 《艺术大观》期刊诚邀学者、艺术家和文化工作者积极投稿&#xff0c;共同探索艺术领域的前沿问题&#xff0c;促进学术交流和艺术创作的发展。我们欢迎各类艺术形式的研究与评论&#xff0c;包括但不限于绘画、雕塑、音乐、舞蹈、戏剧、电…

代码随想录算法训练营第三十四天 | 理论基础、455.分发饼干、376、摆动序列、53.最大子序和

目录 理论基础 455.分发饼干 思路 代码 376.摆动序列 思路 代码 53.最大子序和 思路 代码 理论基础 代码随想录 455.分发饼干 代码随想录 思路 可以是大饼干优先满足大胃口&#xff0c;也可以是小饼干优先满足小胃口。 代码 class Solution:def findContentChildre…

springsecurity入门登录授权

①我们需要自定义登陆接口&#xff0c;也就是在controller目录新建LoginController类&#xff0c;在controller方法里面去调用service接口&#xff0c;在service接口实现AuthenticationManager去进行用户的认证&#xff0c;注意&#xff0c;我们定义的controller方法要让Spring…

在Windows操作系统中克隆SD卡的简单方法!

如今&#xff0c;在数据备份和传输方面&#xff0c;SD卡克隆软件发挥着重要作用。本文将向大家介绍一款好用的Windows SD卡克隆软件&#xff0c;可以帮助你轻松将数据克隆到新卡中。 为什么需要在Windows中进行SD卡克隆&#xff1f; 在许多情况下&#xff0c;你可能需要将SD卡…

react中怎么为props设置默认值

在React中&#xff0c;你可以使用ES6的类属性&#xff08;class properties&#xff09;或者函数组件中的默认参数&#xff08;default parameters&#xff09;来定义props的默认值。 1.类组件中定义默认props 对于类组件&#xff0c;你可以在组件内部使用defaultProps属性来…