卷积神经网络必备基础

卷积神经网络(Convolutional Neural Network,  CNN)

传统的全连接神经网络并不适用于图像处理,这是因为:每个像素点都是一个输入特征,随着层数的增加,参数以指数级增长,而图片的像素点往往非常多,导致参数的规模非常巨大。

例如:

  • 32x32的图片:仅仅输入层,就有32x32x3(三原色) = 3072个特征
  • 200x200的图片:仅仅输入层,就有200x200x3(三原色) = 120000个特征

仅仅特征就有这么多,其后的隐藏层,对应的权重参数的数量是:(特征数)x (隐藏层结点数),可以想象这个参数的规模。

卷积(Convolution)

本文只解释卷积的具体操作,不讨论卷积的数学定义。如下所示,对于左上角的原始矩阵数据,我们使用一个卷积核(Convolution Kernel,也成为过滤器filter)的3x3小方阵,依次和原始矩阵数据中的每一个3x3的子方阵数据做“相乘+求和”的操作。

以图中为例

  • 绿色的两个区域的卷积计算过程见图片右上角,得到计算结果“-8”,即完成了一次卷积运算。
  • 下一次卷积运算,是将第一个3x3子方阵向右平移一个单位,得到第二个3x3子方阵\begin{bmatrix} 0 &0 &0 \\ 1 & 1 &1 \\ 1 & 2&2 \end{bmatrix},将其和卷积核相乘再求和,得到结果依然是-8。
  • 向右平移到最后一个3x3子方阵之后,回到矩阵最左边,再向下平移一个单位,得到3x3子方阵\begin{bmatrix} 0 &1 &1 \\ 0 &1 &2 \\ 0 &1 &2 \end{bmatrix},将其和卷积核相乘再求和,得到结果依然是-8。
  • 按照这个顺序平移下去,直到最后一个3x3子方阵的卷积运算完成,得到结果为一个5x5矩阵\begin{bmatrix} -8 &-8 &-4 &-4 &0 \\ -8 &-4 &-4 &0 &4 \\ -4 &-4 &0 &4 &4 \\ -4 &0 &4 &4 &8 \\ -4 &-4 &0 &4 &8 \end{bmatrix}

填充零(Zero Padding)

通过前面的例子可以看出,在对一张原始图片像素数据执行卷积计算后,得到的输出数据尺寸往往会略小于原始数据的尺寸(例子中7x7的矩阵经过计算后得到一个较小的5x5矩阵)。如果希望输出相同尺寸的数据,则可以在原始矩阵外围填充零,然后再进行卷积计算。注意:一般这个操作会对图片的上下左右对称填充,如下所示

假设:N为原始图片大小,F为卷积核(过滤器)大小,S为移动步长,P为填充零的(P是上下左右对称填充),则卷积操作后,得到的图片大小为:\frac{N-F+2P}{S} + 1

汇聚(Pooling,也有翻译为池化)

在神经网络介绍中,我们已经介绍了常用的汇聚层算法有:取最大值,取平均值,取线性组合等。一般最常用的就是前两种,分别称为最大汇聚(Max Pooling)平均汇聚(Average Pooling)。

最大汇聚

确定一个过滤器的大小,对原数据中同样大小区域的数据取最大值,作为结果。如下所示,对于原始的4x4数据,确定过滤器大小为2x2,则对4x4数据上的每一个2x2区域选一个最大值。这样的区域一共有4个(注意:每一个划分出来的2x2区域是不重叠的)。依次取出最大值7、4、9、8,得到了右边的汇聚结果。

平均汇聚

和最大汇聚的区别是:对每一区域取平均值作为结果

汇聚的作用是什么?

  • 以非线性的方式降低采样,减少参数和计算量
  • 降低了过拟合(Overfitting)的机率
  • 降低原始数据的大小,意味着损失了一些信息,因此一般会增加过滤器的个数

各种汇聚中,最大汇聚是最流行的,因为

  • 它可以提升一个图片在某个区域的显著特征
  • 在降低采样的时候,它能保留图片中最具有特征的部分

在卷积神经网络必备基础中,我们使用了传统的FNN模型解决了MNIST问题。下图是这个问题的CNN处理模型,下一节将用程序来实现这个模型。

使用Keras实现CNN

1. 导入Python的包

注意:在层的导入中,我们导入了卷积层Conv2D,最大汇聚层MaxPooling2D,平铺层Flatten(将矩阵数据平铺为向量),全连接层Dense

from keras.datasets import mnist
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Denseimport matplotlib.pyplot as plt# Allow view plots in the notebook, '%' is a magic usage for python for special
%matplotlib inline

2. 加载数据

和神经网络必备基础中一样

(X_train_raw, y_train_raw), (X_test_raw, y_test_raw) = mnist.load_data()
print(X_train_raw.shape, X_test_raw.shape)
print(y_train_raw.shape, y_test_raw.shape)

3. 预处理训练数据

注意:对图像数据进行卷积操作,需要将数据reshape为3维,即(长,宽,颜色),因为是黑白图片,所以“颜色”这个维度取1,如果是彩色,则“颜色”这个维度取3

# suppose we don't know the data shape of the raw loaded MNIST data
# , we must make sure the data shape is what we wanted
X_train = X_train_raw.reshape(60000,28,28,1)
X_test = X_test_raw.reshape(10000,28,28,1)# centered the data value, which is divided by 255 (each pixel value is 0~255)
X_train = X_train.astype('float32') / 255.0
X_test = X_test.astype('float32') / 255.0
print(X_train.shape, X_test.shape)

4. 预处理测试数据

和神经网络必备基础中一样,我们将标签扩张为一个由若干0和1组成的向量。

# convert each class value to a vector with value of 0 or 1
# i.e. if class vector, then it will be a matrix with value of 0 or 1
# e.g. for 0~9, 10 classes in total, if value is 5, then it will be
#      coverted to [0,0,0,0,0,1,0,0,0,0]
y_train = to_categorical(y_train_raw, NUM_CLASSES)
y_test = to_categorical(y_test_raw, NUM_CLASSES)
print(y_train.shape, y_test.shape)
print(y_train[0])

5. 创建和编译模型

cnn = Sequential()
cnn.add(Conv2D(32, kernel_size=(5,5), input_shape=(28,28,1), padding='same',activation='relu'))
cnn.add(MaxPooling2D())
cnn.add(Conv2D(64, kernel_size=(5,5), padding='same',activation='relu'))
cnn.add(MaxPooling2D())
cnn.add(Flatten())
cnn.add(Dense(1024, activation='relu'))
cnn.add(Dense(10, activation='softmax'))cnn.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
print(cnn.summary())

summary()输出如下:

Model: "sequential_3"
_________________________________________________________________Layer (type)                Output Shape              Param #   
=================================================================conv2d_5 (Conv2D)           (None, 28, 28, 32)        832       max_pooling2d_5 (MaxPoolin  (None, 14, 14, 32)        0         g2D)                                                            conv2d_6 (Conv2D)           (None, 14, 14, 64)        51264     max_pooling2d_6 (MaxPoolin  (None, 7, 7, 64)          0         g2D)                                                            flatten_2 (Flatten)         (None, 3136)              0         dense_4 (Dense)             (None, 1024)              3212288   dense_5 (Dense)             (None, 10)                10250     =================================================================
Total params: 3274634 (12.49 MB)
Trainable params: 3274634 (12.49 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
None

关于参数个数的说明:

  • 对于汇聚层,因为是对原数据取最大值,所以不需要参数
  • 对于卷积层,参数即卷积核中的参数,外加每一个新图片数据对应的一个偏好参数,例如
    • 对于conv2d_5层:每个卷积核有5x5=25个参数,由1个输入图片产生32个输出图片,于是由1x32个卷积核,外加32个偏好,总共有5x5x1x32+32 = 832个参数
    • 对于conv2d_6层:同理,总共有5x5x32x64+64 = 51264个参数
  • 对于平铺层,只是将数据展开,所以也不需要参数
  • 对于全连接层dense_4:3136(7x7x64) x 1024+1024=3212288
  • 对于全连接层dense_5:1024x10_10=10250

6. 训练和评价模型

这个模型训练时间比较长,是因为我们在卷积层使用了较多的特征提取:第一次卷积操作从一张图中提取了32种不同的特征,第二次卷积操作从32张图种提取了更多的特征。注意到,如果图片像素增加了,只要卷积核和特征图片的种类不变,上述模型的参数是不会增加的。

history_cnn = cnn.fit(X_train, y_train, epochs=2, verbose=1, validation_data=(X_test, y_test))

输出如下:

Epoch 1/2
1875/1875 [==============================] - 227s 121ms/step - loss: 0.0980 - accuracy: 0.9693 - val_loss: 0.0304 - val_accuracy: 0.9895
Epoch 2/2
1875/1875 [==============================] - 221s 118ms/step - loss: 0.0362 - accuracy: 0.9888 - val_loss: 0.0244 - val_accuracy: 0.9918

可以看到,每个epoch训练时间接近4分钟。

使用evaluate()评价模型

score = cnn.evaluate(X_test, y_test)
print(score)

得到输出如下:

313/313 [==============================] - 9s 28ms/step - loss: 0.0244 - accuracy: 0.9918
[0.024433128535747528, 0.9918000102043152]

和神经网络必备基础种的FNN相比,这里我们得到了更高的准确度:99.18%

CNN的增强

丢弃(Dropout)

  • 以p为概率、随机去掉一些训练层中的神经元(结点)
  • 目的:防止过拟合,只能用于训练数据

图像增强(image augmentation)

从训练集中取出图片数据,然后对其进行某些操作,从而:

  • 得到更多的图片用于模型训练
  • 通过操作后得到的新图片,使得模型更加健壮

关于这部分的细节,可以参考这篇博文:(数据)图像预处理——image augmentation图像增广之cutout、Mixup、CutMix方法及其实现_cutmix代码实现-CSDN博客

用Keras可以实现图像增强,程序如下

import numpy as np
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.applications.inception_v3 import preprocess_inputtrain_datagen = ImageDataGenerator(preprocessing_function=preprocess_input,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True)train_generator = train_datagen.flow_from_directory('Colab Notebooks/images/sample_train/',target_size=(150, 150),save_to_dir='Colab Notebooks/images/sample_confirm/')

可以看到,Keras提供了ImageDataGenerator()这个类实现了这一功能:在'Colab Notebooks/images/sample_train/'这个路径下预先存放了几张原始图片,然后在'Colab Notebooks/images/sample_confirm/'路径下根据原始团片产生了很多新的图片。

这段程序不详解了,有兴趣可以自己查阅手册研究。

ImageNet介绍

什么是ImageNet

  • 一个很容易访问的大规模图片数据库
  • 起始于2009年
  • 基于WordNet架构
  • 每一个概念有多个同义词集合(synset, or synonym set)描述,例如对于Continental glacier(大陆冰川)有以下同义词集:Geological formation | ice mass | glacier | continental glacier
  • 当前,每一个同义词集大约有1000张图片

 ImageNet网址:https://image-net.org/

ImageNet挑战赛(ImageNet Challenge)

  • 每年一次的竞赛:区分几千张照片,并将其划分到1000个类别中
  • 全称ImageNet Large Scale Visual Recognition Challenge (ILSVRC)

下图反映了从10年到15年参加ILSVRC的优秀模型的深度(层数)变化,可以看到深度是在逐渐降低的。

VGG模型

VGG模型是一种深度卷积神经网络(CNN),由牛津大学的Visual Geometry Group(Oxford VGG)提出,该模型在2014年的ILSVRC(ImageNet大规模视觉识别挑战赛)中获得了第二名。VGG模型在多个迁移学习任务中的表现优于其他模型,并且从图像中提取CNN特征时,VGG模型是首选算法。

VGG16模型的示意图如下:

Keras同样也支持了VGG模型,程序如下:

import numpy as np
from keras.applications import vgg16
from keras.preprocessing import imagemodel = vgg16.VGG16(weights='imagenet')
# VGG16 model requires a image size of 224x224
img = image.load_img('Colab Notebooks/images/sample_train/cats/cat_02.jpeg',target_size=(224,224))
img#convet to numpy array
arr = image.img_to_array(img)
arr.shape# expand dimension, as 1 dimension is batch, or else predict() will report error
#  "convolution input must be 4-dimensional:"
arr = np.expand_dims(arr, axis=0)
arr.shape# preprocessing
arr = vgg16.preprocess_input(arr)
arr# predict
pred = model.predict(arr)
# shows probilites in 1000 categories, as vgg model has 1000 categories
pred# predications for top5
vgg16.decode_predictions(pred, top=5)

上述程序对我们存放的一张猫的图片:'Colab Notebooks/images/sample_train/cats/cat_02.jpeg',使用vgg16直接进行预测。程序输出如下:

[[('n02123045', 'tabby', 0.6933489),('n02123159', 'tiger_cat', 0.13225932),('n02124075', 'Egyptian_cat', 0.098001406),('n02123394', 'Persian_cat', 0.009920092),('n02883205', 'bow_tie', 0.0063082646)]]

可以看到,模型预测出来的结果中,具有最大概率的是'tabby'(斑猫)。

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

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

相关文章

2024年,如何使用chatgpt4.0为工作赋能?

ChatGPT 4.0的工作原理和功能 ChatGPT 4.0的工作原理和功能可以从以下几个方面进行详细说明: 工作原理 ChatGPT 4.0的工作原理主要基于深度学习技术,特别是Transformer模型的应用。它通过大量的文本数据进行训练,学习语言的模式和规律&…

Unity类银河恶魔城学习记录9-7 p88 Crystal instead of Clone源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Blackhole_Skill_Controller.cs using System.Collections; using System…

基与HTML5的塔防游戏设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 项目背景与相关技术 3 1.1 背景与发展简介 3 1.2 HTML5技术及其优势 4 1.3 JavaScript开发的优势与劣势 4 1.4 CSS样式表在开发中的用处 5 1.5 本章小结 6 2 系统分析 7 2.1 需求分析 7 2.2 问题分析 7 2.3 流程设计 7 2.3 功能分析 8 2.…

Vue3实现页面跳转功能

目标: 首页: 点击About后: 第一步:安装 Vue Router和创建你先 npm install vue-router4第二步:在router.js中设置路由 import { createRouter, createWebHistory } from vue-router; import Home from ./views/Home…

C#/.NET/.NET Core拾遗补漏合集(持续更新)

前言 在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。 GitHub开源地…

基于ACM32 MCU的两轮车充电桩方案介绍,有利于打造高效安全的电池管理

随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及,越来越多的人选择了电动车作为代步工具,而两轮电动车的出行半径较短,需要频繁充电,因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决两轮车…

伦敦银价实时行情趋势的4种技术

在伦敦银实时行情趋势的判断中,很多人认为找到趋势就好了,其实并不是这样。找到趋势只是我们踏出的first step,实际上找到趋势后还有更多的东西我们需要做,下面我们就要介绍一下找到伦敦银价实时行情趋势后的4种技术。 判断趋势的…

华为数通方向HCIP-DataCom H12-821题库(多选题:121-140)

第121题 以下哪些事件会导致IS-IS产生一个新的LSP? A、引入的IP路由发送变化 B、周期性更新 C、接口开销发生了变化 D、邻接Up或Down 【参考答案】ABCD 【答案解析】 第122题 以下哪些协议既支持网络配置管理又支持网络监控管理? A、Telemetry B、NETCONF C、SNMP D、LLDP …

vscode设置setting.json

{ // vscode默认启用了根据文件类型自动设置tabsize的选项 "editor.detectIndentation": false, // 重新设定tabsize "editor.tabSize": 2, // #每次保存的时候自动格式化 // "editor.formatOnSave": true, // #每次保存的时候将代码按eslint格式…

QX320F280049C,国产DSP,替代TI 的C2000系列

独立双核,32位CPU 主频150MHz flash 1MB , SRAM 1MB 单精度浮点运算FPU 三角函数运算TMU 24个增强型外设ePWM 16个高分辨率HRPWM(150PS) 3个12位ADC,采样率3MSPS

基于ABC法下的CCG公司+物流成本核算研究

基于ABC法下的CCG公司物流成本核算研究 摘要:许多生产型企业随着公司规模不断壮大,物流服务也越来越趋于多样化,但是其物流成本的核算并不规范,且多数使用传统的成本核算方法,这显然已经跟不上公司的快速发展。本文通…

网络套接字1

网络套接字1 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容讲解了udp的Linux环境下的使用&#xff0c…