IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 卷积的特征提取与参数计算 -> 正文阅读

[人工智能]卷积的特征提取与参数计算

Dense和Conv2D根本区别在于,Dense层从输入空间中学到的是全局模式,比如对于MNIST数字来说,全局模式就是涉及所有像素的模式。而Conv2D学到的是局部模式(local pattern),同样以MNIST为例,Conv2D学到的是在输入图像的小窗口中发现的模式(pattern)。

这个重要特性使卷积神经网络具有两个有趣的性质:

1. 卷积神经网络学到的模式具有平移不变性。卷积神经网络在图像右下角学到某个模式后,它可以在任何地方识别这个模式,比如左上角。但是对于Dense网络来说,如果模式出现在新的位置那么必须重新学习这个模式。这使得卷积神经网络在处理图像时可以更高效的利用数据。

2. 卷积神经网络可以学到模式的空间层次结构。如下图所示,第一个卷积层将学习较小的局部模式(比如边缘),第二个卷积层将学习由第一个层的特征们组成的更大的模式,以此类推,使得卷积神经网络可以学习越来越复杂,越来越抽象的视觉概念。

对于MINST,第一个卷积层接收一个大小为(28,28,1)的输入特征图。为了通过卷积从该输入特征图中提取不同的局部模式,我们要设计不同的卷积核。每个卷积核的大小宽高多为3*3或者5*5,卷积核的深度与输入特征图的深度一致,卷积核的个数与这一层需要获得的局部模式数量一致。每一个卷积核也成为一个滤波器,通过滤波器的过滤(filter),就学到了一个局部模式(特征)。例如,我设计的第一个卷积层希望从这张图片中获取32种局部模式,那么我就要设计32个(3*3*1)的卷积核,经过第一层过滤后,会形成一个(26*26*32)的输出特征图。每个过滤器与输入特征图进行卷积运算会得到一个(26*26)的响应图(response map),32个过滤器就会得到(26*26*32)这样输出特征图。

所以,特征图深度方向上的每一个维度都是一个特征(过滤器),而每一个维度上的2D张量是该维度过滤器对输入的响应所形成的二维空间图(map)。

?现在,对第一次卷积层得到的(26*26*32)特征图进行一次最大值池化(MaxPooling),经过池化的特征数量变为(13*13*32)。随后设计第二个卷积层,对于第二个卷积层而言输入的特征图就是(13,13,32),那么第二个卷积层的卷积核深度也应该是32,也就是(3,3,32),比如第二个卷积层我想提取64个特征,那么就意味着这一层经过运算后,输出的特征图为(11,11,64),随后是针对第二层卷积输出的最大值池化,经过池化的特征数量变为(5,5,64),然后可以设计第三个卷积层,那么根据输入特征图的深度,第三个卷积层的卷积核深度为64,也就是(3,3,64),比如第三个卷积层我也想提取64个特征,那么就意味着这一层经过运算后,输出的特征图为(3,3,64)。经过第三次卷积后,将输出内容可以与Dense层连接,然后分类输出。当然在于Dense层连接前,需要将3维数据“抻平”,变为一维数据才能输入到Dense层。最终我们以代码的形式来设计一下文中所述的神经网络:

from tensorflow import keras
from tensorflow.keras import models
from tensorflow.keras import layers
from tensorflow.keras import datasets
from tensorflow.keras import utils

mymodel = models.Sequential()
mymodel.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1)))
mymodel.add(layers.MaxPooling2D(2,2))
mymodel.add(layers.Conv2D(64,(3,3),activation='relu'))
mymodel.add(layers.MaxPooling2D(2,2))
mymodel.add(layers.Conv2D(64,(3,3),activation='relu'))
mymodel.add(layers.Flatten())
mymodel.add(layers.Dense(64,activation='relu'))
mymodel.add(layers.Dense(10,activation='softmax'))
mymodel.summary()

?模型的summary函数会返回每个层的参数量:

_________________________________________________________________
?Layer (type) ? ? ? ? ? ? ? ?Output Shape ? ? ? ? ? ? ?Param #
=================================================================
?conv2d (Conv2D) ? ? ? ? ? ? (None, 26, 26, 32) ? ? ? ?320

?max_pooling2d (MaxPooling2D ?(None, 13, 13, 32) ? ? ? 0
?)

?conv2d_1 (Conv2D) ? ? ? ? ? (None, 11, 11, 64) ? ? ? ?18496

?max_pooling2d_1 (MaxPooling ?(None, 5, 5, 64) ? ? ? ? 0
?2D)

?conv2d_2 (Conv2D) ? ? ? ? ? (None, 3, 3, 64) ? ? ? ? ?36928

?flatten (Flatten) ? ? ? ? ? (None, 576) ? ? ? ? ? ? ? 0

?dense (Dense) ? ? ? ? ? ? ? (None, 64) ? ? ? ? ? ? ? ?36928

?dense_1 (Dense) ? ? ? ? ? ? (None, 10) ? ? ? ? ? ? ? ?650

如果能理解卷积网络层中核的形状和个数,那么每一层的参数就不难理解了。

?conv2d (Conv2D) ? ? ? ? ? ? (None, 26, 26, 32) ? ? ? ?320

第一个卷积层的卷积核大小为(3,3,1),共32个,所以w = 3*3*1*32 = 288,有w就会有偏置b,一维向量共32个元素。所以一共有320个参数。?

?conv2d_1 (Conv2D) ? ? ? ? ? (None, 11, 11, 64) ? ? ? ?18496

第二个卷积层的卷积核大小为(3,3,32),共64个,所以w = 3 * 3 *32 * 64 =??18432,还有偏置b中的64个变量,所以一共有18496个参数。

?conv2d_2 (Conv2D) ? ? ? ? ? (None, 3, 3, 64) ? ? ? ? ?36928

第三个卷积层的卷积核大小为(3,3,64),共64个,所以w = 3 * 3 *64?* 64 =??36864,还有偏置b中的64个变量,所以一共有36928个参数。

?dense (Dense) ? ? ? ? ? ? ? (None, 64) ? ? ? ? ? ? ? ?36928

输入层维度为576(把(3,3,64)给抻平),输出层维度是64,所以w是?576*64 = 36864,再加上偏置向量中的64个元素,所以一共有36928个参数。

?dense_1 (Dense) ? ? ? ? ? ? (None, 10) ? ? ? ? ? ? ? ?650

最后一个Dense层,输入为64,输出是10,所以w是64*10 = 640,最后再加上10个偏置,所以一共有650个参数。

整个神经网络的参数总数为93322个。

(train_img,train_labels),(test_img,test_labels) = datasets.mnist.load_data()

train_img = train_img.reshape((60000,28,28,1))
train_img = train_img.astype('float32')/255

test_img = test_img.reshape((10000,28,28,1))
test_img = test_img.astype('float32')/255

train_labels = utils.to_categorical(train_labels)
test_labels = utils.to_categorical(test_labels)

mymodel.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])

mymodel.fit(train_img,train_labels,epochs=5,batch_size=64)

myloss,myaccuracy =mymodel.evaluate(test_img,test_labels)
print(f'模型测试准确率:{myaccuracy}')

最终在测试集上得到的准确率为0.9912999868392944。

相较于单纯使用Dense进行组网准确率还是有明显上升的(纯Dense组网的准确率在97%以上)。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-12-06 15:15:13  更:2021-12-06 15:16:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 2:18:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码