卷积神经网络(convolutional neural network,CNN),权值共享(weight sharing)网络结构降低模型复杂度,减少权值数量,是语音分析、图像识别热点。无须人工特征提取、数据重建,直接把图片作输入,自动提取特征,对平移、比例缩放、倾斜等图片变形具有高度不变形。卷积(convolution),泛函数分析积分变换数学方法,两个函数f和g生成第三个函数数学算子,表征函灵敏f与g翻转、平移重叠部分面积。f(x)、g(x)为R1两个可积函数。积分新函数为函数f与g卷积。∫-∞+∞f(τ)g(x-E)dτ。

神经网络(neural networks,NN)包括输入层、隐藏层、输出层。卷积神经网络隐藏层分为卷积层和池化层(pooling layer 下采样层)。卷积层的卷积核(conventional kernel)在原始图像平移提取特征,每个特征是特征映射。池化层汇聚特征稀疏参数减少学习参数数量,降低网络复杂度。最大值池化(max pooling)、平均值池化(average pooling)。卷积核提取特征映射动作padding,移动步长(Stride)不一定整除图像素宽度,越边边缘取样为SAME,不越过边缘取样为VALID。

Necognitron->LeCun->LeNet->AlexNet
->网络加深:VGG16->VGG19
->增强卷积层功能:NIN->GoogleNet->Incption V3 Incption V4 ->
二者结合ResNet
->分类任务到检测任务:KCNN->FastRCNN->Faster-CNN
->增加新功能模块:FCN->STNet->CNN+RM/LSTM
卷积神经网络起点神经认知机(neocognitron)模型,出现卷积结构。第一个卷积神经网络模型LeCun,1989年,发明人LeCun。论文 http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf。径向基函数(radial basis function RBF)。1998年,LeCun,LeNet。http://vision.stanford.edu/cs598_spring07/papers/Lecun98.pdf。SVM 手工设计特征分类器。ReLU,Dropout ,GPU,大数据,2012年历史性突破AlexNet。

网络加深。

LeNet。输入层32x32,图像预处理reshape,潜在明显特征出现在最高层特征监测卷积核中心。卷积层3个(C1、C3、C5),增强原信号特征、降低噪音,在线演示: https://graphics.stanford.edu/courses/cs178/applets/convolution.html 不同卷积核输出特征映射不同。降采样层2个(S2、S4),降低网络训练参数、模型过拟合程度,最大池化(max pooling)选中区域最大值,平均值池化(mean pooling)选中区域平均值。全连接层1个(F6),输入向量和权重向量点积加偏置,传给sigmoid函数,产生单元i状态。输出层(高斯连接),欧式径向基函数(Euclidean radial basis funtion)单元,10个类别对应10个径向基函数单元,每个单元84个输入,输出RBF单元计算输入向量和类别标记向量欧式距离,越远越大。

AlexNet,2012年,Geoffrey Hintion及学生Alex Krizhevsky、Ilya Sutskever,《ImageNet Classification with Deep Convolutional Neural Networks》。不同GPU处理图像的不同部分,仅在部分层通信。5个卷积层,3个全连接层,5000万个可调参数。最后全连接层输出到1000维softmax层,产生覆盖1000类标记分布。防止过拟合,Dropout 0.5概率隐藏层神经元输出置0,共享权值,降低互适应,收敛迭代次数增加一倍。数据增强(data augmentation)变形(水平翻转图像、反射变化flip,原始图像随机平移变换crop,随机光照、彩色变换、颜色抖动)增加新数据。非线性激活函数,ReLU,收敛速度比sigmoid/tanh快。大数据训练,120万ImageNet图像数据。GPU实现,直接从GPU内存读出、写入。LRN(local response normalization)规范化层。

增强卷积层功能。

VGGNet,Karen simonyan、Andrew Zisserman 《Very Deep Convolutional Networks for Large_Scale Visual Recognition》http://www.robots.ox.ac.uk/~vgg/research/very_deep/ 。5个卷积组(8-16层)、2层全连接层图像特征,1层全连接分类特征。加深卷积层数达到准确率提升瓶颈。

GoogleNet。NIN(Network in Network)思想,Min Lin、Qiang Chen、Shuicheng Yan论文《Network In Network》https://arxiv.org/abs/1312.4400 。线性卷积层(linear convolution layer)变多层感知卷积层(multilayer perceptron),全连接层改为全局平均池化。2014年 GoogleNet(Inception V1),Christian Szegedy、Wei Liu论文《Going Deeper with Convolutions》https://arxiv.org/abs/1409.4842 。使用1x1卷积核降维,在全连接层连接1x1、3x3、5x5卷积结果。宽度、深度扩大,加速。层数更深,22层,不同深度增加两上损失函数避免反向传播梯度消失。增加多种大小卷积核,降维Inception模型,1x1卷积核降低特征映射厚度。

结合网络加深和增强卷积模块功能。

ResNet。2015年,ILSVRC不依赖外部数据物体检测、物体识别项目冠军,MSRA 何凯明,152层。ImageNet 分类、检测、定位、COCO数据集检测(deteciton)、分隔(segmentation)冠军。Kaiming He、Xiangyu Zhang、Shaoqing Ren、Jian Sun《Deep Residual Learning for Image Recognition》 https://arxiv.org/abs/1512.03385 。网络退化(network degradation),shortcut结构,输入跳层传递加卷积结果。残差(residual),复杂非线性映射H(x)预测图片分类,残差函数(residual function)F(x)=H(x)-x,优化残差映射比直接优化H(x)简单。

从分类任务到检测任务。图片目标检测,视频目标检测(VID)。

R-CNN,Region Proposal Networks(RPN)和CNN结合。RPNs,任意尺寸图片一系列带识别物体概率分数建议区域。使用小网络在最后卷积特征映射滑动扫描,滑动网络每次与特征映射窗口全连接,映射到低维向量,送入两个全连接层(box回归层box-regression layer和box分类层box-classification layer)。重复计算,几千个建议区域(region)互相重叠,多次重复提取特性。
Fast R-CNN,加速版本,最后建议区域映射CNN最后卷积层特征映射,一张图片只提取一次特征,提高速度,瓶颈在RPN,支持多类物体同时检测,行人车辆检测技术。
Fater-R-CNN,RPN交给CNN做,达到实时。Shaoqing Ren、Kaiming He、Ross Girshick、Jian Sun论文《Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks》 https://arxiv.org/abs/1506.01497 。

增加新功能模块。

FCN(反卷积)、STNet、CNN与RNN/LSTM混合结构。

MNIST AlexNet实现。网络结构图。
1、仔细研读网络论文,理解每一层输入、输出值、网络结构。
2、按照加载数据、定义网络模型、训练模型、评估模型步骤实现网络。

https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/convolutional_network.py 。
https://github.com/tensorflow/models/blob/master/tutorials/image/alexnet/alexnet_benchmark.py 。

#!/usr/bin/python
# -*- coding:utf8 -*-
# 输入数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
import tensorflow as tf
# 定义网络超参数
learning_rate = 0.001
training_iters = 20000
batch_size = 128
display_step = 10
# 定义网络参数
n_input = 784 # 输入的维度(img shape:28x28)
n_classes = 10 # 标记的维度(0-9 digits)
dropout = 0.75 # Dropout 的概率,输出可能性
# 占位符输入
x = tf.placeholder(tf.float32, [None, n_input])
y = tf.placeholder(tf.float32, [None, n_classes])
keep_prob = tf.placeholder(tf.float32) #dropout
# 卷积操作
def conv2d(name, x, W, b,strides=1):
x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')
x = tf.nn.bias_add(x, b)
return tf.nn.relu(x, name=name) #用relu激活函数
# 最大下采样操作
def maxpool2d(name, x, k=2):
return tf.nn.max_pool(x, 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)
# 所有的网络参数
weights = {
'wc1': tf.Variable(tf.random_normal([11, 11, 1, 96])),
'wc2': tf.Variable(tf.random_normal([5, 5, 96, 256])),
'wc3': tf.Variable(tf.random_normal([3, 3, 256, 384])),
'wc4': tf.Variable(tf.random_normal([3, 3, 384, 384])),
'wc5': tf.Variable(tf.random_normal([3, 3, 384, 256])),
'wd1': tf.Variable(tf.random_normal([4*4*256, 4096])),
'wd2': tf.Variable(tf.random_normal([4096, 4096])),
'out': tf.Variable(tf.random_normal([4096, 10]))
}
biases = {
'bc1': tf.Variable(tf.random_normal([96])),
'bc2': tf.Variable(tf.random_normal([256])),
'bc3': tf.Variable(tf.random_normal([384])),
'bc4': tf.Variable(tf.random_normal([384])),
'bc5': tf.Variable(tf.random_normal([256])),
'bd1': tf.Variable(tf.random_normal([4096])),
'bd2': tf.Variable(tf.random_normal([4096])),
'out': tf.Variable(tf.random_normal([n_classes]))
}
# 定义AlexNet网络模型
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)
# 第二卷积层
# 卷积
conv2 = conv2d('conv2', conv1, weights['wc2'], biases['bc2'])
# 最大池化(向下采样)
pool2 = max_pool('pool2', conv2, k=2)
# 规范化(归一化)
norm2 = norm('norm2', pool2, lsize=4)
# 第三卷积层
# 卷积
conv3 = conv2d('conv3', conv2, weights['wc3'], biases['bc3'])
# 最大池化(向下采样)
pool3 = max_pool('pool3', conv3, k=2)
# 规范化(归一化)
norm3 = norm('norm3', pool3, lsize=4)
# 第四卷积层
conv4 = conv2d('conv4', conv3, weights['wc4'], biases['bc4'])
# 最大池化(向下采样)
pool4 = max_pool('pool4', conv4, k=2)
# 规范化(归一化)
norm4 = norm('norm4', pool4, lsize=4)
# 第五卷积层
conv5 = conv2d('conv5', conv4, weights['wc5'], biases['bc5'])
# 最大池化(向下采样)
pool5 = max_pool('pool5', conv4, k=2)
# 规范化(归一化)
norm5 = norm('norm5', pool5, lsize=4)
# 第一全连接层,先把特征图转为向量
fc1 = tf.reshape(norm5, [-1, weights['wd1'].get_shape().as_list()[0]])
fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1'])
fc1 = tf.nn.relu(fc1)
# Dropout
fc1 = tf.nn.dropout(fc1, dropout)
# 第二全连接层
fc2 = tf.reshape(fc1, [-1, weights['wd1'].get_shape().as_list()[0]])
fc2 = tf.add(tf.matmul(fc2, weights['wd1']), biases['bd1'])
fc2 = tf.nn.relu(fc2)
# Dropout
fc2 = tf.nn.dropout(fc2, dropout)
# 网络输出层
out = tf.add(tf.matmul(fc2, weights['out']), biases['out'])
return out
# 构建模型
pred = alex_net(x, weights, biases, keep_prob)
# 定义损失函数、优化器(学习步长)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=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.global_variables_initializer()
# 开启一个训练
with tf.Session() as sess:
sess.run(init)
step = 1
# 开始训练,直到达到training_iters,即200000
while step * batch_size < training_iters:
# 获取批数据
batch_x, batch_y = mnist.train.next_batch(batch_size)
sess.run(optimizer, feed_dict={x: batch_x, y: batch_y, keep_prob: dropout})
if step % display_step == 0:
# 计算损失值和准确度,输出
loss, acc = sess.run([cost, accuracy], feed_dict={x: batch_x, y: batch_y, keep_prob: 1.})
print "Iter " + str(step*batch_size) + ", Minibatch Loss= " + "{:.6f}".format(loss) + ", Training Accuracy= " + "{:.5f}".format(acc)
step += 1
print "Optimization Finished!"
# 计算测试精度
print "Testing Accuracy:", sess.run(accuracy, feed_dict={x: mnist.test.images[:256], y: mnist.test.labels[:256], keep_prob: 1.})

参考资料:
《TensorFlow技术解析与实战》

欢迎推荐上海机器学习工作机会,我的微信:qingxingfengzi

学习笔记TF052:卷积网络,神经网络发展,AlexNet的TensorFlow实现的更多相关文章

  1. 学习笔记TF012:卷积网络简述

    ImageNet http://www.image-net.org ,图像标注信息数据库.每年举办大规模视觉识别挑战赛(ILSVRC).基于ImageNet数据库构建完成目标自动检测分类任务系统.20 ...

  2. CNN学习笔记:卷积神经网络

    CNN学习笔记:卷积神经网络 卷积神经网络 基本结构 卷积神经网络是一种层次模型,其输入是原始数据,如RGB图像.音频等.卷积神经网络通过卷积(convolution)操作.汇合(pooling)操作 ...

  3. CNN学习笔记:卷积运算

    CNN学习笔记:卷积运算 边缘检测 卷积 卷积是一种有效提取图片特征的方法.一般用一个正方形卷积核,遍历图片上的每一个像素点.图片与卷积核重合区域内相对应的每一个像素值乘卷积核 .内相对应点的权重,然 ...

  4. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  5. 【学习笔记】Iperf3网络性能测试工具

    [学习笔记]Iperf3网络性能测试工具 网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理.网络存在安全漏洞等原因,都会导致网络带宽利用率不高. ...

  6. 卷积神经网络学习笔记——轻量化网络MobileNet系列(V1,V2,V3)

    完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和Mo ...

  7. 【学习笔记】卷积神经网络 (CNN )

    前言 对于卷积神经网络(cnn)这一章不打算做数学方面深入了解,所以只是大致熟悉了一下原理和流程,了解了一些基本概念,所以只是做出了一些总结性的笔记. 感谢B站的视频 https://www.bili ...

  8. 深度学习笔记 (一) 卷积神经网络基础 (Foundation of Convolutional Neural Networks)

    一.卷积 卷积神经网络(Convolutional Neural Networks)是一种在空间上共享参数的神经网络.使用数层卷积,而不是数层的矩阵相乘.在图像的处理过程中,每一张图片都可以看成一张“ ...

  9. 学习笔记TF027:卷积神经网络

    卷积神经网络(Convolutional Neural Network,CNN),可以解决图像识别.时间序列信息问题.深度学习之前,借助SIFT.HoG等算法提取特征,集合SVM等机器学习算法识别图像 ...

随机推荐

  1. 分区工具fdisk,gdisk,parted

    在linux中,当我们给系统添加一块新硬盘时,我们是无法使用的,因为他还没有分区和格式化,只有当我们将新硬盘分区并格式化之后,挂载在某个目录下,才能供我们正常使用,接下来我们要学习三种硬盘分区工具,f ...

  2. Rigidbody(刚体) and Collider(碰撞器)

    关于刚体Rigidbody,手册上是这么描述的: Control of an object's position through physics simulation. 通过物理模拟控制一个物体的位置 ...

  3. Java_注解_01_注解(Annotation)详解

    一.注解的概念 Annotation(注解)是插入代码中的元数据(元数据从metadata一词译来,就是“描述数据的数据”的意思),在JDK5.0及以后版本引入.它可以在编译期使用预编译工具进行处理, ...

  4. L1正则化及其推导

    \(L1\)正则化及其推导 在机器学习的Loss函数中,通常会添加一些正则化(正则化与一些贝叶斯先验本质上是一致的,比如\(L2\)正则化与高斯先验是一致的.\(L1\)正则化与拉普拉斯先验是一致的等 ...

  5. ACM学习之路___HDU 2066 一个人的旅行

    Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还 ...

  6. java程序员该工作还是游戏?

    前阵子我终于下定决心,删掉了硬盘里所有的游戏. 身为一个程序猿,每天都要和各种新技术打交道,闲暇时间,总还得看一下各大论坛,逛逛博客园啥的,给自己充充电.游戏的话,其实我自小就比较喜欢,可以算是一种兴 ...

  7. 【转】开源中国上看到的一个vim的自动配置的好东西,分享下

    https://www.oschina.net/p/onekey-to-vim-ide 变量有高亮,竖行上有直线定位,对python的支持效果更佳,从事C/C++开发的程序员使用也不错.

  8. Centos7环境下使用Nginx托管.Net Core应用程序

    一.安装.Net Core 参考官方文档:https://www.microsoft.com/net/core#linuxcentos 1.添加dotnet产品Feed 在安装.NET Core之前, ...

  9. bzoj4403(模板题)

    序列统计,将答案转化,然后就是Lucas的模板题,用费马小定理瞎搞. #include<cstdio> #include<iostream> #include<algor ...

  10. Ubuntu16笔记本双显卡安装NVIDIA驱动

    blockquote { direction: ltr; color: rgb(0, 0, 0) } blockquote.western { font-family: "Liberatio ...