tensorflow的学习心得(一)

对于tensorlfow 的认识和学习顺序

本文是想描述以下两个问题:

1. tensorflow是什么,有什么函数必须理解

自己的理解:

tensorflow就是一个容器,这个容器里面呢,有一个图(data flow graph,其实就是我们的神经网络模型:model),并且这个图(模型)中包含了很多的tensor(张量,目前我的理解,其实就是矩阵,也就是数据存放的方式,)。tensor可以这个flow graph中运算,输入,输出。
因此这就是为什么叫tensorflow。

所以,核心就是(flow Graph,那神经网络结构在tensorflow里也就是一张图)

那么使用tensorflow核心主要的流程其实就是三步:

  1. 将计算的流程表示成图(做深度学习的话,也就是构造神经网络)
  2. 启动这个图,也就是Session(Session,你可以理解成,你访问一次网页,在网页中打开了一个新的窗口。在这个窗口中进行网页的文章的读取,对关键词查询等过程。当你把这个窗口关掉之后,那么这个Session也就结束了。)
  3. 往session里面填入值,让 session运算得到结果。

其实后来仔细看看官网上的解释,也就两步:

  1. Building the computational graph
  2. Running the computational graph

即使创建一个模型,跑这个模型,就没有了,
但是呢,如果直接打印这个模型时不实际的,因为打印出来的值是这个tensor的值,而不是tensor里面所赋予的value的值(这个地方,我把它理解为一个tensor是一个多维的矩阵,那么你直接打印这个矩阵的话呢,得到的是这个矩阵的地址或者位置,为了得到这个矩阵里面的值,必须使用session函数),所以,为了得到tensor里面我们的内容,加入了session的步骤。


来个入门的函数理解:

函数原文:
http://blog.csdn.net/lenbow/article/details/52152766

1
2
3
4
5
6
7
8
9
10
11
12
import tensorflow as tf
#定义‘符号’变量,也称为占位符
a = tf.placeholder("float")
b = tf.placeholder("float")
y = tf.mul(a, b) #构造一个op节点 第一步
sess = tf.Session()#建立会话 第二步
#运行会话,输入数据,并计算节点,同时打印结果
print sess.run(y, feed_dict={a: 3, b: 3}) #第三步
# 任务完成, 关闭会话.
sess.close()

上面描述了我对tensorflow的概念和tensorflow的运算逻辑,那么下面介绍tensorflow中几个常用函数。

必须理解和掌握的几个tensorflow概念:

  • tensor
  • Varibale
  • placeholder
  • Session

下面逐一开始介绍:

1. tensor:

在计算图(Graph)中,操作间传递的数据都是tensor

tensor即使我们尴尬所提到的张量(矩阵,或者是tensorflow中储存数据的方式),那么声明tensor的方式有很多种。

里面有Ranks,Shape,Type需要理解一下

Ranks:is the number of dimensions of the tensor

Shape:这是指的是纬度,几纬的就是指几个shape

types: 这里指类型,int,float,还是double等等

1
2
import tensorflow as tf
a = tf.zeros(shape=[1,2])
1
2
import tensorflow as tf
matrix1 = tf.constant([[3., 3.]])

等等等,都是声明tensor的函数,方法

2. Variable

variable即为变量的意思,当训练模型的时候,使用变量去存储和更新参数。

那么变量是可以被存储(Saver函数)到磁盘中,并且在读取它们(load函数)。

这里必须强调一下:创建一个变量时,必须先初始化后

创建Variable:

例子:创建2个Variable

1
2
3
4
5
import tensorflow as tf
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
name = "weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
初始化

在使用变量的时候必须初始化这个变量,而且是必须在模型的其他操作运行之前完成。

最简单的例子是添加一个给所有变量初始化的操作。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#create two variables
import tensorflow as tf
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
name = "weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
#add an operation to initialize the variables.
init_op = tf.global_variables_initializer()
#Later, when launching the model
with tf.Session() as sess:
#Run the init operation:
sess.run(init_op)
...
#then use the model
...

这一块就很清楚了,
首先声明两个Variable变量,

之后,声明一个能够是所有变量初始化的函数,

然后,在运行session的时候,先把所有的Variable都初始化,再运算其他模块

我说明一下,我觉得我这块说明的不是很好,有兴趣的可以去看看,或者一起交流交流:
https://www.tensorflow.org/programmers_guide/variables

上面还讲了Saver()函数和restore()函数,这两个函数会在以后我们训练神经网络的时候非常的重要,以后我想在这两个函数中做一个专题,举几个例子。

3. placeholder

看名字就知道这是个什么函数了,占位符,这个函数是个好东西,一般用于tensorflow的第一步,构建flow graph(或神经网络的时候)的时候,但是不赋予值(数据),只是把空间(位置)占住,在我们的第三步(赋予值运算)的时候,把数据传入进去进行运算。

我在网上找到一种说法挺有意思:这个函数相当于告诉系统:这里有一个值/向量/矩阵,现在我没发给你具体数值,但是正式运算的时候我会补上!

1
2
3
4
5
6
7
8
9
import tensorflow as tf
x = tf.placeholder(tf.float32, shape=(1024, 1024))
y = tf.matmul(x, x)
with tf.Session() as sess:
print(sess.run(y)) # ERROR: will fail because x was not fed.
rand_array = np.random.rand(1024, 1024)
print(sess.run(y, feed_dict={x: rand_array})) # Will succeed.

4. Session

在刚刚的代码实例中,已经演示了很多有session的东西,上面也讲了session的概念,其实就是相当于你去访问一个网页,打开了一个新的窗口,在这个窗口上进行各种上网的活动(各种函数的运算),然后关掉这个窗口,你的运算也就终止了。

##2. 对于现在的目标来说,如何更好,更快的使用tensorflow去搭建自己的神经网络

根据第一个问题的描述,我觉得已经对tensorflow有个大致的理解和入门了。
现在我觉得需要的是实战例子,理解了实战的例子后,才能更好的编码。

目前来说我也处于这一阶段,正在学习别人写代码的角度去学习,那么我想推荐一个人的视频,这个人边写边讲解,不懂得,可以停下来查查资料。
为了实现我的研究课题,我主要分为一下几个方面开始实验:

需要翻墙:

https://www.youtube.com/watch?v=oYbVFhK_olY&list=PLQVvvaa0QuDfKTOs3Keq_kaG2P55YRn5v&index=43

嘛,正在跟着视频一点一点的学,然后根据自己的课题需要进行编码,有时间的话,我会把这两天学习到的代码和大家分享。

第一步:充分理解基本的神经网络结构:实现MNIST的手写识别

https://www.youtube.com/watch?v=BhpvH5DuVu8&index=46&list=PLQVvvaa0QuDfKTOs3Keq_kaG2P55YRn5v

第二步:理解CNN中的网络结构,如何用CNN实现MNIST的手写识别

https://www.youtube.com/watch?v=7Wq-QmMT4gM&index=56&list=PLQVvvaa0QuDfKTOs3Keq_kaG2P55YRn5v

第三步:如何用自己的数据和CNN结构去识别

https://www.youtube.com/watch?v=gT4F3HGYXf4&index=63&list=PLQVvvaa0QuDfKTOs3Keq_kaG2P55YRn5v

第四步:基于源代码的基础上,在CNN的数据中加一层CNN结构

http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/

坚持原创技术分享,您的支持将鼓励我继续创作!