TensorFlow2学习十三、实现AlexNet

TensorFlow2学习⼗三、实现AlexNet
⼀、简介
以下内容整理来⾃百度百科
AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学⽣Alex Krizhevsky设计的。也是在那年之后,更多的更深的神经⽹络被提出,⽐如优秀的vgg,GoogLeNet。 这对于传统的机器学习分类算法⽽⾔,已经相当的出⾊。
⽹络模型:
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%。
全流程:
巴尔扎克和他的老师
⼆、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'))
modelpile(optimizer=keras.optimizers.Adam(),
loss='sparse_categorical_crossentropy', #不能直接⽤函数,否则在与测试加载模型不成功!
metrics=['accuracy'])
model.summary()
return model
mnist = tf.ist
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 = shape((-1,28,28,1))
x_test = shape((-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
本⽂内容来源CDSN博主 xping_zhou 的博⽂,稍加了⼀点修改

本文发布于:2024-09-21 23:20:54,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/115013.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:输出   池化   卷积   数据   增加   显存   需要
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议