zoukankan      html  css  js  c++  java
  • TensorFlow 中的张量,图,会话

    tensor的含义是张量,张量是什么,听起来很高深的样子,其实我们对于张量一点都不陌生,因为像标量,向量,矩阵这些都可以被认为是特殊的张量。如下图所示:

    在TensorFlow中,tensor实际上就是各种“数”的统称。而flow是流动的意思。所以TensorFlow的意思就是“数”的流动,可以说TensorFlow这个名字很形象。一般来说,编程模式有两种,一种是命令式的,一种是符号式的。命令式便于理解和调试,而符号式便于对复杂代码进行封装和抽象(就想我们把一些操作封装成函数,每次调用根据不同的输入值来得到返回值)。TensorFlow是一个符号主义的库,在TensorFlow内部,需要先定义各种变量,然后建立一个计算图(计算流图),计算图指定了各个变量之间的计算关系。计算图就像工厂里的流水线,流水线决定了每一道工序是如何对原料进行加工的。TensorFlow中的原料就是计算图输入的数据,只有输入了数据,形成了数据流(tensor开始flow了),才能形成输出。

    张量

    import tensorflow as tf
    
    """
    TensorFlow中的张量有三个属性:name,shape,dtype
    1.name第一个属性是张量的一个标识符name=’参数为字符串类型’,如果没有指定,会根据张量是通过什么操作(运算)自动添加,后面的0表示张量d是计算节点add的第一个输出. 
    2.shape,描述张量的维度信息 
    3.dtype,张量的类型,如果在创建节点时没有指定dtype,没有小数点默认tf.int32,有小数点默认tf.float32.tensorflow会对参与计算张量的类型进行检查,不匹配会报错
    """
    #张量的属性
    result = tf.add(1,2)
    print(result)  # Tensor("Add:0", shape=(), dtype=int32)
    
    result2 = tf.add(2,3,name='result2')
    print(result2) # Tensor("result2:0", shape=(), dtype=int32)
    
    result3 = tf.add(3,4,name='result2')
    print(result3) # Tensor("result2_1:0", shape=(), dtype=int32)
    
    # 创建图
    a = tf.constant(1, name='input_a')
    b = tf.constant(2, name='input_b',dtype=tf.int8)
    f = tf.add(a,b, name='add_ab')
    
    #每一个节点(上面的a,b,f)都是一个Op(Operation),每个Op可以接受或输出多个或0个tensor对象,如tf.constant()创建一个常量Op,
    
    #TensorFlow可接收Python数值、布尔值、字符串、数组。单个数值转化为0阶张量(标量)。数值列表转化为1阶张量(向量)。由列表构成的列表转化为2阶张量(矩阵)。
    #TensorFlow数据类型基于NumPy。任何NumPy数组都可以传递给TensorFlow Op。使用时指定所需数据类型比不指定的代价小。
    #TensorFlow返回的张量都是NumPy数组
    
    

    图和会话

    
    """
    计算图(graph):只定义计算过程和数据(tensor)的操作方式,计算图中并不保存任何数据。
    会话(session):会话分配计算资源(一台或者多台的机器)去执行计算图或计算图中的一部分运算操作。当前的变量和结果保存在会话中。
    """
    
    #定义一个会话
    graph = tf.Graph()
    with graph.as_default():
        var = tf.Variable(initial_value=1,name='var1')
        initialize = tf.global_variables_initializer()
        assign = var.assign(value=33)
    #如果创建Op前,没有显式的创建计算图,TensorFlow将会在接下来的会话中使用使用默认的计算图
    
    #在会话中运行计算图中定义的计算过程
    """
    在TensorFlow中计算图的任何操作都需要在为计算图创建的会话中来运行。会话(session)会给相关的变量分配内存
    """
    with tf.Session(graph=graph) as sess:
        sess.run(initialize)
        sess.run(assign)
        print(sess.run(var))
    #   Output: 13
    
    #变量只在一个session中有效,比如下面的代码会提示变量没有初始化。
    with tf.Session(graph=graph) as sess2:
      print(sess2.run(var))
    # Error: Attempting to use uninitialized value var1
    
    #当然,也可以在多个会话session中使用同一个计算图,但是每个会话中的变量是独立的,就像在多个车间中使用同样规格的生产线。
    
    # 变量的保存和恢复
    import tensorflow as tf
    import numpy as np
    #保存的目录
    save_file = './ckpt/mymodel'
    
    #创建用来处理保存操作的类
    graph = tf.Graph()
    with graph.as_default():
        x = tf.placeholder(dtype=tf.float32,shape=[None,2])
        y = tf.placeholder(dtype=tf.float32,shape=[None,2])
        w = tf.Variable(initial_value=np.random.rand(1,2),dtype=tf.float32)
        b = tf.Variable(initial_value=[1.0,1.0],dtype=tf.float32)
        y_pred =  x * w + b
        loss=tf.reduce_mean(tf.square(y_pred-y))
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
        train = optimizer.minimize(loss)
    
        saver = tf.train.Saver()
        initialize = tf.global_variables_initializer()
    x_data = np.random.rand(1000,2)
    with tf.Session(graph = graph)as sess:
        sess.run(initialize)
        _, tmp_loss = sess.run([train, loss], feed_dict={x: x_data, y: x_data * [[2, 2]]})
        print('loss:',tmp_loss)
        for i in range(5000):
            _,tmp_loss=sess.run([train,loss],feed_dict={x:x_data,y:x_data*[[2,2]]})
        _, tmp_loss = sess.run([train, loss], feed_dict={x: x_data, y: x_data * [[2, 2]]})
        print('loss:',tmp_loss)
        print('w:',sess.run(w))
        saver.save(sess,save_path=save_file)
    
    with tf.Session(graph = graph) as sess_restore:
        saver.restore(sess_restore,save_file)
        print('w:',sess_restore.run(w))
    
    
    """
    注意:tf.train.Saver()需要在你想要保存的变量的定义后在创建,并且要求和这些变量在同一个计算图中,否则将会导致TensorFlow的ValueError: No variables to save 错误。
    """
    
    
  • 相关阅读:
    js监听全屏的事件
    java后端发送请求
    java参数转换为javaBean对象
    Cesiumjs初学第一天
    echarts设置toolTip大小和样式问题
    楼梯式导航
    SpringMybatisMapper
    ASP.NET Session丢失的情况
    C# 生成随机数
    c#实现每隔规定时间自动执行程序代码
  • 原文地址:https://www.cnblogs.com/sandy-t/p/8081807.html
Copyright © 2011-2022 走看看