close
当前位置: 物联网在线 > 技术文库 >

一步一步学用Tensorflow构建卷积神经网络

 一步一步学用Tensorflow构建卷积神经网络

摘要: 本文主要和大家分享如何使用Tensorflow从头开始构建和训练卷积神经网络。这样就可以将这个知识作为一个构建块来创造有趣的深度学习应用程序了。

0. 简介
在过去,我写的主要都是“传统类”的机器学习文章,如朴素贝叶斯分类、逻辑回归和Perceptron算法。在过去的一年中,我一直在研究深度学习技术,因此,我想和大家分享一下如何使用Tensorflow从头开始构建和训练卷积神经网络。这样,我们以后就可以将这个知识作为一个构建块来创造有趣的深度学习应用程序了。

为此,你需要安装Tensorflow(请参阅安装说明),你还应该对Python编程和卷积神经网络背后的理论有一个基本的了解。安装完Tensorflow之后,你可以在不依赖GPU的情况下运行一个较小的神经网络,但对于更深层次的神经网络,就需要用到GPU的计算能力了。

在互联网上有很多解释卷积神经网络工作原理方面的网站和课程,其中有一些还是很不错的,图文并茂、易于理解[]。我在这里就不再解释相同的东西,所以在开始阅读下文之前,请提前了解卷积神经网络的工作原理。例如:

什么是卷积层,卷积层的过滤器是什么?

什么是激活层(ReLu层(应用最广泛的)、S型激活或tanh)?

什么是池层(最大池/平均池),什么是dropout?

随机梯度下降的工作原理是什么?

本文内容如下:
Tensorflow基础
1.1 常数和变量
1.2 Tensorflow中的图和会话
1.3 占位符和feed_dicts

Tensorflow中的神经网络
2.1 介绍
2.2 数据加载
2.3 创建一个简单的一层神经网络
2.4 Tensorflow的多个方面
2.5 创建LeNet5卷积神经网络
2.6 影响层输出大小的参数
2.7 调整LeNet5架构
2.8 学习速率和优化器的影响

Tensorflow中的深度神经网络
3.1 AlexNet
3.2 VGG Net-16
3.3 AlexNet性能

结语

1. Tensorflow 基础
在这里,我将向以前从未使用过Tensorflow的人做一个简单的介绍。如果你想要立即开始构建神经网络,或者已经熟悉Tensorflow,可以直接跳到第2节。如果你想了解更多有关Tensorflow的信息,你还可以查看这个代码库,或者阅读斯坦福大学CS20SI课程的讲义1和讲义2。

1.1 常量与变量
Tensorflow中最基本的单元是常量、变量和占位符。
tf.constant()和tf.Variable()之间的区别很清楚;一个常量有着恒定不变的值,一旦设置了它,它的值不能被改变。而变量的值可以在设置完成后改变,但变量的数据类型和形状无法改变。
#We can create constants and variables of different types.
#However, the different types do not mix well together.
a = tf.constant(2, tf.int16)
b = tf.constant(4, tf.float32)
c = tf.constant(8, tf.float32)

d = tf.Variable(2, tf.int16)
e = tf.Variable(4, tf.float32)
f = tf.Variable(8, tf.float32)

#we can perform computations on variable of the same type: e + f
#but the following can not be done: d + e

#everything in Tensorflow is a tensor, these can have different dimensions:
#0D, 1D, 2D, 3D, 4D, or nD-tensors
g = tf.constant(np.zeros(shape=(2,2), dtype=np.float32)) #does work

h = tf.zeros([11], tf.int16)
i = tf.ones([2,2], tf.float32)
j = tf.zeros([1000,4,3], tf.float64)

k = tf.Variable(tf.zeros([2,2], tf.float32))
l = tf.Variable(tf.zeros([5,6,5], tf.float32))

除了tf.zeros()和tf.ones()能够创建一个初始值为0或1的张量(见这里)之外,还有一个tf.random_normal()函数,它能够创建一个包含多个随机值的张量,这些随机值是从正态分布中随机抽取的(默认的分布均值为0.0,标准差为1.0)。

另外还有一个tf.truncated_normal()函数,它创建了一个包含从截断的正态分布中随机抽取的值的张量,其中下上限是标准偏差的两倍。

有了这些知识,我们就可以创建用于神经网络的权重矩阵和偏差向量了。
weights = tf.Variable(tf.truncated_normal([256 * 256, 10]))
biases = tf.Variable(tf.zeros([10]))
print(weights.get_shape().as_list())
print(biases.get_shape().as_list())
>>>[65536, 10]
>>>[10]

1.2 Tensorflow 中的图与会话
在Tensorflow中,所有不同的变量以及对这些变量的操作都保存在图(Graph)中。在构建了一个包含针对模型的所有计算步骤的图之后,就可以在会话(Session)中运行这个图了。会话可以跨CPU和GPU分配所有的计算。
graph = tf.Graph()
with graph.as_default():
a = tf.Variable(8, tf.float32)
b = tf.Variable(tf.zeros([2,2], tf.float32))

with tf.Session(graph=graph) as session:
tf.global_variables_initializer().run()
print(f)
print(session.run(f))
print(session.run(k))

>>>
>>> 8
>>> [[ 0. 0.]
>>> [ 0. 0.]]


(责任编辑:ioter)

用户喜欢...

【干货】TensorFlow的55个经典案例

本文是TensorFlow实现流行机器学习算法的教程汇集,目标是让读者可以轻松通过清晰简明的案例深入了解 TensorFlow。这些案例适合那些想要实现一些 TensorFlow 案例的初学者。本教程包含还包含笔...


23种深度学习库排行榜:TensorFlow、Keras、caffe占据前三

作者:John.Lau,来源: 大数据与云计算核心技术 我们对23种用于数据科学的开源深度学习库作了排名。这番排名基于权重一样大小的三个指标:Github上的活动、Stack Overflow上的活动以及谷歌搜...


从TensorFlow到PyTorch:九大深度学习框架哪款最适合你?

开源的深度学习神经网络正步入成熟,而现在有许多框架具备为个性化方案提供先进的机器学习和人工智能的能力。那么如何决定哪个开源框架最适合你呢?本文试图通过对比深度学习各大框...


一步步教你如何进行Xilinx SerDes调试

赛灵思中国SystemIO专家FAE 杨宁 FPGA SERDES的应用需要考虑到板级硬件,SERDES参数和使用,应用协议等方面。由于这种复杂性,SERDES的调试工作对很多工程师来说是一个挑战。本文将描述SERDES的一...


Xradio:别出心裁的系统教学用纯FPGA无线电

Xingran Yang 北京理工大学硕士研究生 2120120784@bit.edu.cn 利用赛灵思Spartan-6器件和一些外设组件轻松为学生和新手构建一款有趣的演示平台。 我们近期打算北京理工大学开发一款数字设计教学平...


TensorFlow和Caffe、MXNet、Keras等其他深度学习框架的对比

Google近日发布了TensorFlow 1.0候选版,这第一个稳定版将是深度学习框架发展中的里程碑的一步。自TensorFlow于2015年底正式开源,距今已有一年多,这期间TensorFlow不断给人以惊喜。在这一年多时...


教你一步一步实现iOS自己的字典转模型库

前言 我们在iOS开发中,一般会使用MVC或者MVVM等模式。当我们从接口中拿到数据时,我们需要把数据转成模型使用。下面我就带大家一起用runtime一步一步的来完成这个转换框架 1、先写一个简...


Android冷启动白屏解析,带你一步步分析和解决问题

记得在本月初,我发表了一篇文章叫《 Android Studio新功能解析,你真的了解Instant Run吗?》,里面详细讲解了Android Studio中新加入的Instant Run功能,使得我们开发的效率可以大大地提升。 不过...


一步一步实现Android的MVP框架

Android 开发框架的选择 如何一步步搭建分层框架 使用 RxJava 来解决主线程发出网络请求的问题 结语 一、Android开发框架的选择 由于原生 Android 开发应该已经是一个基础的 MVC 框架,所以在初始...