PyTorch深度学习原理与实现

PyTorch深度学习原理与实现

1. 引言

深度学习发展历程

  1. 感知机网络(解决线性可分问题,20世纪40年代)

  2. BP神经网络(解决线性不可分问题,20世纪80年代)

  3. 深度神经网络(海量图片分类,2010年左右)

    常见深度神经网络:CNN、RNN、LSTM、GRU、GAN、DBN、RBM ……

深度应用领域

  1. 计算机视觉

  2. 语音识别

  3. 自然语言处理

  4. 人机博弈

深度学习、机器学习以及人工智能

在这里插入图片描述

深度学习VS传统机器学习

在这里插入图片描述

在这里插入图片描述

深度神经网络 VS 浅层神经网络

在这里插入图片描述

在这里插入图片描述

2. 卷积神经网络CNN

BP神经网络缺陷

  1. 不能移动

  2. 不能变形

  3. 运算量大

解决办法

  1. 大量物体位于不同位置的数据训练

  2. 增加网络的隐藏层个数。

  3. 权值共享(不同位置拥有相同权值)

卷积神经网络结构[深度学习(DEEP LEARNING)]

covolutional layer(卷积)、ReLu layer(非线性映射)、pooling layer(池化)、

fully connected layer(全连接)、output(输出)的组合,例如下图所示的结构。
在这里插入图片描述

全连接与局部连接(权值共享)

在CNN中,先选择一个局部区域(filter),用这个局部区域去扫描整张图片。 局部区域所圈起来的所有节点会被连接到下一层的一个节点上。

在这里插入图片描述

在这里插入图片描述

2.1 卷积层-权值共享

在这里插入图片描述

在这里插入图片描述

2.2 非线性映射ReLU

非线性映射(Rectified Linear Units)

和前馈神经网络一样,经过线性组合和偏移后,会加入非线性增强模型的拟合能力。

经过线性组合和偏移后,会加入非线性增强模型的拟合能力,将卷积所得的Feature Map经过ReLU变换。

下图函数解释:(小于零部分为零,大于零部分等于它本身)

在这里插入图片描述

2.3 池化(pooling)

在这里插入图片描述

import matplotlib.pyplot as plt
import torch

# 读取照片
image = plt.imread('_5_PyTorch深度学习/8.jpg')
# 将照片转为卷积层能接受的形式
image = image.reshape([-1, 1, 28, 28])

# 构建卷积层
# in_channels通道,当前灰度图片,通道为1; out_channels为过滤层filter的个数; kernel_size为过滤层纬度 5×5
conv2d = torch.nn.Conv2d(in_channels=1, out_channels=32, kernel_size=5)
# 执行卷积操作
    result_conv = conv2d(torch.tensor(image, dtype=torch.float32))

# 卷积可视化
plt.figure(figsize=(10, 8))  # 创建一张画布
for i in range(20):
    plt.subplot(4, 5, i+1)
    plt.imshow(result_conv.data.numpy()[0, i, :, :], cmap='gray')   # 绘制子图
    plt.axis('off')   # 关闭坐标轴
plt.show()
# 构建池化层
# kernel_size过滤层纬度 2×2 每次跳转间隔
max_pool2d = torch.nn.MaxPool2d(kernel_size=2, stride=2)
# 执行池化操作
result_pool = max_pool2d(result_conv)
# 池化可视化
plt.figure(figsize=(10, 8))  # 创建一张画布
for i in range(20):
    plt.subplot(4, 5, i+1)
    plt.imshow(result_pool.data.numpy()[0, i, :, :], cmap='gray')   # 绘制子图
    plt.axis('off')   # 关闭坐标轴
plt.show()

原图:

在这里插入图片描述

第一次卷积结果:

在这里插入图片描述

第一次池化结果:

在这里插入图片描述

2.4 全连接层

卷积–>池化–>卷积–>池化–>全连接–>全连接–>高斯连接

在这里插入图片描述

输入 32×32

-> 通过6个不同的filter(5×5)卷积后 -> 6@28×28

-> 池化后 -> 6@14×14

-> 通过16个不同的filter(5×5)卷积后 -> 16@10×10

-> 池化后 -> 6@5×5

-> 全连接

3. 循环神经网络RNN

传统神经网络结构

在这里插入图片描述

  • 对一般的神经网络,无论是arrive Beijing还是leave Beijing,Beijing作为BP神经网络的输入时,输出的都是Destination

  • Input 一样的内容,Output就是一样的内容

  • **我们希望神经网络有记忆,记得 ** Beijing 前的 arrive 或者 leave

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.1 隐状态(Hidden State)h

在这里插入图片描述

在这里插入图片描述

3.2 输出状态

在这里插入图片描述

3.3 随时间反向传播(BPTT)算法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.4 N VS 1 RNN结构

n个输入一个输出

在这里插入图片描述

3.5 1 VS N RNN结构

1个输入n个输出

在这里插入图片描述

3.6 N vs M

n个输入m个输出

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4. 长短时记忆网络LSTM

在 RNN 中,因为通常前期的层会因为梯度消失而停止学习,RNN 会忘记它在更长的序列中看到的东西,从而只拥有短期记忆。

在这里插入图片描述

在这里插入图片描述

4.1 遗忘门(forget gate)遗忘或保存

在这里插入图片描述

4.2 输入门(input gate)更新单元状态

在这里插入图片描述

4.3 单元状态

在这里插入图片描述

4.4 输出门(output gate)

决定下一个隐藏状态

在这里插入图片描述

4.5 示例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5. 利用RNN&LSTM实现手写数字识别

任务实现

  1. 加载数据

  2. 数据加工

  3. 构建模型(搭建网络)

  4. 模型配置

  5. 模型训练

  6. 性能验证

在这里插入图片描述

import matplotlib.pyplot as plt
import torch

# 读取照片
image = plt.imread('_5_PyTorch深度学习/8.jpg')

# 将照片转为卷积层能接受的形式
image = image.reshape([-1, 28, 28])

# 构建LSTM
# 一个序列放进去,序列中一个向量中元素的个数 ,input_size输入数据的个数
# hidden_size 设置神经元个数
# batch_first 样本个数在第一位
rnn = torch.nn.LSTM(input_size=28, hidden_size=100, batch_first=True)

# 执行LSTM
output, (_, _) = rnn(torch.tensor(image, dtype=torch.float32))

plt.imshow(output.data.numpy()[0].T, cmap='gray')
plt.show()

在这里插入图片描述

在这里插入图片描述

import numpy as np
import torch

# 1. 加载数据
mnist = np.load('_5_PyTorch深度学习/mnist.npz', allow_pickle=True)  # 读取数据
mnist.files
X_train, y_train, X_test, y_test = mnist['x_train'], mnist['y_train'], mnist['x_test'], mnist['y_test']
# 2. 数据加工
X_train_tensor = torch.tensor(X_train/255, dtype=torch.float32)  # 将训练集样本自变量转为tensor
X_test_tensor = torch.tensor(X_test/255, dtype=torch.float32)    # 将测试集样本自变量转为tensor
y_train_tensor = torch.tensor(y_train, dtype=torch.int64)         # 将训练集样本标签转为tensor

train_ds = torch.utils.data.TensorDataset(X_train_tensor, y_train_tensor)       # 将训练数据转为tensordata格式
train_dl = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True)   # 执行打乱和分批操作


class Rnn(torch.nn.Module):
    def __init__(self):
        super(Rnn, self).__init__()
        self.lstm = torch.nn.LSTM(input_size=28, hidden_size=100, batch_first=True)  # 定义LSTM层
        self.fc = torch.nn.Linear(in_features=100, out_features=10)                  # 全连接(隐藏层)

    def forward(self, x):
        x, (_, _) = self.lstm(x)  # 执行LSTM操作
        x = self.fc(x[:, -1, :])  # 获取最后一个第28个(即-1)
        return x

# 3. 构建模型(搭建网络)
network = Rnn()  # 实例化得到一个网络模型

# 4. 模型配置
loss_fn = torch.nn.CrossEntropyLoss()   # 定义交叉商损失函数
optimizer = torch.optim.SGD(network.parameters(), lr=0.01)   # 定义优化器 learning rate学习率

# 5. 模型训练与保存
for epoch in range(20):
    for image, label in train_dl:
        y_pre = network(image)             # 前向传播
        loss = loss_fn(y_pre, label)       # 计算模型损失
        network.zero_grad()                # 将网络中所有参数的梯度进行清零
        loss.backward()                    # 计算梯度
        optimizer.step()                   # 对网络参数(参数和阈值)进行优化
    print(f'第{epoch}轮训练的最后一批样本的训练损失值为: {loss.item()}')

# 6. 性能验证
predicted = network(X_test_tensor)               # 调用已训练好的模型对测试样本进行预测
result = predicted.data.numpy().argmax(axis=1)   # 模型对测试样本的预测标签
acc_test = (y_test == result).mean()             # 测试精度

torch.save(network.state_dict(), 'mnist_2.pt')   # 保存已经训练好的模型(参数)  权值阈值

# 对网络参数(参数和阈值)进行优化
print(f'第{epoch}轮训练的最后一批样本的训练损失值为: {loss.item()}')

# 6. 性能验证
predicted = network(X_test_tensor)               # 调用已训练好的模型对测试样本进行预测
result = predicted.data.numpy().argmax(axis=1)   # 模型对测试样本的预测标签
acc_test = (y_test == result).mean()             # 测试精度

torch.save(network.state_dict(), 'mnist_2.pt')   # 保存已经训练好的模型(参数)  权值阈值

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

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

相关文章

SSH协议简介与使用

Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。通过SSH&#xf…

浙大恩特客户资源管理系统 SQL注入漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统中T0140_editAction.entweb接口处存在SQL注入漏洞,未…

阿里云CentOS主机开启ipv6

目录 一、云主机开启和使用 ipv6 1、网络和交换机开启 ipv6 2、创建 / 编辑云主机,开启ipv6 3、安全组放行ipv6端口 二、使用 ipv6 地址进行 ssh 连接 三、ipv6 地址绑定域名 一、云主机开启和使用 ipv6 1、网络和交换机开启 ipv6 进入网络、交换机详情页面…

如何用AB测试完善产品激励体系

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 用户激励体系,也称用户激励机制,是为了让用户持续使用产品,而设计的一套对应规则。在用户激励体系建立过程中,产品可…

锐捷网络NBR700G 信息泄露漏洞复现 [附POC]

文章目录 锐捷网络NBR700G 信息泄露漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 锐捷网络NBR700G 信息泄露漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非…

SQL 查询优化指南:SELECT、SELECT DISTINCT、WHERE 和 ORDER BY 详解

SELECT 关键字 SQL的SELECT语句用于从数据库中选择数据。SELECT语句的基本语法如下: SELECT column1, column2, ... FROM table_name;其中,column1, column2,等是您要从表中选择的字段名称,而table_name是您要选择数据的表的名称。 如果要…

JavaEE初阶 01 计算机是如何工作的

前言 今天开始进行对JavaEE的一些基本总结,希望大家能在阅读中有所收获,如有错误还望多多指正. 1.冯诺依曼体系结构 这个体系结构相信学计算机的同学都不陌生,但是你真的知道这个体系结构说的是什么嘛?请听我娓娓道来.首先我先给出一张冯诺依曼体系结构的简图 你可以理解为当前…

2023年腾讯云服务器限时特惠,2023年腾讯云服务器最新优惠汇总

亲爱的朋友们,如果你正在考虑购买腾讯云服务器,那么你一定需要了解近期腾讯云服务器的限时特惠活动。本文将为你提供2023年腾讯云服务器的最新优惠汇总,并详细介绍几款值得购买的优惠云服务器。 首先为大家介绍的是轻量2核2G3M服务器&#x…

Web前端—移动Web第一天(平面转换、渐变、综合案例--播客网页设计)

版本说明 当前版本号[20231117]。 版本修改说明20231117初版 目录 文章目录 版本说明目录移动 Web 第一天01-平面转换简介示例 平移定位居中案例-双开门旋转转换原点案例-时钟多重转换缩放案例-播放特效倾斜 02-渐变线性渐变案例-产品展示径向渐变 03-综合案例导航-频道箭头…

openssl1.0.2版本Windows安装问题

之前安装过1.1版本,Windows环境下C 安装OpenSSL库 源码编译及使用(VS2019)_vs2019安装openssl_肥宝Fable的博客-CSDN博客 后来发现linux编译不过,以为是版本问题,相差太大,所以降一下版本,以免…

2024年山东省职业院校技能大赛中职组“网络安全”赛项竞赛试题-B

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B 一、竞赛时间 总计:360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略设置 A-3 流量完整性保护 A-4 …

el-table固定表头(设置height)出现内容过多时不能滚动问题

主要原因是el-table没有div包裹 解决&#xff1a;加一个div并设置其高度和overflow 我自己的主要代码 <div class"contentTable"><el-tableref"table":data"tableData"striperow-dblclick"onRowDblclick"height"100%&q…

WPF创建自定义控件编译通过但是找不到资源

报错&#xff1a; 原因: 路径写错了&#xff1a; 不是这样&#xff1a; Source"pack://application:,,,/Controls/Styles/xTabControl.xaml" 而是这样&#xff1a; Source"pack://application:,,,/项目名;component/Controls/Styles/xTabControl.xaml …

给openlab搭建web网站

网站需求&#xff1a; 1、基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 2、给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站 1&#xff09;基于 www.openlab.com/student 网站访问学生信息 2&#xff09;基于 www.openlab.com/…

Kafka学习笔记(二)

目录 第3章 Kafka架构深入3.3 Kafka消费者3.3.1 消费方式3.3.2 分区分配策略3.3.3 offset的维护 3.4 Kafka高效读写数据3.5 Zookeeper在Kafka中的作用3.6 Kafka事务3.6.1 Producer事务3.6.2 Consumer事务&#xff08;精准一次性消费&#xff09; 第4章 Kafka API4.1 Producer A…

PyTorch

正常界面 创建环境 conda create -n env_test python3.6进入环境 conda activate env_testpycharm中&#xff0c;创建项目&#xff0c;选择环境

删除链表的倒数第N个结点(双指针)

19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 样例输入 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1…

微电影分销付费短剧小程序开发

微电影系统分销管理付费软件是一款面向微电影制作公司和影视产业的付费软件&#xff0c;它的出现旨在帮助微电影制作公司和影视产业实现分销管理&#xff0c;提高产业的效率和竞争力。本文将介绍微电影系统分销管理付费软件的背景、特点和开发方法。 一、背景 微电影作…

红黑树的插入与验证

红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;因而是接近平衡的…

搭建大型分布式服务(三十六)SpringBoot 零代码方式整合多个kafka数据源

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、创建项目四、测试一下五、小结 前言 让我们来看一下网上是怎样使用SpringBoot整合kafka数据源的&#xff0c;都存在哪些痛点&#xff1f; 痛点一&#xff1a; 手撸kafka配置代码&#xff0c;各种硬编码&a…