这是个人的第一篇博客。开博客的初衷,在于记录自己未来三年的学习进度、过程。
两月前开始接触Deep Learning和Tensorflow,目前和大师兄的‘’成果‘’:基于opencv导入图像数据并生成tfRecord文件,利用ImageNet提供的训练数据,结合Vgg网络完成了对小组内使用的数据集的分类。废话不多说,开始今天的正题。
1.首先是第一个问题,什么是Tensorflow?
它,是由Google开源的一个深度学习的强大模块。类比于C++中涉及的库(例如,STL、Opencv等)、Matlab中的工具箱、Java中的jar包。它对底层的一些细节进行了封装,如对函数的自行求导、分布式计算等等。我们只需知道去调用相应的方法进行操作,而不必去深究其具体的内部实现。
Tensorflow使用的是 数据流图(data flow graphs) 的方式来表示数值计算。数据流图是一张有向图,通过节点与边来描述整个计算过程。节点(Op)代表着各种输入、输出以及数学运算或操作;边表示着节点之间的相互联系。节点与节点间传递的数据为多维数组或列表,即张量(Tensor)。Tensor在整张图中流动,故因此而被称为Tensorflow。
2.Tensorflow的工作原理
介绍完Tensorflow,接下来我们会进一步去说明它的工作原理。
(1)使用图(graphs)来表示计算任务
在这里以a+b的简单操作为例,直观的去展示Tensorflow如何以图来表示计算任务,代码如下:
node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0) #默认float32类型
node3 = tf.add(node1, node2)
其对应的图为
其结构有点像数据结构中的中序表达式树。
(2)使用张量(tensor)来表示数据
之前也提及过,张量(tensor)就是一个n维数组或列表。在Tensorflow中以这种数据结构去表示所有的数据,操作之间传递的数据也均为张量(tensor)。
(3)使用会话(session)来执行图
个人对这句话的理解是,Tensorflow对于图的构建和数值计算是分开的,基于python的tensorflow在上层构建出整个计算流程,而底层的计算仍是交由C/C++去完成的,session的作用就像是一座桥梁,连接起了整个操作,就像一个开关。在一些需要进行交互的环境下,一般会使用InteractiveSession去替代Session。
(4)使用变量(variables)来维护状态
上面提到的a+b过程,都是 常值张量(constant)。而在一些请况下,如线性回归y=wx+b中,w和b在计算过程中是需要去动态调整的,变量variables就是Tensorflow提供的对应于此种情况的。用可以保持或更新相应的参数,以维护整个图执行过程中的状态信息。
(5)使用供给(feeds)和取回(fetches)来传入和传出数据
此篇文章主要是介绍Tensorflow的基础知识,相关的数据的定义、输入输出操作及代码会在后续的博客中进一步介绍。
基于此,我们介绍完了Tensorflow。对于使用Tensorflow,整个过程可以概括为以下三个环节:
构建图 ——————> 启动图 ——————> 取值运算
在这里,我们引入了官网给出的一个小demo,去感受一下Tensorflow的整体布局。
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
import tensorflow as tf
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
for i in range(10):
print(i)
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
这段代码实现的功能是对手写数字进行分类。我们的目的不是去设计一个很复杂的网络,而是要介绍下Tensorflow整个过程的三个环节。
对应这个教程的实现代码很短,我们对该代码进行分段。
代码 04-10 行 对应于构建图的环节,
代码 11-12 行 对应于启动图的环节,
代码 13-19 行 对应于取值运算的环节。
先写到这里。第一次写这类博客,不足与错误之处,希望大家多多给予宝贵意见,谢谢。