AlexNet 实现猫狗分类
前言
在训练网络过程中遇到了很多问题,先在这里抱怨一下,没有硬件条件去使用庞大的ImageNet2012 数据集 。所以在选择合适的数据集上走了些弯路,最后选择有kaggle提供的猫狗数据集,因为二分类问题可能训练起来比较容易一些。实验结果和代码我放在kaggle上了,有时会加载不出来。ipynb文件百度云里面也有 下载完成后用jupyter打开。下面附上链接
内容 | 地址 |
---|---|
数据集 | 链接 |
kaggle实验过程 | 链接 |
百度云ipynb文件 | 链接 提取码:di7c |
好,我们开始介绍吧!
AlexNet简介
首先呢,AlexNet是2012年,由Alex Krizhevsky、 llya Sutskever 和 Geoffrey E. Hinton 提出来的一种卷积神经网络模型,并获得了2012年ILSVRC图像分类大赛的冠军,自此呢也掀起了深度学习的热潮。神经网络通常都是直接上图比较直观。
看上去好像 很复杂的样子,其实由于当时硬件条件限制,所以将图片分成了两个部分,分别用两块GPU进行训练,分别放置了一半的卷积核。相比上一篇提到的LeNet, 它有很多优点。如下表所示:
技巧 | AlexNet | LeNet |
---|---|---|
Relu,多GPU | 训练速度块 | 训练速度慢 |
局部响应归一化 | 提高了精度,缓解过拟合 | 无 |
数据扩充,丢失输出 | 减少过拟合 | 无 |
这里有争议的就是局部响应归一化(Local Response Normalization,简称LRN),在它之后有论文证明局部响应归一化并没有太大作用,我第一次实验也用的局部响应归一化但效果并不好,后面采用的是批标准化(BatchNormalization, 简称BN)。
网络结构
网络节后从图中可以详细看出,这里就不再进行赘述,我们可以看看keras搭建好的AlexNet网络结构:
Model: "AlexNet"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_3 (InputLayer) [(None, 224, 224, 3)] 0
_________________________________________________________________
zero_padding2d_2 (ZeroPaddin (None, 227, 227, 3) 0
_________________________________________________________________
conv_block_1 (Conv2D) (None, 55, 55, 96) 34944
_________________________________________________________________
max_pooling_1 (MaxPooling2D) (None, 27, 27, 96) 0
_________________________________________________________________
batch_normalization_12 (Batc (None, 27, 27, 96) 384
_________________________________________________________________
conv_block_2 (Conv2D) (None, 27, 27, 256) 614656
_________________________________________________________________
max_pooling_2 (MaxPooling2D) (None, 13, 13, 256) 0
_________________________________________________________________
batch_normalization_13 (Batc (None, 13, 13, 256) 1024
_________________________________________________________________
conv_block_3 (Conv2D) (None, 13, 13, 384) 885120
_________________________________________________________________
max_pooling_3 (MaxPooling2D) (None, 6, 6, 384) 0
_________________________________________________________________
batch_normalization_14 (Batc (None, 6, 6, 384) 1536
_________________________________________________________________
conv_block_4 (Conv2D) (None, 6, 6, 384) 1327488
_________________________________________________________________
conv_block_5 (Conv2D) (None, 6, 6, 256) 884992
_________________________________________________________________
max_pooling_5 (MaxPooling2D) (None, 2, 2, 256) 0
_________________________________________________________________
batch_normalization_15 (Batc (None, 2, 2, 256) 1024
_________________________________________________________________
flatten (Flatten) (None, 1024) 0
_________________________________________________________________
fc_1 (Dense) (None, 4096) 4198400
_________________________________________________________________
dropout_1 (Dropout) (None, 4096) 0
_________________________________________________________________
batch_normalization_16 (Batc (None, 4096) 16384
_________________________________________________________________
fc_2 (Dense) (None, 4096) 16781312
_________________________________________________________________
dropout_2 (Dropout) (None, 4096) 0
_________________________________________________________________
batch_normalization_17 (Batc (None, 4096) 16384
_________________________________________________________________
dense_2 (Dense) (None, 1000) 4097000
=================================================================
Total params: 28,860,648
Trainable params: 28,842,280
Non-trainable params: 18,368
可以清楚的看到每一层网络的输入输出及节点数。我们不用ImageNet2012作为训练数据,这里直接用一块GPU训练就好。
注意事项
由于输入是224x224x3(HWC)大小的图片,但实际运算时使用的是227x227x3(HWC)大小的图片。所以又要进行填0操作:
x = ZeroPadding2D(((3, 0), (3, 0)))(img_input)
下面请看详细代码:
- 构建网络模型:
#定义网络结构
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, Flatten, Lambda, MaxPooling2D, Dropout, Input, Dense,ZeroPadding2D,BatchNormalization
from tensorflow.python.keras import backend
from tensorflow.python.keras.engine import training
from tensorflow.python.keras.utils import layer_utils
from tensorflow.keras import optimizers, losses