深度网络及经典网络简介

news2024/10/6 8:33:30

深度网络及经典网络简介

  • 导语
  • 加深网络
    • 一个更深的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 x

    def 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.0

        for 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):
        # forward
        self.loss(x, t)

        # backward
        dout = 1
        dout = 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].dW
            grads['b' + str(i+1)] = self.layers[layer_idx].db

        return 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.coloradmin.cn/o/1807149.html

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

相关文章

独立游戏《星尘异变》UE5 C++程序开发日志4——实现任务系统

目录 一、任务的数据结构 二、任务栏 三、随机事件奖励 1.随机事件的结构 2.随机事件池的初始化 3.生成随机事件 本游戏作为工厂游戏,任务系统的主要功能就是给玩家生产的目标和动力,也就是给玩家发布一个需要一定数量某星尘的订单,玩家…

5 种技术,可用于系统中的大数据模型

文章目录 一、说明二、第一种:批量大小三、第二种:主动学习四、第三种:增加代币数量五、第四种: 稀疏激活六、第五种:过滤器和更简单的模型后记 一、说明 以下是本文重要观点的摘要。阅读它以获取更多详细信息/获取原…

【CTF MISC】XCTF GFSJ0170 János-the-Ripper Writeup(文件提取+ZIP压缩包+暴力破解)

Jnos-the-Ripper 暂无 解法 用 winhex 打开,提到了 flag.txt。 用 binwalk 扫描,找到一些 zip 压缩包。 binwalk misc100用 foremost 提取文件。 foremost misc100 -o 100flag.txt 在压缩包里。 但是压缩包需要解压密码。 用 Ziperello 暴力破解。 不…

JAVA-LeetCode 热题 100 第56.合并区间

思路&#xff1a; class Solution {public int[][] merge(int[][] intervals) {if(intervals.length < 1) return intervals;List<int[]> res new ArrayList<>();Arrays.sort(intervals, (o1,o2) -> o1[0] - o2[0]);for(int[] interval : intervals){if(res…

vue2中的插槽使用以及Vuex的使用

插槽分为默认插槽&#xff0c;定名插槽还有作用域插槽 一.默认插槽&#xff0c;定名插槽 //app.vue <template> <div class"container"><CategoryTest title"美食" :listData"foods"><img slot"center" src&qu…

前端 移动端 手机调试 (超简单,超有效 !)

背景&#xff1a;webpack工具构建下的vue项目 1. 找出电脑的ipv4地址 2. 替换 host 3. 手机连接电脑热点或者同一个wifi 。浏览器打开链接即可。

【召回第一篇】召回方法综述

各个网站上找的各位大神的优秀回答&#xff0c;记录再此。 首先是石塔西大佬的回答&#xff1a;工业界推荐系统中有哪些召回策略&#xff1f; 万变不离其宗&#xff1a;用统一框架理解向量化召回前言常读我的文章的同学会注意到&#xff0c;我一直强调、推崇&#xff0c;不要…

探索智慧商场的功能架构与应用

在数字化和智能化的浪潮下&#xff0c;智慧商场已经成为零售业的重要发展方向之一。智慧商场系统的功能架构设计与应用&#xff0c;结合了现代信息技术和零售业的实际需求&#xff0c;为商场的管理和运营提供了全新的解决方案。本文将深入探讨智慧商场的功能架构与应用&#xf…

2024高考作文-ChatGPT完成答卷,邀请大家来打分

高考&#xff0c;愿你脑洞大开&#xff0c;知识点全都扎根脑海&#xff1b;考试时手感倍儿棒&#xff0c;答题如行云流水&#xff1b;成绩公布时&#xff0c;笑容如春风拂面&#xff0c;心情如阳光普照&#xff01;高考加油&#xff0c;你一定行&#xff01; 新课标I卷 试题内…

2024年6月9日 (周日) 叶子游戏新闻

万能嗅探: 实测 网页打开 某视频号、某音、某红薯、某站&#xff0c;可以做到无水印的视频和封面下载功能哦&#xff0c;具体玩法大家自行发挥吧。 《Funko Fusion》发布新预告 20款影视作品齐聚一堂第三人称动作游戏新作《Funko Fusion》今日发布最新实机演示。该游戏融合了整…

《python程序语言设计》2018版第5章第47题绘制随机球,在一个宽120高100的矩形里绘制随机的点

这个题其实并不难。 首先我们利用turtle功能绘制一个矩形&#xff0c;圆心点题里要求的是0&#xff0c;0 这个好办 然后我们根据宽120&#xff0c;高100计算一下。肯定是正负两个值参与其中。 坐标点如下 建立矩形代码如下 turtle.penup() turtle.goto(-60, 50) turtle.pend…

程序的基本结构、cout语句(c++语言)

一、如何下载Dev C 登录网站&#xff1a;ht.51goc.com 二、安装Dev C 一、启动Dev C 双击桌面的图标 二、新建一个程序 三、复制一个程序 请你复制以下代码到“程序编辑区” #include<bits/stdc.h> using namespace std; int main() { cout<<"Hell…

Segment Anything CSharp| 在 C# 中通过 OpenVINO™ 部署 SAM 模型实现万物分割

​ OpenVINO™ C# API 是一个 OpenVINO™ 的 .Net wrapper&#xff0c;应用最新的 OpenVINO™ 库开发&#xff0c;通过 OpenVINO™ C API 实现 .Net 对 OpenVINO™ Runtime 调用.Segment Anything Model&#xff08;SAM&#xff09;是一个基于Transformer的深度学习模型&#x…

G盘文件系统损坏的应对与预防全攻略

在日常使用电脑的过程中&#xff0c;我们时常会碰到各种磁盘问题&#xff0c;其中G盘文件系统损坏是一个较为常见且棘手的问题。当G盘文件系统损坏时&#xff0c;不仅可能导致重要数据丢失&#xff0c;还可能影响系统的稳定性和运行效率。本文将详细探讨G盘文件系统损坏的现象、…

RK3568笔记三十一:ekho 6.3 文本转语音移植

若该文为原创文章&#xff0c;转载请注明原文出处。 移植的目的是在在OCR识别基础上增加语音播放&#xff0c;把识别到的文字直接转TTS播报出来&#xff0c;形成类似点读机的功能。 1、下载文件 libsndfile-1.0.28.tar.gz ekho-6.3.tar.xz 2、解压 tar zxvf libsndfile-1.0…

有序二叉树java实现

类实现&#xff1a; package 树;import java.util.LinkedList; import java.util.Queue;public class BinaryTree {public TreeNode root;//插入public void insert(int value){//插入成功之后要return结束方法TreeNode node new TreeNode(value);//如果root为空的话插入if(r…

Nacos的配置中心

1.前言 除了注册中心和负载均衡之外, Nacos还是⼀个配置中心, 具备配置管理的功能. Namespace 的常用场景之一是不同环境的配置区分隔离&#xff0c; 例如开发测试环境和⽣产环境的配置隔离。 1.1 为什么需要配置中心&#xff1f; 当前项目的配置都在代码中&#xff0c;会存…

6.7.12 使用 SWIN Transformer 通过热图像实现乳腺癌检测系统

乳腺癌是重大的公共卫生挑战&#xff0c;需要有效的诊断方法。虽然超声、乳房 X 线照相和 MRI 仍然至关重要&#xff0c;但它们在定期、短间隔大规模筛查中的实用性有限。 热成像作为一种非侵入性且经济有效的选择&#xff0c;具有常规自我筛查的潜力。本研究利用基于自注意力…

java中异常-异常概述+异常体系结构

一、异常概述 1、什么是异常&#xff1f; java程序在运行时出现的不正常情况 2、java中提供的默认的异常处理机制 java中对java程序运行时可能会出现的每种不正常情况都创建了一个唯一对应的类&#xff0c;在java程序运行时如果出现不正常情况&#xff0c;java程序就会创建…

数据结构:旋转数组

方法1 &#xff08;三次逆置法&#xff09;&#xff1a; void reverse(int* nums, int start, int end) {while (start < end) {int temp nums[start];nums[start] nums[end];nums[end] temp;start;end--;} }void rotate(int* nums, int numsSize, int k) {k k % numsS…