目录
卷积神经网络学习——AlexNet网络(tensorflow2.0)
1、介绍
2、采用Relu作为激活函数
3、使用Dropout防止过拟合
4、使用数据增强技术
5、层叠池化
6、局部相应归一化
7、模型搭建
AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,更多的更深的神经网络被提出,比如优秀的vgg,GoogLeNet。 这对于传统的机器学习分类算法而言,已经相当的出色。
AlexNet中包含了几个比较新的技术点,也首次在CNN中成功应用了ReLU、Dropout和LRN等Trick。同时AlexNet也使用了GPU进行运算加速。AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。
成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。
训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout。
Dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,如图1所示。
数据增强,随机地从256*256的原始图像中截取224*224大小的区域(以及水平翻转和色度调整的镜像),相当于增加2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet论文中提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。
在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
池化(Pooling)也成下采样或欠采样,是特征降维的一种方法,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。
下图中分别为最大池化(Max Pooling)和平均池化(Average Pooling)的直观表示。
提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
导入库和模型搭建
import tensorflow as tf
from tensorflow import keras
class c2(tf.keras.layers.Layer):
def __init__(self):
super().__init__()
def build(self,input_shape):
self.w=tf.random.normal([5,5,input_shape[-1],256])
def call(self,inputs):
return tf.nn.conv2d(inputs,
filters=self.w,
strides=1,
padding=[[0, 0],[3, 3],
[3, 3],[0, 0]])
x=tf.random.normal([1,277,277,3])
alexnet=keras.Sequential([
keras.layers.Conv2D(96,11,5),
keras.layers.ReLU(),
keras.layers.MaxPooling2D((3,3),2),
keras.layers.BatchNormalization(),
c2(),
keras.layers.ReLU(),
keras.layers.MaxPooling2D((3,3),2),
keras.layers.BatchNormalization(),
keras.layers.Conv2D(384,3,1,padding='same'),
keras.layers.ReLU(),
keras.layers.Conv2D(384,3,1,padding='same'),
keras.layers.ReLU(),
keras.layers.Conv2D(256,3,1,padding='same'),
keras.layers.ReLU(),
keras.layers.MaxPooling2D((3,3),2),
keras.layers.Flatten(),
keras.layers.Dense(4096),
keras.layers.ReLU(),
keras.layers.Dropout(0.25),
keras.layers.Dense(4096),
keras.layers.ReLU(),
keras.layers.Dropout(0.25),
keras.layers.Dense(1000),
keras.layers.Softmax(),
])
alexnet.build(input_shape=[None,277,277,3])
alexnet.summary()
Model: "sequential_68"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_95 (Conv2D) multiple 34944
_________________________________________________________________
re_lu_169 (ReLU) multiple 0
_________________________________________________________________
max_pooling2d_148 (MaxPoolin multiple 0
_________________________________________________________________
batch_normalization_139 (Bat multiple 384
_________________________________________________________________
c2_66 (c2) multiple 0
_________________________________________________________________
re_lu_170 (ReLU) multiple 0
_________________________________________________________________
max_pooling2d_149 (MaxPoolin multiple 0
_________________________________________________________________
batch_normalization_140 (Bat multiple 1024
_________________________________________________________________
conv2d_96 (Conv2D) multiple 885120
_________________________________________________________________
re_lu_171 (ReLU) multiple 0
_________________________________________________________________
conv2d_97 (Conv2D) multiple 1327488
_________________________________________________________________
re_lu_172 (ReLU) multiple 0
_________________________________________________________________
conv2d_98 (Conv2D) multiple 884992
_________________________________________________________________
re_lu_173 (ReLU) multiple 0
_________________________________________________________________
max_pooling2d_150 (MaxPoolin multiple 0
_________________________________________________________________
flatten_4 (Flatten) multiple 0
_________________________________________________________________
dense_12 (Dense) multiple 37752832
_________________________________________________________________
re_lu_174 (ReLU) multiple 0
_________________________________________________________________
dropout_8 (Dropout) multiple 0
_________________________________________________________________
dense_13 (Dense) multiple 16781312
_________________________________________________________________
re_lu_175 (ReLU) multiple 0
_________________________________________________________________
dropout_9 (Dropout) multiple 0
_________________________________________________________________
dense_14 (Dense) multiple 4097000
_________________________________________________________________
softmax_4 (Softmax) multiple 0
=================================================================
Total params: 61,765,096
Trainable params: 61,764,392
Non-trainable params: 704
_________________________________________________________________
#模型编译
alexnet.compile(loss="sparse_categorical_crossentropy",
optimizer="sgd",
metrics = ["accuracy"])