1. 程式人生 > >基於TensorFlow的深度學習系列教程 2——常量Constant

基於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沒見過應用的場景,所以也沒有細緻的研究。