项目全部代码在文章末尾
1、任务描述
Cats vs. Dogs(猫狗大战)数据集下载地址为https://www.kaggle.com/c/dogs-vs-cats/data。这个数据集是Kaggle大数据竞赛某一年的一道赛题,利用给定的数据集,用算法实现猫和狗的识别。 其中包含了训练集和测试集,训练集中猫和狗的图片数量都是12500张且按顺序排序,测试集中猫和狗混合乱序图片一共12500张。
卷积神经网络(CNN)是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。卷积神经网络具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络”。不使用深度学习框架,用numpy基础代码来构建自己的深度学习网络。
2、数据预处理
为了加速训练算法的收敛速度,一般都会采用一些数据预处理技术。卷积神经网络的输入特征需要进行标准化处理。在将学习数据输入卷积神经网络前,需在通道或时间/频率维对输入数据进行归一化,若输入数据为像素,也可将分布于0-1的原始像素值归一化至0-255区间。输入特征的标准化有利于提升卷积神经网络的学习效率和表现。
首先将图片转化成为了RGB格式,RGB就是我们对颜色的一种标准化,白色在电脑上的组成就是255.255.255,相对的黑色就是0.0.0这是在电脑上颜色数值代码。然后将图片调整为28*28大小,resize是opencv库中的一个函数,主要起到对图片进行缩放的作用。以下代码就是将原图片转化为宽和长分别为28,28的图片。
image= image_list[i]
image = cv2.imread(image)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.resize(image, (28, 28))
这里是将一组图像矩阵image重建为新的矩阵,reshape()是数组array中的方法,作用是将数据重新组织。我们不知道image的shape到底是什么,第一个参数未知,但是后面的形状参数知道,即[28,28]故把第一个参数设为-1,然后第一个可以根据真实的形状自适应得出当前情况下第一个参数的值。
image=image.reshape(-1,28,28)
3、网络结构
网络结构如下所示
conv - relu - conv- relu - pool -
conv - relu - conv- relu - pool -
conv - relu - conv- relu - pool -
affine - relu - dropout - affine - dropout - softmax
conv层是卷积层,是网络结构的关键。卷积层的功能是对输入数据进行特征提取,其内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量,类似于一个前馈神经网络的神经元。卷积层演示过程
relu是隐藏层的激活函数,功能是把卷积层输出结果做非线性映射。CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱,图像如下
pool是池化层,在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤。池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量。池化层选取池化区域与卷积核扫描特征图步骤相同,由池化大小、步长和填充控制。
affine是全连接层,卷积神经网络中的全连接层等价于传统前馈神经网络中的隐含层。全连接层位于卷积神经网络隐含层的最后部分,并只向其它全连接层传递信号。特征图在全连接层中会失去空间拓扑结构,被展开为向量并通过激励函数。
dropout层用于减少过拟合。dropout是指深度学习训练过程中,对于神经网络训练单元,按照一定的概率将其从网络中移除,注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。过拟合是深度神经网(DNN)中的一个常见问题:模型只学会在训练集上分类,这些年提出的许多过拟合问题的解决方案,其中dropout具有简单性而且效果也非常良好。
softmax函数,又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。
4、实验结果和分析
参数的训练花费了2个小时,处理了两万张图片。测试集精度在第十次迭代达到高峰,随后略微下降,考虑到应该是过拟合问题,所以把迭代次数改为了12次。
超参数的取值 | filter_size:3 | pad:1 | stride:1 |
第一次训练精度 | 开始:50% | 结束:92% | 迭代次数:20 |
第一次测试精度 | 开始:50% | 结束:78% | 迭代次数:20 |
第二次训练精度 | 开始:50% | 结束:80% | 迭代次数:12 |
第二次测试精度 | 开始:50% | 结束:78% | 迭代次数:12 |
代码:
链接:https://pan.baidu.com/s/1Kz4adoDhJ0DYuqgybmq_RQ
提取码:cdmg