• TensorFlow基本概念


    一、计算图

    TensorFlow中两个最重要的概念,一个是Tensor,一个是Flow。Tensor就是张量,Flow就是计算流。计算图中的每个节点就是一个张量,而张量之间的依赖关系就是计算流,也就是在计算图中从一个Tensor通过计算流到另一个Tensor。

    import tensorflow as tf
    a = tf.constant([1.0,2.0], name='a')
    b = tf.constant([3.0,4.0], name='b')
    result = a + b
    在上述代码中,TensorFlow会自动将定义的计算a和b转化为计算图中的节点。在TensorFlow中,系统会自动维护一个默认的计算图。不同计算图上的张量和运算都不会共享,这里我们可以简单的将其理解为作用域的概念

    通过tf.get_default_graph函数可以获取当前默认的计算图,通过tf.Graph()定义一个计算图。计算图除了可以用来隔离张量和计算,也可以在某个计算图中单独定义使用某个GPU设备。

    在计算图中,可以通过集合collection来管理不同类别的资源,比如通过tf.add_to_collection函数可以将资源加入一个或多个集合中,然后通过tf.get_collection获取一个集合里面的所有资源。这里的资源可以是张量、变量或者运行TensorFlow程序所需要的队列资源等。

    为了方便使用,TensorFlow也自动管理了一些最常用的集合:

    二、张量(Tensor)

    从TensorFlow的名字中就可以看出张量(Tensor)是一个很重要的概念,可以说tensorflow中的最基本单元。通俗理解就是在TensorFlow中都以Tensor为基本单元计算流的。也可以被理解为多维数组。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程,需要通过会话session的run才能得到具体数字。

    一个张量主要保存了三个属性:名字:name,维度:shape,类型:type。

     三、会话

    会话的主要作用就是拥有并管理TensorFlow程序运行时的所有资源,当所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄露。

    在TensorFlow中,有两种用于运行计算图(graph)的会话(session)

    • tf.Session( )

    • tf.InteractivesSession( )

    1)tf.Session( )

    import tensorflow as tf
    
    # 构建graph
    a = tf.add(3, 5) 
    
    # 运行graph
    sess = tf.Session()  # 创建tf.Session的一个对象sess
    print(sess.run(a)) 
    
    sess.close()         # 关闭sess对象
    #一个session可能会占用一些资源,比如变量、队列和读取器(reader)。我们使用sess.close()关闭会话或者使用上下文管理器释放这些不再使用的资源。

    建议的写法:

    import tensorflow as tf  
    
    # 构建graph
    matrix1 = tf.constant([[3., 3.]])  
    matrix2 = tf.constant([[2.], [2.]])  
    
    product = tf.matmul(matrix1, matrix2)  
    
    # 运行graph
    with tf.Session() as sess:          # 使用"with"语句,自动关闭会话
        print(sess.run(product))  

    2) tf.InteractivesSession( )

    当python编辑环境是shell、IPython等交互式环境时,我们使用类tf.InteractiveSession代替类tf.Session,用方法tensor.eval( ),operation.run( ) 代替sess.run( ),这样可避免用一个变量sess来持有会话。其中更多地使用 tensor.eval(),所有的表达式都可以看作是tensor。
    // 进入python3交互式环境
    # python3
    
    >>> import tensorflow as tf  
    
    // 进入一个交互式会话
    >>> sess = tf.InteractiveSession()
    
    >>> a = tf.constant(5.0)
    >>> b = tf.constant(6.0)
    >>> c = a * b
    
    // We can just use 'c.eval()' without passing 'sess'
    >>> print(c.eval()) 
    
    >>> sess.close()   // 关闭交互式会话
    
    >>> exit()        // 退出python3交互式环境

     四、变量

    在TensorFlow中变量tf.Variable的作用就是保存和更新神经网络中的参数的,和其它编程语言类似,TensorFlow中的变量也需要指定初始值。变量也是张量

    weights=tf.Variable(tf.random_normal([2,3],stddev=2))
    #初始化变量,变量的初始值可以设置成随机数,常数或者通过其它变量的初始值计算得到。
    #tf.random_normal([2,3],stddev=2)会产生一个2x3的矩阵,矩阵中的元素是均值为0,标准差为2的正态分布生成的随机数。
    通过其它变量来初始化
    w2=tf.Variable(weights.initialized_value())

    TensorFlow随机数生成函数

    TensorFlow常数生成函数

     要使用变量,首先要通过session的run运行初始化变量,因为变量也是一个张量,上面的只是定义了计算过程,并没有真正执行:

    sess.run(w2.initializer)#初始化w2真正赋值
    #一次初始化所有变量
    init_op=tf.initialize_all_variables()
    sess.run(init_op)

    五、placeholder

    变量主要针对的神经网络中的参数,placeholder主要针对的样本中的输入数据X及其对应的Y。因为如果每轮迭代中输入数据都都以 x=tf.constant([[3., 3.]])形式输入的话(必须转换成张量),计算图将会非常之大,这是因为每生成一个常量,都会在计算图中增加一个节点,如果经过成千上万次的迭代的话,那就会生成非常多的节点,利用率也比较低。TensorFlow提供了placeholder机制来解决了这个问题,placeholder相当于定义了一个位置,这个位置中的数据在运行时再指定。这样程序中就不需要生成大量的常量来提供输入数据,而只需要将数据通过placeholder传入Tensorflow计算图。

    import tensorflow as tf
    import numpy as np
    
    x = np.ones((2, 3))
    y = np.ones((3, 2)) 
    
    input1 = tf.placeholder(tf.int32)
    input2 = tf.placeholder(tf.int32)
    
    output = tf.matmul(input1, input2)
    
    with tf.Session() as sess:
        print(sess.run(output, feed_dict = {input1:x, input2:y}))

    使用tf.placeholder( ),为某些操作的输入创建占位符,其中feed_dict是一个字典,在字典中需要给出每个用到的placeholder的取值,如果某个需要的placeholder没有被指定取值程序就会报错。注意,feed注入的值不能是tf的tensor对象,应该是Python常量、字符串、列表、numpy ndarrays,或者TensorHandles。

  • 相关阅读:
    LeetCode 18. 4Sum (四数之和)
    开运算、闭运算、形态学梯度、顶帽、黑帽
    膨胀和腐蚀
    四种滤波方式
    关于平滑处理及图像滤波与滤波器
    27、简述redis的有哪几种持久化策略及比较?
    26、redis中默认有多少个哈希槽?
    25、如何实现redis集群?
    大聊Python----Select解析
    大聊Python----IO口多路复用
  • 原文地址:https://www.cnblogs.com/gczr/p/11877535.html
Copyright © 2020-2023  润新知