【深度学习】与【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

相关文章
|
2月前
|
机器学习/深度学习 人工智能 PyTorch
PyTorch深度学习 ? 带你从入门到精通!!!
🌟 蒋星熠Jaxonic,深度学习探索者。三年深耕PyTorch,从基础到部署,分享模型构建、GPU加速、TorchScript优化及PyTorch 2.0新特性,助力AI开发者高效进阶。
PyTorch深度学习 ? 带你从入门到精通!!!
|
2月前
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow与PyTorch深度对比分析:从基础原理到实战选择的完整指南
蒋星熠Jaxonic,深度学习探索者。本文深度对比TensorFlow与PyTorch架构、性能、生态及应用场景,剖析技术选型关键,助力开发者在二进制星河中驾驭AI未来。
650 13
|
3月前
|
机器学习/深度学习 数据采集 人工智能
PyTorch学习实战:AI从数学基础到模型优化全流程精解
本文系统讲解人工智能、机器学习与深度学习的层级关系,涵盖PyTorch环境配置、张量操作、数据预处理、神经网络基础及模型训练全流程,结合数学原理与代码实践,深入浅出地介绍激活函数、反向传播等核心概念,助力快速入门深度学习。
224 1
|
3月前
|
机器学习/深度学习 存储 PyTorch
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
Neural ODE将神经网络与微分方程结合,用连续思维建模数据演化,突破传统离散层的限制,实现自适应深度与高效连续学习。
196 3
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
|
2月前
|
机器学习/深度学习 数据采集 人工智能
深度学习实战指南:从神经网络基础到模型优化的完整攻略
🌟 蒋星熠Jaxonic,AI探索者。深耕深度学习,从神经网络到Transformer,用代码践行智能革命。分享实战经验,助你构建CV、NLP模型,共赴二进制星辰大海。
|
4月前
|
PyTorch 算法框架/工具 异构计算
PyTorch 2.0性能优化实战:4种常见代码错误严重拖慢模型
我们将深入探讨图中断(graph breaks)和多图问题对性能的负面影响,并分析PyTorch模型开发中应当避免的常见错误模式。
296 9
|
6月前
|
机器学习/深度学习 存储 PyTorch
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
本文通过使用 Kaggle 数据集训练情感分析模型的实例,详细演示了如何将 PyTorch 与 MLFlow 进行深度集成,实现完整的实验跟踪、模型记录和结果可复现性管理。文章将系统性地介绍训练代码的核心组件,展示指标和工件的记录方法,并提供 MLFlow UI 的详细界面截图。
287 2
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
|
10月前
|
机器学习/深度学习 数据可视化 算法
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
神经常微分方程(Neural ODEs)是深度学习领域的创新模型,将神经网络的离散变换扩展为连续时间动力系统。本文基于Torchdyn库介绍Neural ODE的实现与训练方法,涵盖数据集构建、模型构建、基于PyTorch Lightning的训练及实验结果可视化等内容。Torchdyn支持多种数值求解算法和高级特性,适用于生成模型、时间序列分析等领域。
532 77
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
|
9月前
|
机器学习/深度学习 自然语言处理 算法
PyTorch PINN实战:用深度学习求解微分方程
物理信息神经网络(PINN)是一种将深度学习与物理定律结合的创新方法,特别适用于微分方程求解。传统神经网络依赖大规模标记数据,而PINN通过将微分方程约束嵌入损失函数,显著提高数据效率。它能在流体动力学、量子力学等领域实现高效建模,弥补了传统数值方法在高维复杂问题上的不足。尽管计算成本较高且对超参数敏感,PINN仍展现出强大的泛化能力和鲁棒性,为科学计算提供了新路径。文章详细介绍了PINN的工作原理、技术优势及局限性,并通过Python代码演示了其在微分方程求解中的应用,验证了其与解析解的高度一致性。
2781 5
PyTorch PINN实战:用深度学习求解微分方程
|
10月前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习工具和框架详细指南:PyTorch、TensorFlow、Keras
在深度学习的世界中,PyTorch、TensorFlow和Keras是最受欢迎的工具和框架,它们为研究者和开发者提供了强大且易于使用的接口。在本文中,我们将深入探索这三个框架,涵盖如何用它们实现经典深度学习模型,并通过代码实例详细讲解这些工具的使用方法。

推荐镜像

更多