当前位置:   article > 正文

AlexNet_norm3

norm3

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

AlexNet的TensorFlow实现(仅参考):

  1. # -*- coding=UTF-8 -*-
  2. import sys
  3. import os
  4. import random
  5. import cv2
  6. import math
  7. import time
  8. import numpy as np
  9. import tensorflow as tf
  10. import linecache
  11. import string
  12. import skimage
  13. import imageio
  14. # 输入数据
  15. import input_data
  16. mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
  17. # 定义网络超参数
  18. learning_rate = 0.001
  19. training_iters = 200000
  20. batch_size = 64
  21. display_step = 20
  22. # 定义网络参数
  23. n_input = 784 # 输入的维度
  24. n_classes = 10 # 标签的维度
  25. dropout = 0.8 # Dropout 的概率
  26. # 占位符输入
  27. x = tf.placeholder(tf.types.float32, [None, n_input])
  28. y = tf.placeholder(tf.types.float32, [None, n_classes])
  29. keep_prob = tf.placeholder(tf.types.float32)
  30. # 卷积操作
  31. def conv2d(name, l_input, w, b):
  32. return tf.nn.relu(tf.nn.bias_add( \
  33. tf.nn.conv2d(l_input, w, strides=[1, 1, 1, 1], padding='SAME'),b) \
  34. , name=name)
  35. # 最大下采样操作
  36. def max_pool(name, l_input, k):
  37. return tf.nn.max_pool(l_input, ksize=[1, k, k, 1], \
  38. strides=[1, k, k, 1], padding='SAME', name=name)
  39. # 归一化操作
  40. def norm(name, l_input, lsize=4):
  41. return tf.nn.lrn(l_input, lsize, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name=name)
  42. # 定义整个网络
  43. def alex_net(_X, _weights, _biases, _dropout):
  44. _X = tf.reshape(_X, shape=[-1, 28, 28, 1]) # 向量转为矩阵
  45. # 卷积层
  46. conv1 = conv2d('conv1', _X, _weights['wc1'], _biases['bc1'])
  47. # 下采样层
  48. pool1 = max_pool('pool1', conv1, k=2)
  49. # 归一化层
  50. norm1 = norm('norm1', pool1, lsize=4)
  51. # Dropout
  52. norm1 = tf.nn.dropout(norm1, _dropout)
  53. # 卷积
  54. conv2 = conv2d('conv2', norm1, _weights['wc2'], _biases['bc2'])
  55. # 下采样
  56. pool2 = max_pool('pool2', conv2, k=2)
  57. # 归一化
  58. norm2 = norm('norm2', pool2, lsize=4)
  59. # Dropout
  60. norm2 = tf.nn.dropout(norm2, _dropout)
  61. # 卷积
  62. conv3 = conv2d('conv3', norm2, _weights['wc3'], _biases['bc3'])
  63. # 下采样
  64. pool3 = max_pool('pool3', conv3, k=2)
  65. # 归一化
  66. norm3 = norm('norm3', pool3, lsize=4)
  67. # Dropout
  68. norm3 = tf.nn.dropout(norm3, _dropout)
  69. # 全连接层,先把特征图转为向量
  70. dense1 = tf.reshape(norm3, [-1, _weights['wd1'].get_shape().as_list()[0]])
  71. dense1 = tf.nn.relu(tf.matmul(dense1, _weights['wd1']) + _biases['bd1'], name='fc1')
  72. # 全连接层
  73. dense2 = tf.nn.relu(tf.matmul(dense1, _weights['wd2']) + _biases['bd2'], name='fc2') # Relu activation
  74. # 网络输出层
  75. out = tf.matmul(dense2, _weights['out']) + _biases['out']
  76. return out
  77. # 存储所有的网络参数
  78. weights = {
  79. 'wc1': tf.Variable(tf.random_normal([3, 3, 1, 64])),
  80. 'wc2': tf.Variable(tf.random_normal([3, 3, 64, 128])),
  81. 'wc3': tf.Variable(tf.random_normal([3, 3, 128, 256])),
  82. 'wd1': tf.Variable(tf.random_normal([4*4*256, 1024])),
  83. 'wd2': tf.Variable(tf.random_normal([1024, 1024])),
  84. 'out': tf.Variable(tf.random_normal([1024, 10]))
  85. }
  86. biases = {
  87. 'bc1': tf.Variable(tf.random_normal([64])),
  88. 'bc2': tf.Variable(tf.random_normal([128])),
  89. 'bc3': tf.Variable(tf.random_normal([256])),
  90. 'bd1': tf.Variable(tf.random_normal([1024])),
  91. 'bd2': tf.Variable(tf.random_normal([1024])),
  92. 'out': tf.Variable(tf.random_normal([n_classes]))
  93. }
  94. # 构建模型
  95. pred = alex_net(x, weights, biases, keep_prob)
  96. # 定义损失函数和学习步骤
  97. cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
  98. optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
  99. # 测试网络
  100. correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1))
  101. accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
  102. # 初始化所有的共享变量
  103. init = tf.initialize_all_variables()
  104. # 开启一个训练
  105. with tf.Session() as sess:
  106. sess.run(init)
  107. step = 1
  108. # Keep training until reach max iterations
  109. while step * batch_size < training_iters:
  110. batch_xs, batch_ys = mnist.train.next_batch(batch_size)
  111. # 获取批数据
  112. sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys, keep_prob: dropout})
  113. if step % display_step == 0:
  114. # 计算精度
  115. acc = sess.run(accuracy, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})
  116. # 计算损失值
  117. loss = sess.run(cost, feed_dict={x: batch_xs, y: batch_ys, keep_prob: 1.})
  118. print "Iter " + str(step*batch_size) + ", Minibatch Loss= " + "{:.6f}".format(loss) + ", Training Accuracy= " + "{:.5f}".format(acc)
  119. step += 1
  120. print "Optimization Finished!"
  121. # 计算测试精度
  122. print "Testing Accuracy:", sess.run(accuracy, feed_dict={x: mnist.test.images[:256], y: mnist.test.labels[:256], keep_prob: 1.})






声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/104206
推荐阅读
  

闽ICP备14008679号