已经很久没有在CSDN上写Blog了,毕业季找工作真的是一件很头疼的问题,昨天被某公司放了鸽子之后心情十分不爽。反思余后是感觉自己的硬件不足,打算写写博客静静心神,顺便把学到的知识再进行一次比较系统的梳理。水平有限,仅供参考。
1.用TensorFlow写一个简单的HelloWorld
前提:已经安装好tensorflow,CPU/GPU版本均可
相信每一个梦想成为Coder的盆友迈入编程大门的第一步都是写一个HelloWorld。但是如果在面试过程中面试官让手写一个TF的HelloWorld的话也许会有一部分小伙伴写不出来(without hesitate)。作为入门的第一步,先来写一个TF系列的HelloWorld。直接上代码如下:
import tensorflow as tf str = 'Hello World' # 定义字符串 const = tf.constant(str) # 将定义的字符串初始化为tf常量 with tf.Session() as sess: # 初始化会话 print(sess.run(const)) # 实例化常量
操作的具体意义已经标注在注释中。
2.什么是TensorFlow?
顾名思义,tensorflow直译过来就是“张量流图”。按照我的理解,假如整个程序的操作集合定义为一条小河(有流动性),那么变量就可以比作装有货物(数据)的船,在河流的每一段可以经历不同的操作,最后达到最终的计算目的(比喻不好请轻喷。。。)。
计算图可以由两部分组成:
1.一组节点,每个节点代表一项操作(类比于河流的不同段)
2.一组有向边,每条边代表被操作的那部分数据(类比于小船)
3.TensorFlow计算流程
Processing:
1.创建一个计算图
2.运行一个会话,并计算图中定义的操作
3.输入数据集合及分析
4.TensorFlow中的数据模型
TensorFlow主要以Tensor作为计算数据,对于一个Tensor,主要具有下面三个属性:Rank,Shape and Type
1.Rank(阶)
Tensor的阶通常解释为张量的维度(dimension)。通常我们称0 rank的Tensor为Scalar(标量),比如普通的数字1,100等都是Scalar;1 rank的Tensor称为Vector(向量),比如a = [1, 2, 3, 4, 5]是一个一维的向量;2 rank的Tensor成为matrix(矩阵),比如m = [[1, 2, 3], [4, 5, 6]]就被定义为一个matrix。
2.Shape(形状)
形状指的是Tensor在每个rank拥有的数据维度。例如上面举出的a = [1, 2, 3, 4, 5],是一个1维的向量,但是在第一个维度上(第一层括号)具有5个值(1,2,3,4,5),那么该Tensor的形状就是(5,)。由此类推,上面给出的matrix例子的形状为(2,3)。
通过tensor.get_shape()方法可以直接获得当前tensor的形状,代码如下:
scalar = tf.constant(100) vector = tf.constant([1,2,3,4,5]) matrix = tf.constant([[1,2,3],[4,5]]) cube_matrix = tf.constant([[[1], [2], [3]],[[4],[5],[6]],[[7],[8],[9]],[10]]) print(scalar.get_shape()) #shape:() print(vector.get_shape()) #shape:(5, ) print(matrix.get_shape()) #shape:(2, 3) print(cube_matrix.get_shape()) #shape:(3, 3, 1)
Hint:每一个被定义为TF中Tensor的张量都必须是Dense的
上面给出的所有例子都是Dense的,即每个位置不存在缺失值,是一个完整的Data Block,那么如果张量不Dense,例如需要定义一个如下的matrix:
b = [[1,2,3],[4,5],[6]]
那么在使用tf.constant(b)进行定义时,会报下列的错误:
ValueError: Argument must be a dense tensor: [[1, 2, 3], [4, 5], [6]] - got shape [3], but wanted [3, 3].
3.Type
指定了Tensor中的数据数据类型,这就意味着在一个Tensor中只能指定某种类型的数据(不支持多类型)。
每日练手
Q:利用TensorFlow输出从1到10的数
思路:由于Tensorflow只在Session.run()执行时实例化流图,因此如果简单使用某个变量+1的形式,在每一趟循环中该变量将被重新初始化,如下:
value = tf.Variable(0, name = 'value') one = tf.constant(1) new_value = tf.add(value, one) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for _ in range(10): print(sess.run(new_value))
输出如下:
1 1 1 1 1 1 1 1 1 1 Process finished with exit code 0
修改思路:采用add和assign组合的方式,可以将每次计算得到的new_value拷贝到value中,最后输出每个value的值,如下:
value = tf.Variable(0, name = 'value') one = tf.constant(1) new_value = tf.add(value, one) update_value = tf.assign(value, new_value) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for _ in range(10): print(sess.run(update_value))
输出如下
1 2 3 4 5 6 7 8 9 10 Process finished with exit code 0
tf还提供了一个tf.assign_add()的方法,可以使代码更简洁:
value = tf.Variable(0, name = 'value') one = tf.constant(1) new_value = tf.assign_add(value, one) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for _ in range(10): print(sess.run(new_value))
参考资料:
GitBook :Tensorflow深度学习 [意] Giancarlo Zaccone 等 (注:不是广告,但是写的挺好,比较适合想要入门的小伙伴~)
Tensorflow 官方文档(中文):W3C Tensorflow官方文档