深度网络及经典网络简介

深度网络及经典网络简介

  • 导语
  • 加深网络
    • 一个更深的CNN
    • 提高识别精度
      • Data Augmentation
    • 层的加深
  • 经典网络
    • VGG
    • GoogLeNet
    • ResNet
  • 高速学习
    • 迁移学习
    • GPU
    • 分布式学习
    • 计算位缩减
  • 强化学习
  • 总结
  • 参考文献

导语

深度学习简单来说,就是加深了层数的神经网络,前面已经提到,网络的层数越深,它学习到的特征就越抽象,越高级,这也是深度网络能够胜任很多工作的原因。

加深网络

书上在本章将前面的各种技术结合起来,构建了一个复杂的深层网络,以MNIST数据集的手写识别为数据集进行训练和验证。

一个更深的CNN

书上给出了一个构造好的CNN,如下图,可以发现它比先前构造的任何网络都更深,并且使用了Dropout,选取的卷积核都是3×3,激活函数采用ReLU,使用Adam最优化,以He初始值为权重初始值。

在这里插入图片描述
书上给出的代码如下:

class DeepConvNet:def __init__(self, input_dim=(1, 28, 28),conv_param_1 = {'filter_num':16, 'filter_size':3, 'pad':1, 'stride':1},conv_param_2 = {'filter_num':16, 'filter_size':3, 'pad':1, 'stride':1},conv_param_3 = {'filter_num':32, 'filter_size':3, 'pad':1, 'stride':1},conv_param_4 = {'filter_num':32, 'filter_size':3, 'pad':2, 'stride':1},conv_param_5 = {'filter_num':64, 'filter_size':3, 'pad':1, 'stride':1},conv_param_6 = {'filter_num':64, 'filter_size':3, 'pad':1, 'stride':1},hidden_size=50, output_size=10):#输入维度,卷积层数量,卷积层规模,填充,步长pre_node_nums = np.array([1*3*3, 16*3*3, 16*3*3, 32*3*3, 32*3*3, 64*3*3, 64*4*4, hidden_size])wight_init_scales = np.sqrt(2.0 / pre_node_nums)  # 使用ReLU的情况下推荐的初始值self.params = {}pre_channel_num = input_dim[0]for idx, conv_param in enumerate([conv_param_1, conv_param_2, conv_param_3, conv_param_4, conv_param_5, conv_param_6]):self.params['W' + str(idx+1)] = wight_init_scales[idx] * np.random.randn(conv_param['filter_num'], pre_channel_num, conv_param['filter_size'], conv_param['filter_size'])self.params['b' + str(idx+1)] = np.zeros(conv_param['filter_num'])pre_channel_num = conv_param['filter_num']self.params['W7'] = wight_init_scales[6] * np.random.randn(64*4*4, hidden_size)self.params['b7'] = np.zeros(hidden_size)self.params['W8'] = wight_init_scales[7] * np.random.randn(hidden_size, output_size)self.params['b8'] = np.zeros(output_size)# 生成层===========self.layers = []self.layers.append(Convolution(self.params['W1'], self.params['b1'], conv_param_1['stride'], conv_param_1['pad']))self.layers.append(Relu())self.layers.append(Convolution(self.params['W2'], self.params['b2'], conv_param_2['stride'], conv_param_2['pad']))self.layers.append(Relu())self.layers.append(Pooling(pool_h=2, pool_w=2, stride=2))self.layers.append(Convolution(self.params['W3'], self.params['b3'], conv_param_3['stride'], conv_param_3['pad']))self.layers.append(Relu())self.layers.append(Convolution(self.params['W4'], self.params['b4'],conv_param_4['stride'], conv_param_4['pad']))self.layers.append(Relu())self.layers.append(Pooling(pool_h=2, pool_w=2, stride=2))self.layers.append(Convolution(self.params['W5'], self.params['b5'],conv_param_5['stride'], conv_param_5['pad']))self.layers.append(Relu())self.layers.append(Convolution(self.params['W6'], self.params['b6'],conv_param_6['stride'], conv_param_6['pad']))self.layers.append(Relu())self.layers.append(Pooling(pool_h=2, pool_w=2, stride=2))self.layers.append(Affine(self.params['W7'], self.params['b7']))self.layers.append(Relu())self.layers.append(Dropout(0.5))self.layers.append(Affine(self.params['W8'], self.params['b8']))self.layers.append(Dropout(0.5))self.last_layer = SoftmaxWithLoss()def predict(self, x, train_flg=False):#预测for layer in self.layers:if isinstance(layer, Dropout):x = layer.forward(x, train_flg)else:x = layer.forward(x)return xdef loss(self, x, t):#计算损失y = self.predict(x, train_flg=True)return self.last_layer.forward(y, t)def accuracy(self, x, t, batch_size=100):#返回准确度if t.ndim != 1 : t = np.argmax(t, axis=1)acc = 0.0for i in range(int(x.shape[0] / batch_size)):tx = x[i*batch_size:(i+1)*batch_size]tt = t[i*batch_size:(i+1)*batch_size]y = self.predict(tx, train_flg=False)y = np.argmax(y, axis=1)acc += np.sum(y == tt)return acc / x.shape[0]def gradient(self, x, t):# forwardself.loss(x, t)# backwarddout = 1dout = self.last_layer.backward(dout)tmp_layers = self.layers.copy()tmp_layers.reverse()for layer in tmp_layers:dout = layer.backward(dout)# 设定grads = {}for i, layer_idx in enumerate((0, 2, 5, 7, 10, 12, 15, 18)):grads['W' + str(i+1)] = self.layers[layer_idx].dWgrads['b' + str(i+1)] = self.layers[layer_idx].dbreturn grads

训练和测试的结果如下:

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

提高识别精度

提高识别精度,无非是几个思路:从数据下手,获取更多的有效数据,如数据扩充,从结构下手,加深网络或采取优化算法,如学习率衰减,从学习方法下手,如集成学习等。

Data Augmentation

数据扩充很好理解,对于有限的输入数据,我们可以人为地拓展出更多的数据,例如旋转、平移、放大、缩小还有翻转等等,甚至是调整对比度、亮度,这样就可以增加许多的训练数据,在Yolov5中,数据在输入时就会被拼接翻转,形成新的数据供以训练。

层的加深

一般来说,层次越深,深度网络的识别性能就越高,并且,加深层与没有加深的网络比,可以用更少的参数达到同等水平或更强的效果。

可以这样理解,一个大卷积核可以通过多个小卷积核进行串联操作实现相同效果,一个5×5的卷积核需要25个参数,而5×5的卷积核也可以通过两个3×3的卷积核连续卷积两次得到,需要18个参数,并且,叠加小卷积核可以扩大感受野(给神经元施加变化的某个局部空间区域)。

加深层也可以使学习更高效,减少学习数据,在学习过程中可以将问题分层次的分解,就像前面所提到的,先关注边缘,再关注纹理,再关注更高级的信息。

经典网络

很多经典的深度学习网络,都基于了CNN的思想和设计模式,下面简单介绍几个。

VGG

VGG是经典的由卷积层和池化层构成的CNN,它将卷积层和池化层叠加到了16或者19层,使用的是3×3卷积核,结构如下图:

在这里插入图片描述

GoogLeNet

GoogLeNet在纵向上有深度,在横向上有点深度,它打破了传统的线性结构,将神经网络的结构拓展到了二维,这种宽度结构被称为Inception。

Inception使用多个大小不同的卷积核进行操作,最后将结果汇总,有点类似Dropout的思想,但是这里变的是卷积核,而不是神经元。

网络结构和Inception如下图:

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

ResNet

ResNet比它的前辈有着更深的结构,它考虑到,虽然加深层理论上会提高性能,但也会加大训练难度,因此使用了快捷结构,如下图:

在这里插入图片描述
快捷结构跳过了卷积层,将输入合并到了输出,反向传播时信号可以无衰减的传递。

ResNet网络结构如下图:

在这里插入图片描述

高速学习

深度网络的结构和层次越来越复杂,为了更快的得到训练模型,这就需要减少学习的实现以提高效率。

迁移学习

在深度学习中,经常将ImageNet学习到的权重(或一部分)赋值给其他的深度网络,以新数据集作为对象进行再学习,这在数据集较少时很有效。

GPU

CPU虽然常用,但它并不是深度学习进行训练的最好选择,因为它并不擅长运算,相比之下GPU更适合进行深度学习的训练,以Yolov8为例,使用GPU训练5000张图片时,需要7到8个小时,而使用CPU则需要三天,GPU擅长大量的并行计算,CPU擅长连续的复杂计算。

分布式学习

虽然GPU可以减少单次训练的时间,但是深度学习的很多超参数需要不停的尝试,加起来的总时间依然不乐观,于是分布式学习应运而生(将深度学习过程拓展开来)。

分布式学习在多个GPU或机器上进行分布式运算,现在的大多数深度学习框架都集成了这一点(如TensorFlow)。

计算位缩减

常用的数据长度为64位和32位,但深度学习其实并需要这么高的精度,因为只要数据的偏差在允许的范围内,都不会影响最后的结果,这是神经网络的健壮性,根据以往结果,为了提高效率,可以使用16位的浮点数进行运算。

强化学习

强化学习针对的对象是计算机,让计算机进行自主学习。强化学习的基本逻辑是,代理根据环境选择行动,然后通过行动改变环境,两者相互影响和交互,根据环境变化,代理会受到反馈,如图:
在这里插入图片描述

报酬是不确定的,只是有一个预测值。在使用了深度学习的强化学习方法里面,DQN很有名,它为了确定最合适的行动,需要确定一个被称为最优行动价值函数的函数,这个函数是通过深度学习得到的,大名鼎鼎的AlphaGo也是基于强化学习研究的。

总结

本章给出了一个复杂CNN的实现,并且介绍了许多优化方法以及经典网络,可以看到CNN的使用是非常广泛的,作为一个开创性的模型,CNN值得所有学习深度学习的人细细品味。

至此,深度学习入门的笔记已经全部结束。

参考文献

  1. 《深度学习入门——基于Python的理论与实现》

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

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

相关文章

Java:110-SpringMVC的底层原理(上篇)

SpringMVC的底层原理 在前面我们学习了SpringMVC的使用(67章博客开始),现在开始说明他的原理(实际上更多的细节只存在67章博客中,这篇博客只是讲一点深度,重复的东西尽量少说明点) MVC 体系结…

深入理解指针(三)

一、指针运算 1.1指针-整数 下面我们来看一个指针加整数的例子&#xff1a; #include<stdio.h> int main() { int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; int* p &arr[0]; int i 0; int sz sizeof(arr) / sizeof(arr[0]); for (i 0; i < …

Netty原理与实战

1.为什么选择Netty&#xff1f; 高性能低延迟 事件分发器&#xff1a; reactor采用同步IO&#xff0c;Proactor采用异步IO 网络框架选型&#xff1a; 2.Netty整体架构设计&#xff08;4.X&#xff09; 三个模块&#xff1a;Core核心层、Protocal Support协议支持层、…

leetcode:不同的二叉树

class Solution { public:int numTrees(int n) {vector<int> dp(n1);dp[0] 1;dp[1] 1;for(int i 2;i < n;i){for(int j 1;j < i;j) // 当根节点为j时{dp[i] dp[j-1] * dp[i-j];}}return dp[n];} }; /* dp[i] i个不同的数组成的二叉搜索数的个数假设 i 5当根…

IDEA 连接GitHub仓库并上传项目(同时解决SSH问题)

目录 1 确认自己电脑上已经安装好Git 2 添加GitHub账号 2.1 Setting -> 搜索GitHub-> ‘’ -> Log In with Token 2.2 点击Generate 去GitHub生成Token 2.3 勾选SSH后其他不变直接生成token 2.4 然后复制token添加登录账号即可 3 点击导航栏中VCS -> Create…

Python Flask实现蓝图Blueprint配置和模块渲染

Python基础学习&#xff1a; Pyhton 语法基础Python 变量Python控制流Python 函数与类Python Exception处理Python 文件操作Python 日期与时间Python Socket的使用Python 模块Python 魔法方法与属性 Flask基础学习&#xff1a; Python中如何选择Web开发框架&#xff1f;Pyth…

(Proteus仿真设计)基于51单片机的电梯程序控制系统

&#xff08;Proteus仿真设计&#xff09;基于51单片机的电梯程序控制系统 一.项目介绍 本设计模拟的是一个五层的&#xff0c;各楼层间隔为4.5m的电梯程序控制系统&#xff0c;能够完成各楼层乘客的接送任务。形象地说&#xff0c;就是要对不同楼层乘客的不同需求&#xff0…

学习Canvas过程中2D的方法、注释及感悟一(通俗易懂)

1.了解Canvas&#xff1a; Canvas是前端一个很重要的知识点&#xff0c;<canvas>标签用于创建画布绘制图形&#xff0c;通过JavaScript进行操作。它为开发者提供一个动态绘制图形的区域&#xff0c;用于创建图标、游戏动画、图像处理等。 对于能够熟练使用Canvas的开发者…

星舰四飞成功!SpaceX 今年还要飞 4 次?星舰未来 10 年规划展望

SpaceX 的星舰&#xff08;Starship&#xff09;项目一直备受瞩目&#xff0c;最近的第四次试飞再次引发了全球关注。本文将详细回顾星舰第四次发射的成功经验&#xff0c;并探讨其未来的十年规划。 一、引言 星舰是 SpaceX 研制的下一代重型运载火箭系统&#xff0c;旨在实现…

苍穹外卖笔记-06-菜品管理-菜品分类,公共字段填充

菜品分类 1 菜品分类模块1.1 需求分析与设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 1.3 代码实现1.4 测试分类分页查询启用禁用分类修改分类信息新增菜品分类删除菜品分类 2 公共字段自动填充2.1 问题分析2.2 实现思路自定义注解AutoFill自定义切面AutoFillAspectMapper接口…

LeetCode338比特位计数

题目描述 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 解析 动态规划&#xff0c;将当前的数的最后一位去掉&#xff0c;然后判断去掉的最后一位是0还是1。…

Qwen2来了

Qwen2整体介绍 Qwen2开源模型下载 Demo使用 Git 官方使用文档 变化 1、增大了上下文长度支持&#xff0c;Qwen2-72B-Instruct支持128K tokens&#xff0c;并且处理完美 2、代码和数学能力显著提升 3、多个评测基准上的领先表现 4、中英之外增加了27种语言相关的高质量…

CNCF项目全景图介绍

本文首发在个人博客上&#xff0c;欢迎来踩&#xff01; 云原生计算基金会&#xff08;CNCF&#xff09;介绍 CNCF(Cloud Native Computing Foundation)官网链接&#xff1a;https://www.cncf.io/ 官方的介绍如下&#xff1a; 云原生技术有利于各组织在公有云、私有云和混合…

Transformer论文精读

Transformer&#xff1a;Attention is all you need Abstract&#xff1a; 在主流的序列转录模型&#xff08;sequence transduction models&#xff1a;给一个序列&#xff0c;生成另一个序列&#xff09;&#xff0c;主要依赖循环或者卷积神经网络&#xff0c;一般是用enco…

Buildroot和Debian文件系统修改方法

本文档主要介绍在没有编译环境的情况下&#xff0c;如何修改buildroot和debian文件系统方法&#xff0c;如在buildroot文件系统中添加文件、修改目录等文件操作&#xff0c;在debian文件系统中&#xff0c;安装软件库、工具、扩大文件系统空间等等操作。 1.Debian文件系统 …

算法 | hbut期末复习笔记

贪心选择策略&#xff1a;所求问题的整体最优解可以通过一系列局部最优的选择&#xff08;贪心选择&#xff09;得到 最优子结构&#xff1a;问题的最优解包括了其子问题的最优解 回溯法&#xff1a;具有限界函数的深度优先搜索法 回溯法的解空间&#xff1a;子集树&排列…

全新抖音快手小红书视频解析去水印系统网站源码

这个系统支持几十种平台&#xff0c;包括抖音、快手小红书以及其他热门社交媒体平台。它可以帮助轻松地下载这些平台上的任何视频&#xff0c;并去除其中的水印&#xff0c;让你可以自由地保存和分享这些视频。 使用方法&#xff1a; 上传压缩包解压&#xff0c;网站信息在inc…

【JAVASE】面向对象编程综合案例--------模仿电影信息系统

需求&#xff1a; &#xff08;1&#xff09;展示系统中的全部电影&#xff08;每部电影展示&#xff1a;名称、价格&#xff09; &#xff08;2&#xff09;允许用户根据电影编号&#xff08;ID&#xff09;查询出某个电影的详细信息。 目标&#xff1a;使用所学的面向对象…

洛谷B2095 白细胞计数

#include<bits/stdc.h> using namespace std; double a[520],cnt,min199999999,max1-1,max2,min2,max3-1; int main(){int n;cin>>n;for(int i1;i<n;i){cin>>a[i];min1min(min1,a[i]);if(a[i]min1){min2i;}//确定最大值 max1max(max1,a[i]);if(a[i]max1){…

基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真&#xff0c;包括电机&#xff0c;SVPWM模块&#xff0c;矢量控制器模块等。 2.系统仿真结果 3.核心程序与模…