文章目录
一、卷积神经网络(CNN)
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。
顾名思义,就是将卷积与前馈神经网络结合,所衍生出来的一种深度学习算法
1.1 卷积
简单定义:设f ( x ) , g ( x ) f(x),g(x)f(x),g(x)是R 1 R1R1上的两个可积函数,作积分:
称为函数f ff与g gg的卷积,记为:f ( x ) ∗ g ( x ) = h ( x ) f(x)*g(x)=h(x) f(x)∗g(x) = h(x)
卷积与傅里叶变换有着密切的关系:两函数的傅里叶变换的乘积 = 它们卷积后的傅里叶变换(能简化傅里叶分析)
h ( x ) h(x)h(x)要比f ( x ) f(x)f(x)、g ( x ) g(x)g(x)更光滑:特别当g ( x ) g(x)g(x)为具有紧致集的光滑函数,f ( x ) f(x)f(x)为局部可积时,它们的卷积h ( x ) h(x)h(x)也是光滑函数;利用这一性质,对于任意的可积函数f ( x ) f(x)f(x),都可以简单地构造出一列逼近于f ( x ) f(x)f(x)的光滑函数列f s fsfs,这种方法称为函数的光滑化或正则化。
卷积的概念还可以推广到数列、测度以及广义函数上去。
1.2 前馈神经网络
1、前馈神经网络是一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层间没有反馈。
2、其中每一层包含若干个神经元,各神经元可以接收前一层神经元的信号,并产生输出到下一层。第0层叫输入层,最后一层叫输出层,其他中间层叫做隐含层(或隐藏层、隐层),隐层可以是一层。也可以是多层。
3、一个典型的多层前馈神经网络如下图所示:
1.3 卷积神经网络(CNN)
卷积神经网络是在前馈神经网络的隐藏层做的改变,它的隐藏层包括卷积层、池化层、全连接层三部分:
输入层:
1、卷积神经网络的输入层可以处理多维数据:
n维卷积神经网络 | 处理数据类型 |
---|---|
一维卷积神经网络 | 一维或二维数组 |
二维卷积神经网络 | 二维或三维数组 |
三维卷积神经网络 | 四维数组 |
2、由于卷积神经网络在计算机视觉领域应用较广,因此许多研究在介绍其结构时预先假设了三维输入数据,即平面上的二维像素点和 RGB 通道。
隐藏层:
卷积层(包含有卷积核、卷积层参数、激励函数):使用卷积核进行特征提取和特征映射。
名称 | 作用 |
---|---|
卷积核 | 类似于一个前馈神经网络的神经元,组成卷积核的每个元素都对应一个权重系数核一个偏差量,含义可类比视觉皮肤细胞的感受野 |
卷积层参数 | 包括卷积核大小、步长、填充,三者共同决定了卷积层输出特征图的尺寸,是卷积神经网络的超参数 |
激励函数 | 协助表达复杂的特征,类似于其它深度学习算法 |
池化层:
1、在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤。
2、池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量。
3、池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量。
最大池化——>它只是输出在区域中观察到的最大输入值。
均值池化——>它只是输出在区域中观察到的平均输入值。
两者最大区别在于卷积核的不同(池化是一种特殊的卷积过程)。
全连接层:
卷积神经网络中的全连接层等价于传统前馈神经网络中的隐含层(每个神经元与上一层的所有神经元相连)。
1、全连接层位于卷积神经网络隐含层的最后部分,并只向其它全连接层传递信号。
2、特征图在全连接层中会失去空间拓扑结构,被展开为向量并通过激励函数。
3、全连接层的作用则是对提取的特征进行非线性组合以得到输出,即全连接层本身不被期望具有特征提取能力,而是试图利用现有的高阶特征完成学习目标。
输出层:
1、卷积神经网络中输出层的上游通常是全连接层,因此其结构和工作原理与传统前馈神经网络中的输出层相同。
2、对于图像分类问题,输出层使用逻辑函数或归一化指数函数(softmax function)输出分类标签。
3、在物体识别(object detection)问题中,输出层可设计为输出物体的中心坐标、大小和分类。
4、在图像语义分割中,输出层直接输出每个像素的分类结果。
应用领域:
1、计算机视觉:图像识别、物体识别、行为认知、姿态估计、神经风格迁移。
2、自然语言处理
3、其他:物理学、遥感科学、大气科学
二、配置环境
安装好Anaconda
打开 cmd 命令终端,创建虚拟环境。
conda create -n tf1 python=3.6
如下图所示:
激活环境:
activate
conda activate tf1
安装 tensorflow、keras 库。
在新建的虚拟环境 tf1 内,使用以下命令安装两个库:
pip install tensorflow==1.14.0 -i “https://pypi.doubanio.com/simple/”
pip install keras==2.2.5 -i “https://pypi.doubanio.com/simple/”
安装 nb_conda_kernels 包。
conda install nb_conda_kernels
安装完后如下图所示:
重新打开 Jupyter Notebook(tf1)环境下的。
点击【New】→【Python[tf1环境下的]】创建 python 文件。
三、猫狗数据分类建模
3.1 猫狗图像预处理
对猫狗图像进行分类,代码如下:
import os, shutil
# 原始目录所在的路径
original_dataset_dir = 'E:\\Cat_And_Dog\\train\\'
# 数据集分类后的目录
base_dir = 'E:\\Cat_And_Dog\\train1'
os.mkdir(base_dir)
# # 训练、验证、测试数据集的目录
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir, 'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)
# 猫训练图片所在目录
train_cats_dir = os.path.join(train_dir, 'cats')
os.mkdir(train_cats_dir)
# 狗训练图片所在目录
train_dogs_dir = os.path.join(train_dir, 'dogs')
os.mkdir(train_dogs_dir)
# 猫验证图片所在目录
validation_cats_dir = os.path.join(validation_dir, 'cats')
os.mkdir(validation_cats_dir)
# 狗验证数据集所在目录
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
os.mkdir(validation_dogs_dir)
# 猫测试数据集所在目录
test_cats_dir = os.path.join(test_dir, 'cats')
os.mkdir(test_cats_dir)
# 狗测试数据集所在目录
test_dogs