【深度学习】与【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 xnet = 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 pltplt.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, transformstransform = 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 xmodel = 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 = 0total = 0for 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 / totalprint(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) / 2d_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

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成都青年AI人才崭露头角,知了汇智科技助力孵化营大放异彩

5月18日-19日,为期两天的成都国际商贸城青年(大学生)AI应用孵化营活动在热烈的氛围中圆满落幕。本次活动由成都国际商贸城、成都成商数字科技有限公司、成都知了汇智科技有限公司及成都电商职教集团联合举办,旨在为青年&#xff0…

丢失api-ms-win-crt-runtime-l1-1-0.dll的多种解决方法分析,教你简单的一键修复

在使用Windows操作系统时,用户可能会遇到一个涉及丢失 ​api-ms-win-crt-runtime-l1-1-0.dll文件的警告,这可能导致某些程序无法正常运行。该DLL文件属于Microsoft Visual C Redistributable软件包的一部分,这个软件包为多个应用提供运行时支…

深度学习-Softmax回归+损失函数+图像分类数据集

目录 Softmax回归回归 VS 分类Kaggle上的分类问题 从回归到多类分类回归分类从回归到多类分类-均方损失从回归到多类分类-无校验比例从回归到多类分类-校验比例 Softmax和交叉熵损失总结损失函数均方损失绝对值损失函数鲁棒损失 图像分类数据集通过框架中内置函数将FashionMNIS…

RabbitMQ---交换机-Fanout-Direct

Publisher:生产者,不再发送消息到队列中,而是发给交换机Exchange:交换机,一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将…

如何一键生成多个文本二维码?excel表格批量生码的方法

现在很多人会将文本信息做成二维码来展示,当有同类型内容生成大量二维码时,可以使用将文本导入excel表格的方式,将表格中的每条数据批量生成二维码,可以有效提升二维码制作的速度和效率。下面就让小编来将具体的操作步骤分享给大家…

二叉树顺序结构及链式结构

一.二叉树的顺序结构 1.定义:使用数组存储数据,一般使用数组只适合表示完全二叉树,此时不会有空间的浪费 注:二叉树的顺序存储在逻辑上是一颗二叉树,但是在物理上是一个数组,此时需要程序员自己想清楚调整…

手动安装maven依赖到本地仓库

使用mvn install命令安装jar包到指定的仓库。 命令如下: mvn install:install-file -Dmaven.repo.localC:\Users\liyong.m2\repository -DgroupIdcom.aspose -DartifactIdwords -Dversion18.4 -Dpackagingjar -DfileC:\Users\liyong\Desktop\jar\words-18.4.jar 解释…

grafana + Prometheus + node-exporter + pushgateway + alertmanager的监控解决方案

业内比较著名的监控解决方案,据笔者所知,大概是三套: 一个是zabbix的解决方案,一个是prometheusgrafana,一个是ELK zabbix比较重,而且原生支持监控SNMP,自带一个仪表盘,不需要额外…

docker redis 持久化

1、拉取redis镜像 docker pull redis:latest 2、 mkdir /data/redis 3、填充redis.conf文件及根据需求修改相应的配置 •通过官网地址找到对应版本的配置文件 •将配置信息复制到redis.conf中 •常见的修改配置 https://redis.io/docs/latest/operate/oss_and_stack/managem…

高仿果汁导航模板

参考原文:果汁导航风格模板_1234FCOM专注游戏工具及源码例子分享 极速云

基于springboot的毕业设计系统的开发源码

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的毕业设计系统的开发。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 毕业设计系统能够实现…

学习通高分免费刷课实操教程

文章目录 概要整体架构流程详细步骤云上全平台登录步骤小结 概要 我之前提到过一个通过浏览器的三个脚本就可以免费高分刷课的文章,由于不方便拍视频进行实操演示,然后写下了这个实操教程,之前的三个脚本划到文章末尾 整体架构流程 整体大…

窗口函数 | rows between …… and ……

ROWS BETWEEN ... AND ... 是 SQL 窗口函数中的一个子句&#xff0c;用于定义窗口函数操作的行范围。窗口函数允许用户对一组相关的记录执行计算&#xff0c;这些记录被称为窗口。 基本语法 <窗口函数> OVER ( [PARTITION BY <列名>] ORDER BY <列名> [AS…

华为云之Zabbix监控平台部署实践

华为云之Zabbix监控平台部署实践 一、本次实践介绍1.1 实践环境简介1.3 本次实践完成目标 二、 相关服务介绍2.1 华为云ECS云服务器介绍2.2 Zabbix介绍 三、环境准备工作3.1 预置实验环境3.2 查看预置环境信息 四、登录华为云4.1 登录华为云4.2 查看ECS状态4.3 连接ECS弹性云服…

力扣HOT100 - 287. 寻找重复数

解题思路&#xff1a; 快慢指针 第一步&#xff0c;慢指针每次移动一步&#xff0c;快指针每次移动两步&#xff0c;直到它们相遇。这一步保证了它们在环中相遇。 接下来&#xff0c;将其中一个指针&#xff08;快指针或慢指针&#xff09;重置到起点&#xff08;即数组的第一…

SpringBoot实现邮箱验证码

自行创建一个SpringBoot项目 导入SpringBoot所需要的邮箱验证码的包 <!--邮件发送--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.6.1</version>…

前后端部署笔记

windows版&#xff1a; 如果傻呗公司让用win电脑部署&#xff0c;类似于我们使用笔记本做局域网服务器&#xff0c;社内使用。 1.安装win版的nginx、mysql、node、jdk等 2.nginx开机自启参考Nginx配置及开机自启动&#xff08;Windows环境&#xff09;_nginx开机自启动 wind…

UPPAAL使用方法

UPPAAL使用方法 由于刚开始学习时间自动机及其使用方法&#xff0c;对UPPAAL使用不太熟悉&#xff0c;网上能找到的教程很少&#xff0c;摸索了很久终于成功实现一个小例子&#xff0c;所以记录一下详细教程。 这里用到的例子参考【UPPAAL学习笔记】1&#xff1a;基本使用示例…

专业级润滑油,一站式批发服务

要为机械设备提供持久稳定的动力保障吗&#xff1f;选择我们的专业级润滑油&#xff0c;让您的设备运转更顺畅&#xff0c;效率更高。 我们专业从事润滑油批发多年&#xff0c;以优质的产品、合理的价格和完善的服务赢得了广大客户的信赖。无论是汽车、机械还是工业设备&#x…

【Vue3】env环境变量的配置和使用(区分cli和vite)

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、env文件二、vue3cli加载env1..env配置2..dev配置&#xff08;其他环境参考&#xff09;3.package.json文件4.使用 三、vue3vite加载e…