勿满足于眼前的小小成就。你要问自己,我这辈子只有这样吗。
AlexNet模式是在2012年提出来的,并且在当年获得了ILSVRC的冠军,top-5的错误率为16.4%,比第二名的成绩26.2%高出许多,也从此开始确立了深度学习在计算机视觉的统治地位,是一块重要的里程碑。
该模型包含了几个比较新的技术点:
- 成功使用ReLu作为CNN的激活函数,验证了其效果在较深网络中比Sigmoid更好
- 成功应用Dropout,验证了其在实际中的效果
- 在CNN中使用重叠的最大池化,打破了之前普遍使用平均池化的模式,AlexNet全部使用最大池化,避免平均池化的模糊化效果,并提出了让步长比池化核尺寸小一些可以提升特征的丰富性
- 提出了LRN层,对局部神经元的活动创建竞争机制,使其中响应大的更大,小的更小,增强了模型的泛化能力
- 使用CUDA加速深度卷积网络的训练
- 使用了数据增强,使用了PCA
接下来将会使用TensorFlow搭建AlexNet,使用的数据为随机图片数据,如果你有兴趣可以自行下载ImageNet的数据进行训练兵测试
首先导入常用库并定义batch_size,num_batches
from datetime import datetime
import math
import time
import tensorflow as tf
batch_size = 32
num_batches = 100
定义一个用于展示网络层结构的函数
def print_activations(t):
print(t.op.name, ' ', t.get_shape().as_list())
定义一个函数inference,接受images为参数,返回第五个池化层和所有需要训练的模型参数
首先定义第一个卷积层,使用tf.truncated_normal截断的正太分布函数初始化卷积核的参数kernel,卷积核的尺寸为11X11,颜色通道为3,卷积核的数量为64。使用tf.nn.conv2d对输入的images进行卷积操作,将strides步长设置为4X4,padding模式设置为SAME,将卷积核的biases全部初始化为0,再使用tf.nn.bias_ass将conv和biases加起来,并使用激活函数tf.nn.relu对结果进行非线性处理,最后使用开始定义的print_activations将结构打印出来,将可训练的参数添加到parameters中。
def inference(images):
parameters =