一、简介

AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,更多的更深的神经网路被提出,比如优秀的vgg,GoogleLeNet。其官方提供的数据模型,准确率达到57.1%,top 1-5 达到80.2%. 这项对于传统的机器学习分类算法而言,已经相当的出色。

二、网络结构

上图所示是caffe中alexnet的网络结构,上图采用是两台GPU服务器,所有会看到两个流程图。下边把AlexNet的网络结构示意一下:

简化的结构为:

AlexNet为啥取得比较好的结果呢?

1. 使用了Relu激活函数。

Relu函数:f(x)=max(0,x)

基于ReLU的深度卷积网络比基于tanhsigmoid的网络训练快数倍,下图是一个基于CIFAR-10的四层卷积网络在tanh和ReLU达到25%的training error的迭代次数;

2. 标准化(Local Response Normalization)

使用ReLU f(x)=max(0,x)后,你会发现激活函数之后的值没有了tanh、sigmoid函数那样有一个值域区间,所以一般在ReLU之后会做一个normalization,LRU就是稳重提出(这里不确定,应该是提出?)一种方法,在神经科学中有个概念叫“Lateral inhibition”,讲的是活跃的神经元对它周边神经元的影响。

3. Dropout

Dropout也是经常说的一个概念,能够比较有效地防止神经网络的过拟合。 相对于一般如线性模型使用正则的方法来防止模型过拟合,而在神经网络中Dropout通过修改神经网络本身结构来实现。对于某一层神经元,通过定义的概率来随机删除一些神经元,同时保持输入层与输出层神经元的个人不变,然后按照神经网络的学习方法进行参数更新,下一次迭代中,重新随机删除一些神经元,直至训练结束。

4. 数据增强(data augmentation)

在深度学习中,当数据量不够大时候,一般有4解决方法

  • data augmentation——人工增加训练集的大小——通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据
  • Regularization——数据量比较小会导致模型过拟合, 使得训练误差很小而测试误差特别大. 通过在Loss Function 后面加上正则项可以抑制过拟合的产生. 缺点是引入了一个需要手动调整的hyper-parameter。
  • Dropout——也是一种正则化手段. 不过跟以上不同的是它通过随机将部分神经元的输出置零来实现
  • Unsupervised Pre-training——用Auto-Encoder或者RBM的卷积形式一层一层地做无监督预训练, 最后加上分类层做有监督的Fine-Tuning

三、tensorflow代码实现

# -*- coding=UTF-8 -*-
import sys
import os
import random
import cv2
import math
import time
import numpy as np
import tensorflow as tf
import linecache
import string
import skimage
import imageio
# 输入数据
import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
# 定义网络超参数
learning_rate = 0.001
training_iters = 200000
batch_size = 64
display_step = 20
# 定义网络参数
n_input = 784  # 输入的维度
n_classes = 10 # 标签的维度
dropout = 0.8  # Dropout 的概率
# 占位符输入
x = tf.placeholder(tf.types.float32, [None, n_input])
y = tf.placeholder(tf.types.float32, [None, n_classes])
keep_prob = tf.placeholder(tf.types.float32)
# 卷积操作
def conv2d(name, l_input, w, b):return tf.nn.relu(tf.nn.bias_add( \tf.nn.conv2d(l_input, w, strides=[1, 1, 1, 1], padding='SAME'),b) \, name=name)
# 最大下采样操作
def max_pool(name, l_input, k):return tf.nn.max_pool(l_input, ksize=[1, k, k, 1], \strides=[1, k, k, 1], padding='SAME', name=name)
# 归一化操作
def norm(name, l_input, lsize=4):return tf.nn.lrn(l_input, lsize, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name=name)
# 定义整个网络
def alex_net(_X, _weights, _biases, _dropout):_X = tf.reshape(_X, shape=[-1, 28, 28, 1]) # 向量转为矩阵# 卷积层conv1 = conv2d('conv1', _X, _weights['wc1'], _biases['bc1'])# 下采样层pool1 = max_pool('pool1', conv1, k=2)# 归一化层norm1 = norm('norm1', pool1, lsize=4)# Dropoutnorm1 = tf.nn.dropout(norm1, _dropout)# 卷积conv2 = conv2d('conv2', norm1, _weights['wc2'], _biases['bc2'])# 下采样pool2 = max_pool('pool2', conv2, k=2)# 归一化norm2 = norm('norm2', pool2, lsize=4)# Dropoutnorm2 = tf.nn.dropout(norm2, _dropout)# 卷积conv3 = conv2d('conv3', norm2, _weights['wc3'], _biases['bc3'])# 下采样pool3 = max_pool('pool3', conv3, k=2)# 归一化norm3 = norm('norm3', pool3, lsize=4)# Dropoutnorm3 = tf.nn.dropout(norm3, _dropout)# 全连接层,先把特征图转为向量dense1 = tf.reshape(norm3, [-1, _weights['wd1'].get_shape().as_list()[0]]) dense1 = tf.nn.relu(tf.matmul(dense1, _weights['wd1']) + _biases['bd1'], name='fc1') # 全连接层dense2 = tf.nn.relu(tf.matmul(dense1, _weights['wd2']) + _biases['bd2'], name='fc2') # Relu activation# 网络输出层out = tf.matmul(dense2, _weights['out']) + _biases['out']return out# 存储所有的网络参数
weights = {'wc1': tf.Variable(tf.random_normal([3, 3, 1, 64])),'wc2': tf.Variable(tf.random_normal([3, 3, 64, 128])),'wc3': tf.Variable(tf.random_normal([3, 3, 128, 256])),'wd1': tf.Variable(tf.random_normal([4*4*256, 1024])),'wd2': tf.Variable(tf.random_normal([1024, 1024])),'out': tf.Variable(tf.random_normal([1024, 10]))
}
biases = {'bc1': tf.Variable(tf.random_normal([64])),'bc2': tf.Variable(tf.random_normal([128])),'bc3': tf.Variable(tf.random_normal([256])),'bd1': tf.Variable(tf.random_normal([1024])),'bd2': tf.Variable(tf.random_normal([1024])),'out': tf.Variable(tf.random_normal([n_classes]))
}
# 构建模型
pred = alex_net(x, weights, biases, keep_prob)
# 定义损失函数和学习步骤
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
# 测试网络
correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
# 初始化所有的共享变量
init = tf.initialize_all_variables()
# 开启一个训练
with tf.Session() as sess:sess.run(init)step = 1# Keep training until reach max iterationswhile step * batch_size < training_iters:batch_xs, batch_ys = mnist.train.next_batch(batch_size)# 获取批数据sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys, keep_prob: dropout})if step % display_step == 0:# 计算精度acc = sess.run(accuracy, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})# 计算损失值loss = sess.run(cost, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})print "Iter " + str(step*batch_size) + ", Minibatch Loss= " + "{:.6f}".format(loss) + ", Training Accuracy= " + "{:.5f}".format(acc)step += 1print "Optimization Finished!"# 计算测试精度print "Testing Accuracy:", sess.run(accuracy, feed_dict={x: mnist.test.images[:256], y: m

深度学习之经典网络架构AlexNet(二)相关推荐

  1. 详解深度学习之经典网络架构(十):九大框架汇总

    目录 0.概览 1.个人心得 2.总结 本文是对本人前面讲的的一些经典框架的汇总. 纯手打,如果有不足之处,可以在评论区里留言. 0.概览 (1)详解深度学习之经典网络架构(一):LeNet (2)详 ...

  2. 详解深度学习之经典网络:AlexNet(2012) 并利用该网络架构实现人脸识别

    @[TOC](详解深度学习之经典网络:AlexNet(2012) 并利用该网络架构实现人脸识别**) 近来闲来无事,翻出了搁置已久的轻薄版电脑,望着积满灰尘的显示屏,觉得有愧于老师的尊尊教导,心中叹息 ...

  3. 新论文推荐:Auto-Keras:自动搜索深度学习模型的网络架构和超参数

    Auto-Keras 是一个开源的自动机器学习库,由美国德州农工大学(Texas A&M University)助理教授胡侠和他的两名博士生:金海峰.Qingquan Song提出.Auto- ...

  4. 深度学习中经典网络结构图和代码

    Inception网络与其它网络的性能对比 PyTorch-Networks: 包含了分类.检测以及姿态估计等网络的pytorch代码 caffe-model-zoo: AlexNet.VGGNet. ...

  5. vgg16卷积层的计算量_深度学习_经典网络_VGG16和ResNet152哪个参数量更多

    首先,我们我们知道深度学习中网络的计算量代表时间复杂度,参数量代表空间复杂度. 从ResNet的论文中可知(ResNet论文可在这个文章中的第六部分找到)152层的残差网络在时间复杂度上和VGG16是 ...

  6. 10.深度学习之经典网络-1

    10.1 卷积神经网络(LeNet) 一个早期用来识别手写数字图像的卷积神经网络:LeNet . LeNet-5展示了通过梯度下降训练卷积神经网络可以达到手写数字识别在当时最先进的结果. 10.1.1 ...

  7. 都2021年了,不会还有人连深度学习都不了解吧(二)- 卷积篇

    一.前言 上篇文章详细阐述了激活函数是什么.常用的激活函数有哪些以及为什么要使用激活函数,相信大家对此有了一定的了解.在此基础上,我们趁热打铁,继续学习深度学习其它必须的知识.该篇文章讲述卷积操作及其 ...

  8. 【深度学习】图网络——悄然兴起的深度学习新浪潮

    [深度学习]图网络--悄然兴起的深度学习新浪潮 https://mp.weixin.qq.com/s/mOZDN9u7YCdtYs6DbUml0Q 现实世界中的大量问题都可以抽象成图模型(Graph ...

  9. 深度学习几种典型架构

    深度学习几种典型架构 http://blog.sina.com.cn/s/blog_cfa68e330102zfaf.html 介绍几种典型的深度学习架构. 卷积神经网络(CNN) 卷积神经网络由Le ...

最新文章

  1. java字节流6_JavaIO流之字节流
  2. 不懂股权架构的创业,都是耍流氓!
  3. html制作虚拟人物,一种虚拟人物角色直播系统的制作方法
  4. 河南工程学院计算机科学与技术在哪个校区,河南工学院新生在哪个校区_有几个校区及地址介绍...
  5. 中文分词中的战斗机-jieba库
  6. spark2.1:rdd.combineByKeyWithClassTag的用法示例
  7. 转:JS动态加载JS
  8. 移除apt源_apt提示处理归档 (--unpack)时出错的解决办法
  9. there are so many javascript library
  10. 海报展示样机模板|给你一个现实的环境
  11. 改变Linux的DNS解析顺序(DNS到hosts)
  12. windwos 10打印机服务老是自动关闭
  13. GLASS数据批量下载
  14. 电脑里有老版java删不掉,电脑上的一些文件老是删不掉怎么办 win7中经常出现一些文件夹删不掉...
  15. zabbix 批量生成聚合图形
  16. jsp中空格字符怎么写_jsp空格符号怎么打
  17. 性能分析26-tomcat优化P61
  18. pale moon 最新版中文包安装方法
  19. 全国计算机等级考试-三级信息安全考试知识点(无顺序)
  20. 一千座5G工厂的花苞

热门文章

  1. linux命令大全 保存退出,怎么保存退出命令linux vi
  2. 不用安装的虚拟光驱_无需任何第三方软件重新安装Windows10
  3. 自动化测试中对数据恢复的思考与实际业务改造实践
  4. 首先下载安装data.table包_自从用了这个表情包制作工具,斗图再也没输过
  5. 【发布】App Store 预览视频制作总结
  6. 成为职场说话高手的技巧
  7. 一个微信小程序下载保存视频的模块,支持进度显示
  8. csharp基础练习题:猫年,狗年【难度:0级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
  9. 数据库 查询计算机系姓王,数据库实验3简单查询和连接查询
  10. Latex中表格中固定表格宽度时出现错误“LaTeX Error: Illegal character in array arg.”