zoukankan      html  css  js  c++  java
  • Python之TensorFlow的基本介绍-1

      一、TensorFlow™是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络算法库DistBelief。

      TensorFlow:
            神经网络(深度)
                图像:卷积神经网络
                自然语言处理:循环神经网络
            特点:
                引入各种计算设备(CPU/GPU/TPU),以及能够很好的运行在移动端。
                合理的C++使用界面,易用的Python使用界面来构造个执行你的graphs,可以直接写Python/C++程序
                采用数据流图(data flow graphs),用于数值计算的开源库,能够灵活的组装图,执行图
                谷歌支持,希望成为通用语言
            前后端系统:
                前端系统:定义程序图的机构
                后端系统:运算图结构
            会话:
                1、运算图的结构
                2、分配资源计算
                3、掌握资源(变量的资源,队列,线程)

      二、前面我们已经介绍了TensorFlow在人工智能领域所能做的事情了,下面会主要介绍TensorFlow的一些常用概念。

      1)张量(tensor):

      tensor(张量):
            一个类型化的N维数组
            三部分:
                名字、形状、数据类型
            阶:和数组的维度类似
            属性:
                graph:张量的默认图
                op:张量的操作名
                name:张量的字符串描述
                shape:张量的形状
            动态形状和静态形状:
                动态形状:(动态形状,创建一个新的张量并且数据量大小不变)
                    一种描述原始张量在执行过程中的一种形状(动态变化)
                    tf.reshape(和numpy类似),创建一个具有不同形态的新张量
                静态形状:(静态形状,一旦张量固定,不能再次设置静态形状,不能夸维度修改)
                    创建一个张量,初始的形状
                    tf.get_shape():获取静态形状
                    tf.set_shape():更新对象的静态形状。通常用于不能推断的情况下
            张量操作:
                固定值张量:
                    tf.zeros(shape, dtype, name)
                    tf.ones()
                    tf.constant()
                随机张量:(正太分布)
                    tf.random_normal(shape, mean, stddev, dtype, seed, name)
                    mean: 平均值
                    stddev: 标准差
                类型变换:
                    tf.cast(x, dtype, name)
                形状变换:
                    tf.reshape()
                    tf.get_shape()
                    tf.set_shape()
                切片与扩展:
                    tf.concat(values, axis, name)
            google提供的数据运算:
                地址:https://tensorflow.google.cn/api_docs/python/tf/math

      

      2)变量(Variable):

      变量:
            也是一种op,是一种特殊的张量,能够进行储存持久化,它的值就是张量,默认被训练
            tf.Variable(initial_value, name, trainable)
            注:
                1、变量op能够持久化保存,普通张量不行
                2、当定义一个变量op的时候,一定要在会话中取运行初始化
                3、name参数:在tensortboard使用的时候展示名字,可以让相同op名字进行区分

      3)数据流图(Graph):

    数据流图:
            tensor:张量(numpy中的数组,ndarray类型然后封装为tensor),简而言之,就是数组
            operation(op):专门运算的操作节点,所有操作都是一个op
            图:你的这个程序架构
            会话:运算程序的图

      这里介绍了上面张量和变量的OP解释。

      

      4)会话(Session):

      构建tf.Graph时将节点和边缘对象加入图中不会触发计算,图构建完成后将计算部分分流给tf.Session实现计算

      tf.Session拥有物理资源,通常与Python的with代码块中使用,在离开代码块后释放资源 。在不使用with代码块的情况下创建tf.Session,应在完成会话时明确调用tf.Session.close结束进程。

      调用Session.run创建的中间张量会在调用结束时或结束之前释放。tf.Session.run是运行节点对象和评估张量的主要方式,tf.Session.run需要指定fetch并提供供给数据(feed)字典,用户也可以指定其它选项以监督会话的运行。

      5)可视化(tensorboard):

      可视化tensorboard:
            通过读取TensorFlow事件文件来运行
            tf.summary.FileWriter(path, graph)
            读取(cmd中执行):tensorboard --logdir "path"

      

      

      三、简单的例子

    import tensorflow as tf
    
    a = tf.constant(5.0)
    b = tf.constant(4.0)
    
    sum = tf.add(a, b)
    
    # 默认的这张图,相当于一块内存
    graph = tf.get_default_graph()
    print(graph)
    
    # 只能运行一个图
    with tf.Session() as sess:
        print(sess.run(sum))
    
    # 图的创建
    # 创建一张图包含了一组op和tensor,上下文环境
    # op:只要使用tensorflow的api定义的函数都是op
    # tensor:指数数据
    g = tf.Graph()
    with g.as_default():
        c = tf.constant(12.0)
        # 有重载机制(默认给运算符重载成op类型)
        d = c + 1.0
    print(g)
    
    # 可以在会话中指定运行
    # config:
    #   log_device_placement: 查看运行设备信息
    with tf.Session(graph=g, config=tf.ConfigProto(log_device_placement=True)) as sess:
        print(sess.run(c))
        # eval:只有在会话上下文才可以使用
        print(d.eval())
    
        # 占位符
        plt = tf.placeholder(tf.float32, [None, 3])
        print(plt)
        # 静态形状,一旦张量固定,不能再次设置静态形状,不能夸维度修改
        plt.set_shape([2, 3])
        print(plt)
        # 动态形状,创建一个新的张量并且数据量大小不变
        plt_reshape = tf.reshape(plt, [3,2])
        print(plt_reshape)
    
        print(sess.run(plt, feed_dict={plt: [[1,2,3], [4,5,6]]}))
    
        print("*" * 20)
        print(d.graph)
        print("-" * 20)
        print(d.op)
        print("-" * 20)
        print(d.name)
        print("-" * 20)
        # 形状表示维度大小,如果是()表示0维,?代表不确定
        print(d.shape)
        print("*" * 20)
    
    
    # 变量
    e = tf.constant(1.0, name="e")
    f = tf.constant(2.0, name="f")
    g = tf.add(e, f, name="g")
    var = tf.Variable(tf.random_normal([2,3], mean=0, stddev=1), name="var")
    print(e)
    print(var)
    
    # 初始化所有变量的op
    init_op = tf.global_variables_initializer()
    
    with tf.Session() as sess:
        # 必须初始化op,才可运行
        sess.run(init_op)
        # tensorboard 写入
        tf.summary.FileWriter("tmp/summary/test", graph=sess.graph)
        print(sess.run([g, var]))

      结果

    <tensorflow.python.framework.ops.Graph object at 0x0000020B45A05B38>
    9.0
    <tensorflow.python.framework.ops.Graph object at 0x0000020B58472940>
    Device mapping: no known devices.
    add: (Add): /job:localhost/replica:0/task:0/cpu:0
    add/y: (Const): /job:localhost/replica:0/task:0/cpu:0
    Const: (Const): /job:localhost/replica:0/task:0/cpu:0
    12.0
    13.0
    Tensor("Placeholder:0", shape=(?, 3), dtype=float32)
    Tensor("Placeholder:0", shape=(2, 3), dtype=float32)
    Tensor("Reshape:0", shape=(3, 2), dtype=float32)
    [[1. 2. 3.]
     [4. 5. 6.]]
    ********************
    <tensorflow.python.framework.ops.Graph object at 0x0000020B58472940>
    --------------------
    name: "add"
    op: "Add"
    input: "Const"
    input: "add/y"
    attr {
      key: "T"
      value {
        type: DT_FLOAT
      }
    }
    
    --------------------
    add:0
    --------------------
    ()
    ********************
    Tensor("e:0", shape=(), dtype=float32)
    Tensor("var/read:0", shape=(2, 3), dtype=float32)
    [3.0, array([[-0.24931028,  0.10012802, -0.8845826 ],
           [-0.08898215, -0.87531203, -0.5762032 ]], dtype=float32)]

      四、TensorFlow总体上面还是非常灵活的,采用数据流图的方式,提前配置好关系图,在通过数据传入的方式来进行下一步的运算。

        通过会话的方式来进行资源等的控制,减少人为的造成的问题。

        总体而言,TensorFlow的灵活度以及适用性还是很不错的。

  • 相关阅读:
    Python单元测试unittest加载方式之二:加载测试套件
    Python单元测试unittest加载方式之二:加载测试套件
    Python单元测试unittest加载方式之一:unittestmain()启动单元测试模块
    和优秀的人相处
    耐心和恒心
    ubuntu下FTP文件目录共享
    一个不错的编译调试方法
    qt 程序异常崩溃
    minigui SetTimer(hwnd, id, speed)
    minigui 按钮点击弹窗外部 弹窗消失功能 WS_EX_TRANSPARENT
  • 原文地址:https://www.cnblogs.com/ll409546297/p/11393296.html
Copyright © 2011-2022 走看看