前面介紹過了Tensorflow的基本概念,好比如何使用tensorboard查看計算圖。本篇則着重介紹和整理下Constant相關的內容。html
基於TensorFlow的深度學習系列教程 1——Hello World!dom
在tensorflow中,數據分爲幾種類型: 常量Constant、變量Variable、佔位符Placeholder。其中:函數
概念上跟spark的DAG圖差很少,不過圖的模式更固定一些,不像spark還分爲action和transform。學習
下面這個例子就是常量最簡單的使用例子了,定義a和b兩個常量,輸出x。x=a+b。this
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()
獲得的計算圖以下:
spa
選中constant能夠發現,它的值直接寫在定義裏面了。
設計
最經常使用的初始化方法,就是直接在聲明的時候賦予一個初始值,也能夠根於指定的shape進行0和1的填充code
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:orm
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)
另外一種經常使用的初始化方法就是指定隨機方法進行初始化。htm
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沒見過應用的場景,因此也沒有細緻的研究。