Tensorflow笔记
基础概念
计算图
Tensor(张量),在Tensorflow中可以理解为多维数组。
Flow(流),指数据流动的过程。
在计算图中,每一个计算就是一个节点,数据从一个计算“流”入下一个计算,形成图。
为什么使用计算图?
- 并行化,因为计算图是对计算的一种抽象,点之间的关系取决其依赖关系。因此,互相不依赖的计算可以并行计算,在多集群环境下可以进行分布式计算。
- 可移植性性,因为图是一种语言无关的表示方式,tensorflow 中使用protobuf来存储图,可以使用C++,python,jave等语言来解析图。
Eager Execution(即刻执行)
TensorFlow 的 Eager Execution 是一种命令式编程环境,可立即评估运算,无需构建计算图:运算会返回具体的值,而非构建供稍后运行的计算图。这样能使您轻松入门 TensorFlow 并调试模型,同时也减少了样板代码。
官方教程中给出的一个例子:
def fizzbuzz(max_num):
counter = tf.constant(0)
max_num = tf.convert_to_tensor(max_num)
for num in range(1, max_num.numpy()+1):
num = tf.constant(num)
if int(num % 3) == 0 and int(num % 5) == 0:
print('FizzBuzz')
elif int(num % 3) == 0:
print('Fizz')
elif int(num % 5) == 0:
print('Buzz')
else:
print(num.numpy())
counter += 1
调用函数
fizzbuzz(15)
输出
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
在这一过程中,使用了依赖于张量值的条件语句,并会在运行时输出这些值,这在非eager模式下是不行的。
在不同框架中,自动微分实现原理各有不同:
- 以Google的TensorFlow为代表的图方法
- 以Facebook的PyTorch为代表的运算符重载
- 以华为的MindSpore为代表的源码转换方法
eager模式下计算梯度
GradientTape
是eager模式下进行梯度计算和跟踪的工具,支持嵌套和多目标跟踪。
基本使用
tf.app
通用入口点,主要的功能是:
- 加载flag
- 启动(调用用户定义的主函数)
加载flag(tf.app.flags)
用于接受从终端传入的命令行参数,例如模型名称、epoch、dropout等等。
加载过程
flags.DEFINE_string('model', 'graphsage_mean', 'model names.') # 加载一个字符串,名称为model,默认值为graphsage_mean,这个flag的解释为model names.
flags.DEFINE_float('learning_rate', 0.01, 'initial learning rate.') # 加载一个浮点数,名称为learning_rate,默认值为0.01,这个flag的解释为initial learning rate.
flags.DEFINE_integer('epochs', 10, 'number of epochs to train.') # 加载一个整数,名称为epochs,默认值为10,这个flag的解释为number of epochs to train.
使用
FLAGS = tf.app.flags.FLAGS
if FLAGS.model == 'graphsage_mean':
# Create model
sampler = UniformNeighborSampler(adj_info)
启动( tf.app.run )
tf.app.run()
是tensorflow运行的入口,执行tf.app.run()
时,首先加载flags参数项,然后执行用户定义的主函数(一般为main())。
例子:
def main(argv=None):
print("Loading training data..")
train_data = load_data(FLAGS.train_prefix)
print("Done loading training data..")
train(train_data)
if __name__ == '__main__':
tf.app.run()
当然,如果你所定义的主函数不是main()
,而是叫test()
那么也是可以的,那么启动语句需要写成tf.app.run(test())
def test(argv=None):
print("Loading training data..")
train_data = load_data(FLAGS.train_prefix)
print("Done loading training data..")
train(train_data)
if __name__ == '__main__':
tf.app.run(test)