0
点赞
收藏
分享

微信扫一扫

TensorFlow2学习十三、实现AlexNet

进击的铁雾 2022-06-28 阅读 33

一、简介

以下内容整理来自百度百科
AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,更多的更深的神经网络被提出,比如优秀的vgg,GoogLeNet。 这对于传统的机器学习分类算法而言,已经相当的出色。
网络模型:
TensorFlow2学习十三、实现AlexNet_ide

AlexNet中包含了几个比较新的技术点,也首次在CNN中成功应用了ReLU、Dropout和LRN等Trick。同时AlexNet也使用了GPU进行运算加速。
AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。AlexNet主要使用到的新技术点如下:
(1)成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。
(2)训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout。
(3)在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
(4)提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
(5)使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。 
(6)数据增强,随机地从256256的原始图像中截取224224大小的区域(以及水平翻转的镜像),相当于增加了2*(256-224)^2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet论文中提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。

全流程:
TensorFlow2学习十三、实现AlexNet_池化_02

二、tf2.0实现MNIST

代码运行环境: google colab

AlexNet原始输入图像尺寸为227x227x3大小的1000分类,而Fasion MNIST图像尺寸为28x28x1的10分类,输入尺寸太小不足以完成网络的下采样过程,故需要对网络进行简单的修改:

  1. 卷积层1:卷积核步长设为:2
  2. 输出层:输出向量长度设为:10(分类数量)

代码

try:
# %tensorflow_version only exists in Colab.
%tensorflow_version 2.x
except Exception:
pass

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
import matplotlib.pyplot as plt
def AlexNet_inference(in_shape):
model = keras.Sequential(name='AlexNet')

# model.add(layers.Conv2D(96,(11,11),strides=(4,4),input_shape=(in_shape[1],in_shape[2],in_shape[3]),
# padding='same',activation='relu',kernel_initializer='uniform'))

model.add(layers.Conv2D(96,(11,11),strides=(2,2),input_shape=(in_shape[1],in_shape[2],in_shape[3]),
padding='same',activation='relu',kernel_initializer='uniform'))
model.add(layers.MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(layers.Conv2D(256,(5,5),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(layers.MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(layers.Conv2D(384,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(layers.Conv2D(384,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(layers.Conv2D(256,(3,3),strides=(1,1),padding='same',activation='relu',kernel_initializer='uniform'))
model.add(layers.MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(layers.Flatten())
model.add(layers.Dense(2048,activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(2048,activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10,activation='softmax'))
model.compile(optimizer=keras.optimizers.Adam(),
loss='sparse_categorical_crossentropy', #不能直接用函数,否则在与测试加载模型不成功!
metrics=['accuracy'])
model.summary()
return model


mnist = tf.keras.datasets.mnist
MODEL_DIR = "models/"

(x_train, y_train), (x_test, y_test) = mnist.load_data()
# train_images, test_images = train_images / 255.0, test_images / 255.0

x_train = x_train.reshape((-1,28,28,1))
x_test = x_test.reshape((-1,28,28,1))
print(x_train.shape[1], x_train.shape[2], x_train.shape[3])
x_shape = x_train.shape

AlexNet_model = AlexNet_inference(x_shape)
totall_epochs = 0
epochs = 10

while(True):
history = AlexNet_model.fit(x_train, y_train, batch_size=64, epochs=epochs, validation_split=0.1)

plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.legend(['training', 'valivation'], loc='upper left')
plt.show()

res = AlexNet_model.evaluate(x_test, y_test)
print(res)

totall_epochs += epochs
model_save_dir = MODEL_DIR+'AlexNet_model_'+str(totall_epochs)+'.h5'
AlexNet_model.save( model_save_dir )

keyVal = input('please enter your command!(0:quite, 1>:continue!)')
keyVal = int(keyVal)
if 0==keyVal:
break
elif 0<=keyVal and 10>=keyVal:
epochs = keyVal

TensorFlow2学习十三、实现AlexNet_池化_03

本文内容博主 xping_zhou 的博文,稍加了一点修改


举报

相关推荐

0 条评论