• 基于TensorFlow的深度学习系列教程 2——常量Constant


    前面介绍过了Tensorflow的基本概念,比如如何使用tensorboard查看计算图。本篇则着重介绍和整理下Constant相关的内容。

    基于TensorFlow的深度学习系列教程 1——Hello World!

    常量的概念

    在tensorflow中,数据分为几种类型: 常量Constant、变量Variable、占位符Placeholder。其中:

    • 常量:用于存储一些不变的数值,在计算图创建的时候,调用初始化方法时,直接保存在计算图中
    • 变量:模型训练的参数,比如全连接里面的W和bias
    • 占位符:就是模型每次训练时的样本,当计算图固定时,只需要替换占位符里面的内容,就可以重新计算了。

    概念上跟spark的DAG图差不多,不过图的模式更固定一些,不像spark还分为action和transform。

    常量的简单使用

    下面这个例子就是常量最简单的使用例子了,定义a和b两个常量,输出x。x=a+b。

    import tensorflow as tf
    
    a = tf.constant(2)
    b = tf.constant(3)
    x = tf.add(a, b)
    
    with tf.Session() as sess:
        writer = tf.summary.FileWriter('./graphs', sess.graph)
        print(sess.run(x))
    
    writer.close()
    

    得到的计算图如下:

    选中constant可以发现,它的值直接写在定义里面了。

    常量的初始化

    1 固定初始化、0或1初始化

    最常用的初始化方法,就是直接在声明的时候赋予一个初始值,也可以根于指定的shape进行0和1的填充

    import tensorflow as tf
    
    # tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False)
    
    # 常量的创建
    # [2 2]
    a = tf.constant([2, 2], name='vector')
    # [[0 1] [2 3]]
    b = tf.constant([[0, 1], [2, 3]], name='b')
    
    # 也可以直接初始化成0或者1
    # [[0 0 0] [0 0 0]]
    zero1 = tf.zeros([2, 3], tf.int32)
    # [[0 0] [0 0]]
    zero2 = tf.zeros_like([[0, 1], [2, 3]])
    # [[1 1 1] [1 1 1]]
    one1 = tf.ones([2, 3], tf.int32)
    # [[1 1] [1 1]]
    one2 = tf.ones_like([[0, 1], [2, 3]])
    
    # 基于填充创建
    # [[8 8 8] [8 8 8]]
    fill1 = tf.fill([2, 3], 8)
    
    # 基于序列创建
    # [10. 11. 12. 13.]
    lnspace1 = tf.linspace(10., 13., 4, name='linspace')
    # [ 3  7 11 15]
    range1 = tf.range(3, 18, 4)
    # [ 3  8 13]
    range2 = tf.range(3, 18, 5)
    # [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17]
    range3 = tf.range(18)
    
    with tf.Session() as sess:
        print(sess.run(a))
        print(sess.run(b))
    
        print(sess.run(zero1))
        print(sess.run(zero2))
        print(sess.run(one1))
        print(sess.run(one2))
    
        print(sess.run(fill1))
    
        print(sess.run(lnspace1))
    
        print(sess.run(range1))
        print(sess.run(range2))
        print(sess.run(range3))
    

    tensorflow在设计时,尽量模仿numpy,因此很多函数都很类似。不过有一些操作tf中还是无法支持的,比如map:

    import tensorflow as tf
    import numpy as np
    """
    0.0
    3.3333333333333335
    6.666666666666667
    10.0
    """
    for a in np.linspace(0., 10., 4):
        print(a)
    """
    TypeError: Tensor objects are not iterable when eager execution is not enabled. To iterate over this tensor use tf.map_fn.
    """
    for a in tf.linspace(0., 10., 4):
        print(a)
    

    常量的随机初始化

    另一种常用的初始化方法就是指定随机方法进行初始化。

    import tensorflow as tf
    import cv2
    
    # 初始化服从指定正态分布的数值
    # [ 2.3021064   0.4199094  -0.03323628  0.47499242  0.36770386 -0.7848035 -0.70948434 -0.35462353  0.75125676  0.50364155]
    r1 = tf.random_normal([10], mean=0.0, stddev=1.0, dtype=tf.float32)
    
    # 产生截断的正态分布,如果与均值差值超过两倍,就重新生成
    # [ 1.785729    0.5161861   0.3950558   1.5795906   0.25945508 -1.5349426 -0.00732355  0.14366971 -0.7726713  -0.2694001 ]
    r2 = tf.truncated_normal([10])
    
    # 产生low和high之间的均匀分布
    # [-0.54088783 -2.957581    1.8622065  -2.7436473   0.8000214   2.087247  2.5148878  -0.19671392  0.9098282   1.6573    ]
    r3 = tf.random_uniform([10], minval=-3, maxval=3, dtype=tf.float32)
    
    # 随机打乱
    # [4 2 1 5 3]
    r4 = tf.random_shuffle([1, 2, 3, 4, 5])
    
    # 随机裁剪,一般用在图像上
    # [-1.6676509  -2.3372912  -0.39069057  2.044036   -2.0961857 ]
    r5 = tf.random_crop(r3, [5])
    
    # 图片例子
    img = cv2.imread('tensorboard.jpg')
    cv2.imshow('origin', img)
    
    # 多项式
    multinomial1 = tf.multinomial([[0.99], [0.2]], 10)
    multinomial2 = tf.multinomial([[0, 0.02, 0.99], [0, 0.99, 0.2]], 10)
    # r7 = tf.random_gamma([])
    
    with tf.Session() as sess:
        print(sess.run(r1))
        print(sess.run(r2))
        print(sess.run(r3))
        print(sess.run(r4))
        print(sess.run(r5))
        print(sess.run(multinomial1))
        print(sess.run(multinomial2))
    
        img_tf = tf.convert_to_tensor(img)
        distorted_image = tf.random_crop(img_tf, [300, 300, 3])
        img_np = distorted_image.eval()
        cv2.imshow('random', img_np)
        cv2.waitKey(0)
    

    里面的random_gamma没见过应用的场景,所以也没有细致的研究。

  • 相关阅读:
    MWC飞控增加声纳定高的方法(转)
    c语言字符串分割函数(转)
    移动端IM系统的协议选型:UDP还是TCP?(转)
    如何编写Linux设备驱动程序(转)
    TCP连接探测中的Keepalive和心跳包(转)
    为什么说基于TCP的移动端IM仍然需要心跳保活?(转)
    基于 FPGA 的图像边缘检测(转)
    NTC热敏电阻基础以及应用和选择(转)
    通用CRC32校验程序,可完美匹配STM32硬件CRC算法(转)
    MAX31855 热电偶至数字输出转换器
  • 原文地址:https://www.cnblogs.com/xing901022/p/10225325.html
Copyright © 2020-2023  润新知