Tensorflow—第五讲卷积神经网络

本讲概述

卷积实际上就是特征提取。本讲我们先了解学习卷积神经网络基础知识,再一步步地学习搭建卷积神经网络,最后会运用卷积神经网络对cifar10 数据集分类。在本讲的最后附上几个经典卷积神经网络:LeNet、AlexNet、VGGNet、InceptionNet和 ResNet 。

一、卷积神经网络基础知识

1.卷积计算过程

卷积计算可认为是一种有效提取图像特征的方法。

一般会用一个正方形的卷积核,按指定步长,在输入特征图上滑动 ,遍历输入特征图中的每个像素点。每一个步长,卷积核会与输入 特征图出现重合区域,重合区域对应元素相乘、求和再加上偏置项 得到输出特征的一个像素点。如图所示:

上图所示的输入特征图的深度为一,即输入特征是是单通道(灰色图片)。如果输入的图片为彩色,则输入特征为三通道(红绿蓝),卷积核的深度也应为三,计算方式如下图所示:

总结:输入特征图的深度(channel数)决定了当前层卷积核的深度; 当前层卷积核的个数,决定了当前层输出特征图的
几种常见的卷积核:

2.感受野(Receptive Field)

定义:卷积神经网络各输出特征图中的每个像素点,在原始输入图片上映射区域的大小。

如上图所示,右边为输出特征图,它的每一个像素点(即一个小方格),映射到原始图片(左边图片)是3*3的区域,所以它的感受野是3。

如上图 ,再对输出的3*3的特征图用绿色的3*3的卷积核作用,会输出一个1*1的输出特征图。这时输出图的一个像素点映射到原始图(最左侧的图)是5*5的区域,所以它的感受野是5。

如果对5*5的原始输入图直接用蓝色的5*5的卷积核作用 ,会输出一个1*1的输出特征图。这个特征图的一个像素点映射到原始图片是5*5的区域,所以它的感受野是5。

由上述过程可知,2 层 3 * 3 卷积核和1 层 5 * 5 卷积核的特征提取能力是一样的,对比两者的计算量,如下图,我们可以知道2 层 3 * 3 卷积核的计算量更小,所以经常会采用多层小卷积核来替换一层大卷积核,在保持感受野相同的情况下减少参数量和计算量。

输出图片边长=(输入图片边长-卷积核高-1)/步长

上图计算量详细推导

对于两个 3 * 3 卷积核来说,第一个 3 * 3 卷积核输出特征图共有(x – 3 + 1)^2 个像素点,每个像素点需要进行 3 * 3 = 9 次乘加运算,第二个 3 * 3 卷积核输出特征图共有(x – 3 + 1 – 3+ 1)^2 个像素点,每个像素点同样需要进行 9 次乘加运算,则总计算量为 9 * (x – 3 + 1)^2 +9 * (x – 3 + 1 – 3 + 1)^2 = 18 x^2 – 108x + 180;对于 5 * 5 卷积核来说,输出特征图共有(x – 5 + 1)^2 个像素点,每个像素点需要进行 5 * 5 = 25 次乘加运算,则总计算量为 25 * (x – 5 + 1)^2 = 25x^2 – 200x + 400

解18 x^2 – 200x + 400 < 25x^2 – 200x +400,经过简单数学运算可得 x < 22/7 or x > 10,x 作为特征图的边长,在大多数情况下显然会是一个大于 10 的值(非常简单的 MNIST 数据集的尺寸也达到了 28 * 28),所以两层 3 *3 卷积核的参数量和计算量,在通常情况下都优于一层 5 * 5 卷积核,尤其是当特征图尺寸比较大的情况下,两层 3 * 3 卷积核在计算量上的优势会更加明显。

3.全零填充(padding) 

为了保持输出图像尺寸与输入图像一致,经常会在输入图像周围进行全零填充,如下图 ,在 5×5 的输入图像周围填 0,则输出特征尺寸同为 5×5。

Tensorflow中使用方式 :

4.批标准化(Batch Normalization,BN)

标准化:使数据符合0均值,1为标准差的分布。

批标准化:对一小批数据(batch),做标准化处理。

Batch Normalization 将神经网络每层的输入都调整到均值为 0,方差为 1 的标准正态分
布,其目的是解决神经网络中梯度消失的问题,如图所示:

BN 操作的另一个重要步骤是缩放和偏移,缩放因子 γ 以及偏移因子 β都是可训练参数,其作用如图所示:

TF描述批标准化 tf.keras.layers.BatchNormalization(),BN层位于卷积层之后,激活层之前。

5.池化(Pooling)

池化用于减少特征数据量(降维)。 最大值池化可提取图片纹理,均值池化可保留背景特征。如图:

 TF描述池化:

6.舍弃(Dropout)

在之前深度学习中叫做随机失活,在神经网络的训练过程中,将一部分神经元按照一定概率从神经网络中暂时舍弃,使用时被舍弃的神经元恢复链接,如图所示:

TF描述舍弃:tf.keras.layers.Dropout(舍弃的概率)

二、搭建卷积神经网络

1.卷积过程整合

总结:卷积就是特征提取器,就是CBAPD。

2.卷积神经网络搭建示例 

主要思路为在卷积神经网络(CNN)中利用卷积核(kernel)提取特征后,送入全连接网络。如下图:

下面以下图所示卷积层和全连接层为例搭建:

Tensorflow 表示:

在此主干的基础上,利用之前写过的使用Keras 来搭建神经网络的“八股”套路。还可以添加其他内容,来完善神经网络的功能,如利用自己的图片和标签文件来自制数据集;通过旋转、缩放、平移等操作对数据集进行数据增强;保存模型文件进行断点续训;提取训练后得到的模型参数以及准确率曲线,实现可视化等。 

代码如下:

import tensorflow as tf
import os
import numpy as np
from matplotlib import pyplot as plt
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense
from tensorflow.keras import Modelnp.set_printoptions(threshold=np.inf)class Baseline(Model):def __init__(self):super(Baseline, self).__init__()self.c1 = Conv2D(filters=6, kernel_size=(5, 5), padding='same')  # 卷积层self.b1 = BatchNormalization()  # BN层self.a1 = Activation('relu')  # 激活层self.p1 = MaxPool2D(pool_size=(2, 2), strides=2, padding='same')  # 池化层self.d1 = Dropout(0.2)  # dropout层self.flatten = Flatten()self.f1 = Dense(128, activation='relu')self.d2 = Dropout(0.2)self.f2 = Dense(10, activation='softmax')def call(self, x):x = self.c1(x)x = self.b1(x)x = self.a1(x)x = self.p1(x)x = self.d1(x)x = self.flatten(x)x = self.f1(x)x = self.d2(x)y = self.f2(x)return ymodel = Baseline()model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),metrics=['sparse_categorical_accuracy'])checkpoint_save_path = "./checkpoint/Baseline.ckpt"
if os.path.exists(checkpoint_save_path + '.index'):print('-------------load the model-----------------')model.load_weights(checkpoint_save_path)cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,save_weights_only=True,save_best_only=True)history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1,callbacks=[cp_callback])
model.summary()# print(model.trainable_variables)
file = open('./weights.txt', 'w')
for v in model.trainable_variables:file.write(str(v.name) + '\n')file.write(str(v.shape) + '\n')file.write(str(v.numpy()) + '\n')
file.close()###############################################    show   ################################################ 显示训练集和验证集的acc和loss曲线
acc = history.history['sparse_categorical_accuracy']
val_acc = history.history['val_sparse_categorical_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()plt.subplot(1, 2, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()

三、使用卷积神经网络

cifar10 数据集介绍:

该数据集共有 60000 张彩色图像,每张尺寸为 32 * 32,分为 10 类,每类 6000 张。训练集 50000 张,分为 5 个训练批,每批 10000 张;从每一类随机取 1000张构成测试集,共 10000 张,剩下的随机排列组成训练集,如图所示:

利用上面搭建的神经网络对cifar10 数据集进行训练,验证。

在神经网络训练前加上数据导入:

cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

结果如下:

就是之前在就

四、经典卷积神经网络 

5 个 CNN 经典网络:

1.LeNet 

共享卷积核,减少网络参数。

TF表示:

2.AlexNet

激活函数使用 Relu,提升训练速度;Dropout 防止过拟合。TF表示:

3 VGGNet 

小卷积核减少参数的同时,提高识别准确率;网络结构规整,适合并行加速。

 TF表示:

 

4.InceptionNe

一层内使用不同尺寸的卷积核,提升感知力(通过 padding 实现输出特征面积一致);
使用 1 * 1 卷积核,改变输出特征 channel 数(减少网络参数)。

TF表示:

5.ResNe

层间残差跳连,引入前方信息,减少梯度消失,使神经网络层数变身成为可能。

TF表示:

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

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

相关文章

在Linux中安装FFmpeg

在Linux中安装FFmpeg有两种方法。 安装FFmpeg&#xff08;方法一&#xff09; 第一步&#xff0c;下载FFmpeg。 登录地址&#xff1a;John Van Sickle - FFmpeg Static Builds下载安装包ffmpeg-git-amd64-static.tar.xz。然后使用WinSCP将安装包上传到文件夹/usr/local/src中…

vue2基础系列教程之插槽slot你不得不知道的知识点及面试高频问题

vue2中对插槽的介绍&#xff0c;花了大量的章节篇幅&#xff0c;可想而知&#xff0c;它在框架中的重要性。 slot及slot-scope自 2.6.0 起被废弃。新推荐的语法请查阅v-slot,就语法我们这里就一笔带过&#xff0c;主要学习新的语法 你不能不知道的slot知识点 插槽的作用&#…

C++知识要点总结笔记

文章目录 前言一、c基础1.指针和引用指针和引用的区别函数指针 2.数据类型整型 short int long 和 long long无符号类型强制类型转换怎样判断两个浮点数是否相等&#xff1f; 3.关键字conststaticconst和static的区别define 和 typedef 的区别define 和 inline 的区别define和c…

PostgreSQL(PG)(二十二)

&#x1f33b;&#x1f33b; 目录 &#x1f33b;&#x1f33b; 一、PostgreSQL 简介1.1、PG 的历史1.2、PG的社区1.2.1 纯社区1.2.2 完善的组织结构1.2.3 开源许可独特性 1.3 、PostgreSQL与MySQL的比较 二、PostgresQL的下载安装2.1、Windows上安装 PostgreSQL2.2、远程 连接 …

Pikachu靶场之XSS

先来点鸡汤&#xff0c;少就是多&#xff0c;慢就是快。 环境搭建 攻击机kali 192.168.146.140 靶机win7 192.168.146.161 下载zip&#xff0c;pikachu - GitCode 把下载好的pikachu-master&#xff0c;拖进win7&#xff0c;用phpstudy打开网站根目录&#xff0c;.....再用…

Unity3D下如何播放RTSP流?

技术背景 在Unity3D中直接播放RTSP&#xff08;Real Time Streaming Protocol&#xff09;流并不直接支持&#xff0c;因为Unity的内置多媒体组件&#xff08;如AudioSource和VideoPlayer&#xff09;主要设计用于处理本地文件或HTTP流&#xff0c;而不直接支持RTSP。所以&…

【话题讨论】AI时代程序员核心力:技术深耕,跨界学习,软硬兼备

目录 引言 一、AI辅助编程对程序员工作的影响 1.1 AI工具如何提升工作效率 1.2 AI工具的风险 1.3 应对策略 二、程序员应重点发展的核心能力 2.1 核心竞争力 2.2 企业和教育机构的调整 三、人机协作模式下的职业发展规划 3.1 持续学习的重要性 3.2 选择适合自己的…

Python3网络爬虫开发实战(17)爬虫的管理和部署(第一版)

文章目录 一、 Scrapyd 分布式部署1.1 了解 Scrapyd1.2 准备工作1.3 访问 Scrapyd1.4 Scrapyd 的功能1.5 ScrapydAPI 的使用 二、Scrapyd-Client 的使用2.1 准备工作2.2 Scrapyd-Client 的功能2.3 Scrapyd-Client 部署 三、Scrapyd 对接 Docker3.1 准备工作3.2 对接 Docker 四、…

Java Web服务运行一段时间后出现cpu升高导致的性能下降问题排查

背景 有个web服务&#xff0c;运行一段时间后&#xff0c;出现cpu逐渐占用高&#xff0c;服务处理请求整体性能下降问题。 异常情况时&#xff0c; 同时jvm的cpu上涨 最终表现为&#xff0c;处理内部逻辑执行耗时变高。 排查原因 原来服务的jvm启动参数带了 -XX:-TieredCom…

Java项目实战II基于Java+Spring Boot+MySQL的校园社团信息管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当今高校…

马匹行为识别系统源码分享

马匹行为识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

计算机毕业设计 在线新闻聚合平台的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【计算机毕设-大数据方向】基于Hadoop的智能交通数据分析可视化系统的设计与实现

&#x1f497;博主介绍&#xff1a;✌全平台粉丝5W,高级大厂开发程序员&#x1f603;&#xff0c;博客之星、掘金/知乎/华为云/阿里云等平台优质作者。 【源码获取】关注并且私信我 【联系方式】&#x1f447;&#x1f447;&#x1f447;最下边&#x1f447;&#x1f447;&…

Redis的存储原理和数据模型

一、Redis是单线程还是多线程呢&#xff1f; 我们通过跑redis的代码&#xff0c;查看运行的程序可以得知&#xff0c;Redis本身其实是个多线程&#xff0c;其中包括redis-server&#xff0c;bio_close_file&#xff0c;bio_aof_fsync&#xff0c;bio_lazy_free&#xff0c;io_t…

Mina protocol - 体验教程

Mina protocol - 体验教程 一、零知识证明( Zero Knowledge Proof )1、零知识证明&#xff08;ZKP&#xff09;的基本流程工作流程&#xff1a; 2、zkApp 的优势&#xff1a;3、zkApp 每个方法的编译过程&#xff1a; 二、搭建第一个zkapp先决条件1、下载或者更新 zkApp CLI​2…

Chainlit集成LlamaIndex实现知识库高级检索(句子窗口节点检索)

检索原理 句子窗口检索原理 通常在执行基础的RAG检索时我们会将文档按指定的块大小(chunk_size)进行切割&#xff0c;然后进行embedding的向量化处理后存入向量数据库中&#xff0c;在检索时我们会计算用户问题(question) 与文档块的相似度&#xff0c;并选取K个最相似的文档(…

LeetCode[中等] 49.字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 思路&#xff1a; new Dictionary<string, List<string>>() 存储数据&#xff0c;key为排序之后的字符…

2024年9月18日历史上的今天大事件早读

1043年9月18日 范仲淹实行改革 1393年9月18日 “活财神”沈万三逝世 1783年9月18日 瑞士著名数学家欧拉逝世 1851年9月18日 《纽约时报》创刊 1903年9月18日 清末爱国将领冯子材逝世 1917年9月18日 护法战争爆发 1931年9月18日 “九一八”事变爆发 1936年9月18日 阎锡山…

澳元/美元价格:进一步上涨看向美联储

澳元/美元在0.6700关口附近波动不定。美元因美国经济数据强劲而重新获得上行动力。接下来&#xff0c;澳大利亚将公布西太平洋领先指数。 美元的再度走强使风险敏感资产承压&#xff0c;澳元/美元周二维持在0.6700关口上方的小幅区间内。尽管美元反弹&#xff0c;澳元仍成功维…

深入解析代理模式:静态代理、JDK 动态代理和 CGLIB 的全方位对比!

代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了对象的替身&#xff0c;即代理对象来控制对实际对象的访问。通过代理对象&#xff0c;可以在不修改目标对象的情况下&#xff0c;扩展或控制其功能。例如&#xff0c;代理模式可以用于延…