专栏首页后端技术Task 1_补充 TensorFlow概念学习

Task 1_补充 TensorFlow概念学习

什么是张量

https://www.youtube.com/watch?v=f5liqUk0ZTw 英文解说 https://blog.csdn.net/wtq1993/article/details/51714121 中文解释

TensorFlow的名字由来

TensorFlow的名字可以拆开为tensor和flow来理解。tensor是张量,flow是流。因此,TensorFlow就是张量的流动。简单来讲,tensorFlow的运行机制就是通过构建一个计算图,然后再根据这张图进行计算。计算图包含很多节点,它们叫做算子(operation)。算子会接受张量作为输入,并输出张量给另一个算子。因此在运行计算图的过程中,张量会被一直操作并传递,直到计算图输出。

算子,计算图,张量的形象表示

图1 一个简单的加法运算

在图1,a,b两个算子输出两个向量作为add算子的输入,add会对其输入进行加法操作,但没有输出。一个计算图就是由很多个算子相互联系而成的。比如图2,它所完成的事情显而易见。MatMul, Add 和 ReLU是算子。b, W, X是张量。整个流程是计算图

图2 一个计算图

理解不了张量?

张量类似于多维的数组,在物理学有广泛的应用。但是在这里,我们不必过于纠结它的意义。我们只需要知道它在计算图中是输入、输出中流动的信息就好。它既是算子的输入,也是它的输出。

TensorFlow的运行机制

上文说过,TensorFlow的运行机制就是通过构建一个计算图,然后再根据这张图进行计算。所以一段TensorFlow代码一般包括两个部分, 构建计算图,以及运行计算图。 TensorFlow的系统结构以C API为界,将整个系统分为「前端」和「后端」两个子系统:

  • 前端系统:提供编程模型,负责构造计算图;
  • 后端系统:提供运行时环境,负责执行计算图。

系统架构 然后我们看一段TensorFlow代码,它阐述了一个完整的从前端到后端的执行过程:

import tensorflow as tf
import numpy as np

"""
  构造计算图,此时工作由前端完成
"""
a = tf.constant (3)
b = tf.constant (2)
c = a + b

"""
   建立Session
"""
sess = tf.Session ()

"""
  交给后端执行
"""
print (sess.run(c))

我们再输出一些信息,来证明a b和c都只是张量,而不是计算的结果

import tensorflow as tf
import numpy as np

"""
  构造计算图,此时工作由前端完成
"""
a = tf.constant (3)
b = tf.constant (2)
c = a + b
print ("a is", a)
print ("b is", b)
print("c is", c)
"""
   建立Session
"""
sess = tf.Session ()
print(sess)
"""
  交给后端执行
"""
print (sess.run(c))

""" 输出:
  a is Tensor("Const:0", shape=(), dtype=int32)
  b is Tensor("Const_1:0", shape=(), dtype=int32)
  c is Tensor("add:0", shape=(), dtype=int32)
  <tensorflow.python.client.session.Session object at 0x00000182C14589E8>
  5
"""

从代码中我们可以看到,在执行c = a + b时,TensorFlow并没有开始计算,而只是生成了它的计算图。通过计算图,TensorFlow可以知道,c是怎么得到的。直到执行sess.run(c),TensorFlow才根据这个计算图得到c的具体值。

session的使用

显示调用session

"""
  手动生成,显式调用,手动关闭session。
  这种方式如果在后端执行时遇到错误,程序就会在session没关闭的情况下退出,导致内存泄漏。
"""
from __future__ import print_function,division
import tensorflow as tf

a=tf.constant(2.)
b=tf.constant(5.)
c=a*b

sess=tf.Session()
print(sess.run(c))
sess.close()

"""
  这种使用上下文管理器的方式,会在程序离开该代码段时自动释放资源,防止内存泄漏
"""
# Using the context manager.
with tf.Session() as sess:
  sess.run(...)

尽管用上下文管理器可以防止内存泄漏,我们仍需在调用时显式指定session(sess.run)。

隐式调用session

"""
  由于调用了sess.as_default(),在with代码段内,默认session已被指定为sess。
  这样当我们要计算某个张量的具体值时,只需像c.eval()这样调用即可,此时的session就默认使用sess。而不用显式地调用sess.run(c)。
  当然,就算要调用sess.run(c)也完全可行,两者的效果是等价的。
"""
import tensorflow as tf

c = tf.constant(3)
sess = tf.Session()

with sess.as_default():
  print(tf.get_default_session() is sess) # True
  print(c.eval()) # 3

"""
  如下展示了默认session在多个session间切换的方式。
"""
import tensorflow as tf

c = tf.constant(3)
sess = tf.Session()
sess2 = tf.Session()
with sess.as_default(): # sess为默认session
    print(c.eval())
# ...
with sess2.as_default(): #sess2为默认session
    print(c.eval())

还有另一种方法:使用sess = tf.InteractiveSession(),如此可以省去注册sess为默认session的过程。

"""
  省去注册sess为默认session的过程,有利于Jupyter NoteBook等交互式环境的体验。
"""
import tensorflow as tf

sess = tf.InteractiveSession()
# print(result.val())
sess.close()

graph的调用

在没有指定graph时,TensorFlow会隐式地构建一个graph作为默认graph。通过graph.as_default()可以指定默认的graph。如下代码证明了这一点。

"""
   在with代码段外,使用的是TensorFlow自己构建的graph
"""
import tensorflow as tf
import numpy as np

g = tf.Graph()

with g.as_default():
    # Define operations and tensors in `g`.
    c = tf.constant(30.0)
    print(c.graph is g) # True

print(tf.get_default_graph() is g) # False

神经网络的概念理解

遇到问题

 The TensorFlow library wasn't compiled to use FMA instructions, 
but these are available on your machine and could speed up CPU computations.

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • tomcat启动分析(2)Bootstrap

    startup.bat会最终运行Bootstrap的main方法,而main会先调用init方法。

    平凡的学生族
  • Task 7 FCN README

    This is a fully-connected network(8 strides) implementation on the dataset ADE20...

    平凡的学生族
  • JAVA JVM JRE JDK

    https://stackoverflow.com/questions/11547458/what-is-the-difference-between-jvm-...

    平凡的学生族
  • K8S学习笔记之Flannel解读

    我们知道docker官方并没有提供多主机的容器通信方案,单机网络的模式主要有host,container,brige,none。none这种模式,顾名思义就是d...

    Jetpropelledsnake21
  • DNSmasq详细解析及详细配置

    Dnsmasq 提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。...

    laulzgoay
  • 2. 深入理解 Cookie 与 Session ,Facade 设计模式, 分布式 Session

    "BAIDUID=40E9A74CB78CA05206FD128BEB27E014:FG=1; PSTM=1568883435; BIDUPSID=4927A1...

    一个会写诗的程序员
  • [深度思考]·证明softmax不受输入的数据偏移影响

    证明softmax不受输入的常数偏移影响,即softmax(x)=softmax(x+c)

    小宋是呢
  • 最高可拍摄7K照片,VRDL360相机在Indiegogo上众筹成功

    镁客网
  • dubbo源码解析-本地暴露

    上一篇dubbo源码解析-服务暴露原理中我们根据官方文档已经进行了具体服务到invoker的转换的介绍,但是后面却发现文档却说Dubbo 处理服务暴露的关键就在...

    java进阶架构师
  • 谷歌大脑深度学习从入门到精通视频课程[10.8]:自然语言处理——词标注

    AI100 已经引入 Hugo Larochelle 教授的深度学习课程,会在公众号中推送,并且对视频中的 PPT 进行讲解。课后,我们会设计一系列的问题来巩...

    AI科技大本营

扫码关注云+社区

领取腾讯云代金券