tensorflow 基本概念

本文介绍了TensorFlow的历史和发展,详细讲解了其核心概念如张量、变量、计算图等,并提供了丰富的代码示例,帮助读者快速掌握使用TensorFlow进行深度学习开发的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

From: http://shartoo.github.io/GoogleTensorFlowBasicConcept/


本文总阅读量1816次

欢迎 star我的博客

start up

1.1 谷歌深度学习工具历史:

  1. 第一代:DistBelief 由 Dean于2011年发起,主要产品有:
    • Inception (图像识别领域)
    • 谷歌Search
    • 谷歌翻译
    • 谷歌照片
  2. 第二代:TensorFlow 由Dean于2015年11月发起,大部分DistBelief都转向了TensorFlow

1.2 产品特性

概念描述
编程模型类数据流的模型
语言Python C++
部署code once,run ererywhere
计算资源cpu,gpu
分布式处理本地实现,分布式实现
数学表达式数学图表达式,自动分化
优化自动消除,kernel 优化,通信优化,支持模式,数据并行

1.3 计算图


  
  1. import tensorflow as tf
  2. b = tf.Variable(tf.zeros([100])) # 100维的向量,都初始化为0
  3. w = tf.Variable(tf.random_uniform([784,100],-1,1)) # 784x100的矩阵
  4. x = tf.placeholder(name="x") # 输入的占位符placeholder
  5. relu = tf.nn.relu(tf.matmul(w,x)+b) # Relu(Wx+b)
  6. C =[...] # 使用relu的一个函数计算代价

对应的计算图如下:计算图

1.4 Tensorflow的代码样例

  1. 构建数据流图的第一部分代码

  
  1. import tensorflow as tf
  2. import numpy as np
  3. # 创建100个numpy的 x,y 假数据点,y = x*0.1+0.3
  4. x_data = np.random.rand(100).astype("float32")
  5. y_data = x_data*0.1+0.3
  6. # 找出计算 y_data =W*x_data+b的w和b的值,虽然我们知道w=0.1,b=0.3,但是tensorflow会找到并计算出来
  7. w = tf.Variable(tf.random_uniform)

2 tensorflow概览

要使用tensorflow的话,你需要理解以下概念:

  • 图代表了计算
  • 图需要在会话(Sessions)中执行
  • 张量(tensor)代表数据
  • 使用Variables来持有状态
  • 使用feeds 和 fetches来获得任何操作的输入输出数据

tensorflow的概览

  • 一个将计算转化为图的编程系统
  • 图中的节点是:
    • 操作(op):执行某些计算
    • 输入(input):一个或多个张量(tensorflow)
    • Tensor张量:一个有类型的多维数组

3 两个计算阶段

3.1 在图中计算

  • 图必须在Session中运行
  • 会话(Session)
    • 将图操作放入到设备上,比如CPUs和GPUs
    • 提供执行方法
    • 返回操作产生的张量,比如python中的numpy ndarray对象,以及C和C++tensorflow::Tensor实例。

3.2 图中的两个计算阶段

  1. 构建阶段
    • 形成图
    • 创建图来代表神经网络并训练这个神经网络
  2. 执行阶段
    • 使用会话执行途中的操作
    • 重复执行图中训练操作集合
  3. 构建图
    • 开始那些不需要任何输入(source ops)的操作(op),常量
    • 将它们的输出传入到其他做计算的操作
    • 操作构建者返回对象
    • 代表了结构化操作的输出
    • 将这些输出传入其他操作构建者作为输入
  4. 默认图

将节点加入此图的操作构建者


  
  1. import tensorflow as tf
  2. # 创建一个产生1x2的矩阵的常量操作,操作被作为节点加入到默认图
  3. # 构建者的返回值代表了常量操作的输出
  4. matrix1 = tf.constant([[3,3.]])
  5. # 创建另外一个产生 2x1矩阵的常量操作
  6. matrix2 = tf.constant([[2.0],[2.]])

有三个节点:两个constant操作(ops)以及一个matmul操作


  
  1. # 创建一个Matmul操作,将 matrix1和matrix2作为输入
  2. # 返回值,‘product’,代表了矩阵相乘的结果
  3. product = tf.matmul(matrix1,matrix2)
  1. 在会话Session中运行图
  • 创建一个Session对象:应该在被关闭以释放资源
  • 没有参数,session构建者运行默认图

  
  1. # 运行默认图
  2. sess = tf.Session()
  3. # 要运行matmul操作,我们调用了session的‘run()’方法,传入'producr'代表了matmul操作的输出。这即回调了matmul操作的输出结果
  4. # 操作的输出以一个numpy的'ndarray'对象返回'result'
  5. result = sess.run(product)
  6. print result
  7. # ==>[[12.]]
  8. #关闭会话
  9. sess.close()
  1. Session运行图,Session.run()方法执行操作
  2. 一个Session块(block)
    • 在块的结尾自动关闭
      
            
      1. with tf.Session() as sess:
      2. result = sess.run([product])
      3. print result
  3. GPU的使用
    • 将图定义转换为分布在各种计算资源,比如CPU和GPU之间的可执行操作
    • 如果有GPU,tensorflow会有限使用GPU

#4 交互使用

  • 在python环境中,比如Ipython,InteractiveSession类会被使用
  • Tensor.eval()Operation.run()
  • 这可以避免必须用一个变量来保持一个session

  
  1. # 进入一个交互的Tensorflow Session
  2. import tensorflow as tf
  3. sess = tf.InteractiveSession()
  4. x = tf.Variable([1.0,2.0])
  5. y = tf.constant([3.0,3.0])
  6. #使用'x'的initializer的 run() 方法初始化
  7. x.initializer.run()
  8. # 添加一个操作从'x'中抽取'a',执行并打印结果
  9. sub = tf.sub(x,a)
  10. print sub.eval()
  11. # ==>[-2,-1.]
  12. # 关闭session
  13. sess.close()

5 张量(Tensors)

  • Tensor(张量)数据结构代表了所有数据
  • 在计算图中只有张量在操作之间传递
  • n维数组或者列表
    • 静态类型,秩,或者 shape

rank(秩)

rank数学实体python示例
0Scalar(大小)s =483
1Vector(大小和方向)v=[1.1,2.2,3.3]
2Matrix(数据表)m=[[1,2,3],[4,5,6],[7,8,9]]
33-Tensor(立方(cube)的数量)t=[[[2],[4],[6],[8]],[[10],[12]]]
nn-Tensor同上

shape

RankShape维数示例
0[]0-D一个0-D张量,一个标量
1[D0]1-D一个1-D张量,shape是[5]
2[D0,D1]2-D一个2-D张量,shape是[3,4]
3[D0,D1,D2]3-D一个3-D张量,shape[1,4,3]
n[D0,D1,D2,…Dn]n-D一个n-D张量,shape是[D0,D1,…Dn]

数据类型

Data typepython类型描述
DT_FLOATtf.float3232位浮点类型
DT_DOUBLEtf.float6464位浮点类型
DT_INT64tf.int6464位有符号整型
DT_INT32tf.int3232位有符号整型
DT_INT16tf.int1616位有符号整型
DT_INt8tf.int88位有符号整型
DT_UINTtf.unit88位无符号整型
DT_STRINGtf.string变量长度的字节数组,Tensor每个元素是一个字节数组
DT_BOOLtf.boolBoolean
DT_COMPLEX64tf.complex64由两个32位浮点数组成的复数,实数和大小部分
DT_QINT32tf.qint32量化操作中32位有符号整型
DT_QINT8tf.qint8量化操作中8位有符号整型
DT_QUINT8tf.quint8量化操作中8位无符号整型

#6 变量 变量的创建、初始化、存储和载入

  • 为了持有和更新参数,在图中保持状态可以通过调用 run()方法
  • 内存buffer包含张量
  • 必须是明确初始化并且在训练期间和训练之后存储到磁盘上的
  • 类 tf.Variable
    • 构造器:变量的初始化值,一个任意类型和shape的张量
    • 构造之后,类型和shape都会固定
    • 使用assign操作op, validate_shape = False

      6.1 创建

  • 传入一个张量作为初始值到 Variable构造方法中
  • 初始值:常量constants,序列化和随机值
    • tf.zeros(),tf.linspace(),tf.random_normal()
  • 固定shape:与操作的shape相同

  
  1. # 创建两个变量
  2. weight = tf.Variable(tf.random_normal([784,200],stddev=0.35),name ="weights")
  3. biases = tf.Variable(tf.zeros([200]),name ="biases")
  • 调用 tf.Variable() 加入操作到图中

6.2 初始化

  • 添加一个操作并执行
  • tf.initialize_all_variables()

  
  1. # 添加一个操作来初始化变量
  2. init_op = tf.initialize_all_variables()
  3. # 过后,执行model
  4. with tf.Session() as sess:
  5. #运行初始化操作
  6. sess.runinit_op

6.3 存储和恢复

  • tf.saver
  • 检查点文件:Variables都存储在二进制文件中,该文件包含了一个变量名到张量值得map

  
  1. # 创建一些变量
  2. v1 = tf.Variables(...,name ="v1")
  3. v2 = tf.Variables(...,name="v2")
  4. ...
  5. #添加一个操作来初始化变量
  6. init_op = tf.initialize_all_variables()
  7. # 添加操作来保存和恢复所有变量
  8. saver = tf.train.Saver()
  9. # 然后,运行模型,初始化变量,做一些操作,保存变量到磁盘中
  10. with tf.Session() as sess:
  11. sess.run(init_op)
  12. # 对模型做一些操作
  13. .....
  14. #存储变量到磁盘中
  15. save_path = saver.save(sess,"/tmp/model.ckpt")
  16. print ("Model saved in file: %s"%save_path)

** 恢复**


  
  1. with tf.Session() as sess:
  2. # 从磁盘中恢复变量
  3. saver.restore(sess,"/tmp/model.ckpt")
  4. print ("Model restored")
  5. # 做一些操作

6.4 选择哪些变量来存储和恢复

  • 在 ** tf.train.Saver()**中没有参数
    • 处理图中所有变量,每个变量都会被保存在该名字之下
  • 存储和恢复变量的子集
    • 训练5层神经网络,想训练一个新的6层神经网络,从5层圣经网络中恢复参数
  • tf.train.Saver()构造方法中传入一个Python词典:keys

  
  1. # 创建一些变量
  2. v1 = tf.Variables(...,name ="v1")
  3. v2 = tf.Variables(...,name ="v2")
  4. # 添加操作存储和恢复变量 v2,使用名字 "my_v2"
  5. saver = tf.train.Saver({"my_v2":v2})
  6. # 使用saver对象
  7. ...

6.5 简单计数器的示例代码


  
  1. # 创建一个变量,初始化为标量0
  2. state = tf.Variables(0,name="Counter")
  3. # 创建一个操作来给"state"加1
  4. one = tf.constant(1)
  5. new_value = tf.add(state,one)
  6. update = tf.assign(state,new_value)
  7. # 在图被运行,变量必须是通过运行一个"init"操作被初始化。
  8. # 我们首先要将"init"操作加入到图中
  9. init_op = tf.initialize_all_variables()
  10. # 运行图,和操作
  11. with tf.Session() as sess:
  12. #运行 'init'操作
  13. sess.run(init_op)
  14. # 打印'state'的初始化值
  15. print (sess.run(state))
  16. # 运行更新'state'的操作,并打印'state'
  17. for _ in range(3):
  18. sess.run(update)
  19. print (sess.run(state))
  20. # 输出
  21. #0
  22. #1
  23. #2
  24. #3

6.6 取数据Fetches

  • 在Session对象中调用run()方法来执行图,并传入张量来取回数据

  
  1. input1 = tf.constant(3.0)
  2. input2 = tf.constant(2.0)
  3. input3 = tf.constant(5.0)
  4. intermed = tf.add(input2,input3)
  5. mul = tf.mul(input1,intermed)
  6. with tf.Session() as sess:
  7. result = sess.run([mul,intermed])
  8. print (result)
  9. # 输出
  10. # [array([21.],dtype = float32),array([7.],dtype = float32)]

6.7 Feeds

  • 直接打包一个张量到图中的任何操作
  • 使用一个张量值临时替换一个操作的输出值
  • feed数据作为run()方法的一个参数
  • 仅仅用来运行调用被传入值
  • tf.placeholder()

  
  1. input1 = tf.placeholder(tf.float32)
  2. input2 =tf.placeholder(tf.float32)
  3. output = tf.mul(input1,input2)
  4. with tf.Session() as sess:
  5. print (sess.run([output],feed_dict = {input1:[7.],input2:[2.]}))
  6. #输出
  7. #[array([14.],dtype=float32)]

7 操作

类别示例
逐元素数学运算Add,Sub,Mul,Div,Exp,Log,Greater,Less,Equal…
数组操作Concat,Slice,Split,Constant,Rank,Shape,Shuffle..
矩阵运算MatMul,MatrixInverse,MatrixDeterminant…
状态操作Variable,Assign,AssignAdd…
神经元构建块SoftMax,Sigmoid,ReLU,Convolution2D,MaxPool…
检查点操作Save,Restore
队列和同步操作Enqueue,Dequeue,MutexAcquire,MutexRelease,…
控制流操作Merge,Switch,Enter,Leave,NextIteration





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值