首页
学习
活动
专区
工具
TVP
发布

深度学习框架Tensorflow学习笔记(一)

什么是Tensorflow?

TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。

从目前的文档看,TensorFlow支持CNN、RNN和LSTM算法,这都是目前在Image,Speech和NLP最流行的深度神经网络模型。

与Caffe、Theano、Torch、MXNet等框架相比,TensorFlow在Github上Fork数和Star数都是最多的,而且在图形分类、音频处理、推荐系统和自然语言处理等场景下都有丰富的应用。

那么接下来我们来聊聊如何学习Tensorflow?

目前市面上流行的主要是这两本书,我都粗略的浏览过,个人认为这两本书并不是很好的入门书籍。对于Tensorflow的用法,不够细致,有些内容,有点陈旧,实际操练时存在很多错误。

我想很多人看这两本书大概都有这种感觉,书上直接就把Tensorflow的代码写上来了,也没有细致的讲为什么,以至于很多小白看了开头就没有读下去的欲望了。

关于Tensorflow的安装我就不细说了,有问题的话参考

http://www.cnblogs.com/jackchen-Net/p/6681269.html

我在这里使用的是Anaconda+Python+Tensorflow的组合,那么Anaconda是Python的环境,包含了许多Python可以调用的工具包,比如numpy数值计算包、matplot绘图包等等。那么在Tensorflow上可以使用C++、也可以使用Python来进行编程,Tensorflow本身也是由C++开发得到的。由于Python的使用更加方便,在这里采用Python来学习Tensorflow的用法。

Tensorflow的基本概念

Tensorflow的结构

这个图呢(graph)代表一个计算的过程,并且要在会话(session)中执行,可以看到图中有很多op,你可以看做一个加法或者减法运算等。而这些运算要把tensor或者变量(variable)放进来操作。比如左图(Graph1)最上边一个tensor和一个variable传入op进行加法操作,操作后再得到一个tensor,数据向下流动,和另一个tensor一起流入最下面的节点op,进行加法操作以后得到最终的结果。

右图(Graph2)相当于一个实例,权值w和变量x进行乘法操作以后,再加上偏置b,再经过ReLU激活函数,得到输出,向上流动。

那么接下来看看在程序中是如何使用Tensorflow的。

1.计算图(graph)和会话(session)

首先打开Jupyter Notebook (Tensorflow),在这个Python的环境中编译,我们先来学习计算图(graph)和会话(session),创建一个文件

首先导入tensorflow框架,并用简写tf代替,那么运行的话按shift+enter(回车)键。先定义两个常量。

在输入常量中,如果输入到一半tf.con,你可以按tab键做补全操作,第一个是一个一行两列的矩阵,第二个是两行一列的矩阵。

创建一个矩阵乘法的op,然后把m1,m2存入,这里就可以得到一个矩阵相乘的结果product。然后print打印出来看一下。

按照我们以前的思维的话,输出是数字15,但是这里并不是一个数字,而是一个tensor。可以看到是个1*1的矩阵以及int32的类型。那么为什么呢?

因为这些只是我们定义的这个图以及定义的一些节点op,并没有在一个会话中去执行。那么接下来我们要定义一个会话。

定义了会话以后,就可以使用run这个方法去执行product,我们调用这个product的时候,它会调用矩阵的乘法去执行这个m1和m2,调用矩阵乘法的时候会往上生成常量m1和m2,一层一层的往上执行。

接着打印下结果看一下,并关闭会话。可以看到得到了结果15,但一般的话这样定义会话比较麻烦。以下创建一个会话,在会话中执行下面的语句,不用关闭了,因为它自动会关闭会话,非常方便。

接下来看一下变量的使用。

2.变量

同样的先导入tensorflow

先定义一个变量,注意V是大写,再定义一个常量,定义一个减法op,并可以采用shift+tab来查看函数的用法。再定义一个加法的op。

如果直接采用会话执行的话会产生一个错误,是什么呢?

在这里说到,尝试使用没有初始化的变量。那么说明在tensorflow中要使用变量就要先进行一个初始化的操作。

先定义一个初始化的操作,再在会话中执行初始化即可。

那么比如说你要写一个循环,每一次执行这个变量都加1,那么这个程序在tensorflow中该怎么写呢?

首先呢还是定义一个变量,初始化为0,起个名字‘counter’,那么这个参数有什么用呢?目前来说没什么用,后面用到了到时我会详细说明。

接下来创建一个加法op,让这个变量加1,赋值给new_value,再调用一个赋值的操作,把new_value赋值给state。因为用到了变量,所以将变量初始化,并在会话中运行初始化。

创建一个会话,先打印下state,看一看state的值。再定义一个for循环,相当于执行5次循环,每次都会run一下update,new_value赋值给state,而new_value的值由state加上1,而state等于变量的值,最初是0。

再打印,run一下state,可以看到每次state的变化。可以看到结果从0-5打印了出来。

那么变量的介绍先讲到这里。

3.Fetch 和 Feed

同样的导入tensorflow,Fetch的主要意思呢就是在会话中执行多个op,得到多个结果。

举个例子,先定义3个常量,定义一个加法op和一个乘法op(注意数与数之间的乘法用multiply,矩阵之间乘法用matmul)

然后定义一个会话,之前在会话中我们只执行一个op,而现在在会话中我们加个中括号,执行一个add和mul,同时执行,得到两个结果。

得到两个结果,这就是Fetch的概念,非常简单,接下来比较重要的是Feed的用法。

先定义两个占位符,再定义他们的类型,浮点型32位。再定义一个乘法op,开启一个会话,和之前不同的是,前面的程序都定义了常数或者有初值的变量,而这里都没有。

我们可以在运行乘法op的时候把值存入,比如运行这个output,存入值的时候运用的是Python中字典的形式,用到大括号{},运行output的时候对placeholder赋值。

运行一下得到结果14。也可以改变feed中的值。

4.Tensorflow使用简单案例

接下来讲一下tensorflow简单案例,因为要用到numpy数值计算包,导入numpy。

创建100个随机点,y_data相当于一条斜率0.1,截距0.2的直线。

构造一个线性模型,定义一个变量b和k,然后y=k*x_data+b,他们初始值都是0,使这个线性模型接近于这个样本直线y_data,我们需要优化斜率k和截距b来接近或者等于样本y。

先定义一个二次损失函数,随后,计算它的平方,求和后得平均值。在TensorFlow中,此cost function可表示为:

loss = tf.reduce_mean(tf.square(y_data-y))

通过代码可以看到,此表达式计算了y_data与根据输入x_data计算得到的点y间距离的平方的平均值。

可知拟合这些点最好的直线是有最小差值的那一条。因此,如果我们最小化error function,我们将会从数据中得到最好的模型。

使用梯度下降法来迭代参数k和b,使loss函数最小

设置迭代步长为0.2,开始训练迭代。

初始化变量,定义一个会话,并执行初始化,创造一个循环,迭代201次,每迭代一次,run一次train,进行一次梯度下降,loss的值越小,k和b越接近于0.2和0.1。

每经过20次查看一下结果,打印步数和k、b的结果。

以上就是tensorflow训练的一个完整的流程,可以看到训练20次以后基本稳定在0.2和0.1左右了,更改k和b的初始值也能得到一个最小的结果。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180316G15ZT400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券