Tensorflow笔记

时间:2022-12-12 15:53:57

基础概念

计算图

Tensor(张量),在Tensorflow中可以理解为多维数组。
Flow(流),指数据流动的过程。
在计算图中,每一个计算就是一个节点,数据从一个计算“流”入下一个计算,形成图。
Tensorflow笔记
为什么使用计算图?

这里我们引用tensorflow 中计算图理解的说法

  1. 并行化,因为计算图是对计算的一种抽象,点之间的关系取决其依赖关系。因此,互相不依赖的计算可以并行计算,在多集群环境下可以进行分布式计算。
  2. 可移植性性,因为图是一种语言无关的表示方式,tensorflow 中使用protobuf来存储图,可以使用C++,python,jave等语言来解析图。

Eager Execution(即刻执行)

推荐阅读:Tensorflow官方文档:Eager Execution
给出了大量eager excution的例子和解释

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模式下是不行的。


在不同框架中,自动微分实现原理各有不同:

  1. 以Google的TensorFlow为代表的图方法
  2. 以Facebook的PyTorch为代表的运算符重载
  3. 以华为的MindSpore为代表的源码转换方法

eager模式下计算梯度

推荐阅读Tensorflow2梯度带tape.Gradient的用法_(全面,深入)
举出多种例子,深入阐述了tape的各种形式

GradientTape是eager模式下进行梯度计算和跟踪的工具,支持嵌套和多目标跟踪。

基本使用

tf.app

通用入口点,主要的功能是:

  1. 加载flag
  2. 启动(调用用户定义的主函数)

加载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 )

推荐阅读tensorflow学习: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)