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

简介: 【深度学习】与【PyTorch实战】

一、深度学习基础



image.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.Linear、nn.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实战


image.png

3.1 数据加载与预处理

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


3.2 模型定义与训练

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


初始化模型:定义模型结构并初始化参数。

定义损失函数和优化器:选择合适的损失函数和优化算法。

训练循环:

前向传播:将输入数据传入模型,计算输出。

计算损失:使用损失函数计算预测值与真实值之间的差距。

反向传播:计算梯度,并通过优化器更新模型参数。

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用于自动求导。

image.png

相关文章
|
1月前
|
机器学习/深度学习 监控 PyTorch
深度学习工程实践:PyTorch Lightning与Ignite框架的技术特性对比分析
在深度学习框架的选择上,PyTorch Lightning和Ignite代表了两种不同的技术路线。本文将从技术实现的角度,深入分析这两个框架在实际应用中的差异,为开发者提供客观的技术参考。
49 7
|
2月前
|
机器学习/深度学习 算法 PyTorch
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
这篇文章详细介绍了多种用于目标检测任务中的边界框回归损失函数,包括IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU和WIOU,并提供了它们的Pytorch实现代码。
323 1
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
|
2月前
|
机器学习/深度学习 PyTorch 算法框架/工具
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
【10月更文挑战第1天】深度学习中,模型微调虽能提升性能,但常导致“灾难性遗忘”,即模型在新任务上训练后遗忘旧知识。本文介绍弹性权重巩固(EWC)方法,通过在损失函数中加入正则项来惩罚对重要参数的更改,从而缓解此问题。提供了一个基于PyTorch的实现示例,展示如何在训练过程中引入EWC损失,适用于终身学习和在线学习等场景。
128 4
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
|
28天前
|
机器学习/深度学习 人工智能 TensorFlow
基于TensorFlow的深度学习模型训练与优化实战
基于TensorFlow的深度学习模型训练与优化实战
82 0
|
3月前
|
机器学习/深度学习 PyTorch 调度
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
在深度学习中,学习率作为关键超参数对模型收敛速度和性能至关重要。传统方法采用统一学习率,但研究表明为不同层设置差异化学习率能显著提升性能。本文探讨了这一策略的理论基础及PyTorch实现方法,包括模型定义、参数分组、优化器配置及训练流程。通过示例展示了如何为ResNet18设置不同层的学习率,并介绍了渐进式解冻和层适应学习率等高级技巧,帮助研究者更好地优化模型训练。
206 4
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
|
2月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
101 2
|
2月前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
37 1
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
深入浅出深度学习:从基础到实战
【9月更文挑战第19天】本文将带你走进深度学习的世界,从基础概念入手,逐步深入到实战应用。我们将通过简单易懂的语言和生动的比喻,让你轻松理解深度学习的原理和应用场景。同时,我们还为你准备了一些实用的代码示例,帮助你快速入门深度学习,开启你的AI之旅。
68 10
|
3月前
|
机器学习/深度学习 数据挖掘 PyTorch
🎓PyTorch深度学习入门课:编程小白也能玩转的高级数据分析术
踏入深度学习领域,即使是编程新手也能借助PyTorch这一强大工具,轻松解锁高级数据分析。PyTorch以简洁的API、动态计算图及灵活性著称,成为众多学者与工程师的首选。本文将带你从零开始,通过环境搭建、构建基础神经网络到进阶数据分析应用,逐步掌握PyTorch的核心技能。从安装配置到编写简单张量运算,再到实现神经网络模型,最后应用于图像分类等复杂任务,每个环节都配有示例代码,助你快速上手。实践出真知,不断尝试和调试将使你更深入地理解这些概念,开启深度学习之旅。
48 1
|
3月前
|
机器学习/深度学习 人工智能 PyTorch
深度学习领域中pytorch、onnx和ncnn的关系
PyTorch、ONNX 和 NCNN 是深度学习领域中的三个重要工具或框架,它们在模型开发、转换和部署过程中扮演着不同但相互关联的角色。
209 12