Tensorflow学习笔记之一 —— 基础知识篇

来源:互联网 发布:数控编程g83 编辑:程序博客网 时间:2024/06/05 15:43

这是个人的第一篇博客。开博客的初衷,在于记录自己未来三年的学习进度、过程。

两月前开始接触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_datamnist = input_data.read_data_sets("MNIST_data/", one_hot=True)import tensorflow as tfx = 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 行   对应于取值运算的环节。



先写到这里。第一次写这类博客,不足与错误之处,希望大家多多给予宝贵意见,谢谢。

阅读全文
0 0