一个TFBOY的自我修养——Tensorflow学习笔记(1)

时间:2021-05-27 04:13:23


已经很久没有在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官方文档