Tensorflow—第五讲卷积神经网络

news2024/11/15 20:59:52

本讲概述

卷积实际上就是特征提取。本讲我们先了解学习卷积神经网络基础知识,再一步步地学习搭建卷积神经网络,最后会运用卷积神经网络对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 Model

np.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 y


model = 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.coloradmin.cn/o/2144102.html

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

相关文章

开发小程序

由于之前购入的阿里云ECS放着落灰&#xff0c;碰巧又看到个有趣的项目&#xff0c;于是就做了个生成头像的小程序…由于第一次完整发布小程序&#xff0c;记录一下遇到的问题 小程序名称&#xff1a;靓仔创意头像 &#x1f602; 关于小程序 接口请求&#xff0c;在开发过程中…

少儿编程小游戏 | Scratch 射击游戏《开枪!》

在线玩&#xff1a;Scratch射击游戏 : “开枪&#xff01;” 免费下载-小虎鲸Scratch资源站 随着科技的飞速发展&#xff0c;编程已经成为孩子们未来必备的技能之一。而Scratch作为一款专为少儿设计的编程工具&#xff0c;通过可视化的编程方式&#xff0c;让孩子们在玩游戏的过…

JAVA-集合相关

HashMap如何解决哈希冲突的&#xff1f; 计算hash值&#xff0c;基于hashCode计算冲突之后&#xff0c;先是使用链式寻址法当链表长度大于8&#xff0c;且hash表的容量大于60的时候&#xff0c;再添加元素则转化成红黑树 为什么计算hash值是&#xff0c;是将hash地址的值右移1…

代码随想录训练营 Day62打卡 图论part11 Floyd 算法 A * 算法

代码随想录训练营 Day62打卡 图论part11 Floyd 算法 例题&#xff1a;卡码97. 小明逛公园 题目描述 小明喜欢去公园散步&#xff0c;公园内布置了许多的景点&#xff0c;相互之间通过小路连接&#xff0c;小明希望在观看景点的同时&#xff0c;能够节省体力&#xff0c;走最短…

C++速通LeetCode中等第3题-字母异位词分组

双指针法&#xff1a;两个指针分别指向左右边界&#xff0c;记录最大面积&#xff0c;由于面积由短板决定&#xff0c;两个指针中较短的短指针向内移动一格&#xff0c;再次记录最大面积&#xff0c; 直到两指针相遇&#xff0c;得出答案。 class Solution { public:int maxAr…

PyQt / PySide + Pywin32 + ctypes 自定义标题栏窗口 + 完全还原 Windows 原生窗口边框特效项目

项目地址&#xff1a; GitHub - github201014/PyQt-NativeWindow: A class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypesA class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypes - github201014/PyQt-NativeWindow…

切换淘宝最新npm镜像源

文章目录 一、前言二、切换淘宝最新npm镜像源2.1 查询最新镜像源2.2 两种方式切换npm镜像源2.2.1 通过npm配置2.2.1 通过cnpm配置 三、总结 一、前言 NPM&#xff08;Node Package Manager&#xff09;&#xff0c;是NodeJs的模块依赖管理工具&#xff0c;用于nodejs模块的安装…

java多线程模拟多个售票员从同一个票池售票

程序功能 这段代码模拟了多个售票员从一个有限的票池中售票的过程。主要功能如下&#xff1a; 票池共有50张票&#xff0c;多个售票员&#xff08;线程&#xff09;并发进行售票。 使用同步机制确保线程安全&#xff0c;避免多个售票员同时出售同一张票。 每个售票员不断检查票…

5.内容创作的未来:ChatGPT如何辅助写作(5/10)

引言 在信息爆炸的时代&#xff0c;内容创作已成为连接品牌与受众、传递信息与知识、以及塑造文化与观念的重要手段。随着数字媒体的兴起&#xff0c;内容创作的需求日益增长&#xff0c;对创作者的写作速度和质量提出了更高的要求。人工智能&#xff08;AI&#xff09;技术的…

PHP全程可视化防伪溯源一体化管理系统小程序源码

全程可视化&#xff0c;防伪溯源新篇章 —— 揭秘一体化管理系统的力量 &#x1f50d; 开篇&#xff1a;透视未来&#xff0c;从源头到终端的安心之旅 在这个信息透明化时代&#xff0c;每一件商品都承载着消费者的信任与期待。而“全程可视化防伪溯源一体化管理系统”&#x…

【网络安全 | 代码审计】PHP无参数RCE

未经许可,不得转载。 文章目录 无参数RCE代码审计1、利用Session ID实现无参数RCE2、利用get_defined_vars ()函数实现无参数RCE3、利用getallheaders()实现无参数RCE4、利用getenv()实现无参数RCE5、利用scandir()实现无参数RCE靶场实例无参数RCE 一般情况下,RCE需要通过传…

Nuxt3部署遇到的问题归纳

fetch Headers is not a constructor 和 _fetch is not a function 这两个问题&#xff0c;本质上都是fetch在服务器上无法正常使用的问题&#xff0c;需要检查本地node版本与线上服务器node版本是否一致。否则在依赖安装上会产生依赖版本差异导致应用无法正常运行。 以下是wi…

若依-原理

1.代码生成器 1.1源码分析 代码生成器分为两个部分&#xff1a; 第一部分涉及将业务表结构导入到系统中 第二部分是点击生成按钮&#xff0c;系统将根据表结构生成相应的前后端代码&#xff0c;并提供下载。 1.表结构说明 gen_table&#xff1a;存储业务表的基本信息 &am…

事件循环event loop入门(基于ESP-IDF)

主要参考资料&#xff1a; 事件循环库: https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-reference/system/esp_event.html Event Loop 大白话版: https://www.bilibili.com/video/BV1FD4y1j79J/?spm_id_from333.999.0.0&vd_sourcedd284033cd0c4d1f3…

盘点常见网络安全术语(建议收藏)

1、黑帽 为非法目的进行黑客攻击的人&#xff0c;通常是为了经济利益。他们进入安全网络以销毁&#xff0c;赎回&#xff0c;修改或窃取数据&#xff0c;或使网络无法用于授权用户。这个名字来源于这样一个事实&#xff1a;老式的黑白西部电影中的恶棍很容易被电影观众识别&…

在linux用docker部署MySQL失败

Unable to find image mysql:latest locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 128.121.243.107:443: i/o timeout. See docker run --help. 从网上找解决问题一直说是镜像问题&#xff0c;我原来的镜像是从自…

8-----手机机型维修工具助手 功能较全 涵盖解锁 刷机 修复等选项 维修推荐

上图是一款功能较全的维修加密狗。目前可以无限制 任何人使用。看图片可以了解其中涵盖刷机 解锁 修复分区 查看短接图 安装驱动 修复基带等等选项。而且其中有针对各个机型型号的对应功能操作。以及一些rec5.0相关的操作选项。 通过此博文了解 ★★★★★此工具涵盖的一些…

优秀项目经理需必备的四个项目管理最佳技术

项目经理在项目管理过程中&#xff0c;需要具备多种管理思维以确保项目的顺利进行和成功交付。项目经理要有效地管理好项目&#xff0c;确保项目按时、按质、按预算完成&#xff0c;需要特别关注以下四个方面&#xff1a; 1. 明确项目目标与范围 设定清晰目标&#xff1a;与项目…

C++竞赛初阶L1-15-第六单元-多维数组(34~35课)557: T456507 图像旋转

题目内容 输入一个 n 行 m 列的黑白图像&#xff0c;将它顺时针旋转 90 度后输出。 输入格式 第一行包含两个整数 n 和 m&#xff0c;表示图像包含像素点的行数和列数。1≤n≤100&#xff0c;1≤m≤100。 接下来 n 行&#xff0c;每行 m 个整数&#xff0c;表示图像的每个像…

OpenCV与AI深度学习 | 实战!利用多模态大模型生成绘本

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;实战&#xff01;利用多模态大模型生成绘本【文末送书】 &#x1f680; 引言 在数字时代&#xff0c;技术与创意的结合不断刷新我们的世界观。…