Tensorflow笔记

基础概念

计算图

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):
    train_data = load_data(FLAGS.train_prefix)
    train(train_data)

if __name__ == '__main__':
    tf.app.run()

当然,如果你所定义的主函数不是main(),而是叫test()那么也是可以的,那么启动语句需要写成tf.app.run(test())

def test(argv=None):
    train_data = load_data(FLAGS.train_prefix)
    train(train_data)

if __name__ == '__main__':
    tf.app.run(test)

session

Tensorflow框架中,程序不是实时运行的,而是将整个系统转化和构建成一个图,进行优化和整理,生成一个静态的图。实际运行时,需要生成一个session,在session中,程序才真正开始运行。

placeholder

在构建图的时候,数据还没有传入,需要使用placeholder()进行占位,等到session建立时,通过feed_dict()函数向占位符传入数据。

session.run

session.run()是用来执行某一具体操作的,这时,需要使用feed_dict()传入数据。

import tensorflow as tf

a = tf.placeholder(dtype=tf.float32)
b = tf.constant(2.0)
c = tf.add(a, b)

with tf.Session() as sess:
    print sess.run(c, feed_dict = {a: 1.0, b: 3.0})
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值