在tensorflow中,有不少操做張量的函數,有生成張量、建立隨機張量、張量類型與形狀變換和張量的切片與運算python
tf.zeros(shape, dtype=tf.float32, name=None)
建立全部元素設置爲零的張量。此操做返回一個dtype具備形狀shape和全部元素設置爲零的類型的張量。less
tf.zeros_like(tensor, dtype=None, name=None)
給tensor定單張量(),此操做返回tensor與全部元素設置爲零相同的類型和形狀的張量。dom
tf.ones(shape, dtype=tf.float32, name=None)
建立一個全部元素設置爲1的張量。此操做返回一個類型的張量,dtype形狀shape和全部元素設置爲1。ide
tf.ones_like(tensor, dtype=None, name=None)
給tensor定單張量(),此操做返回tensor與全部元素設置爲1 相同的類型和形狀的張量。函數
tf.fill(dims, value, name=None)
建立一個填充了標量值的張量。此操做建立一個張量的形狀dims並填充它value。spa
tf.constant(value, dtype=None, shape=None, name='Const')
建立一個常數張量。code
用常數張量做爲例子orm
t1 = tf.constant([1, 2, 3, 4, 5, 6, 7]) t2 = tf.constant(-1.0, shape=[2, 3]) print(t1,t2)
咱們能夠看到在沒有運行的時候,輸出值爲:blog
(<tf.Tensor 'Const:0' shape=(7,) dtype=int32>, <tf.Tensor 'Const_1:0' shape=(2, 3) dtype=float32>)
一個張量包含了一下幾個信息遊戲
通常咱們常常使用的隨機數函數 Math.random() 產生的是服從均勻分佈的隨機數,可以模擬等機率出現的狀況,例如 扔一個骰子,1到6點的機率應該相等,但現實生活中更多的隨機現象是符合正態分佈的,例如20歲成年人的體重分佈等。
假如咱們在製做一個遊戲,要隨機設定許許多多 NPC 的身高,若是還用Math.random(),生成從140 到 220 之間的數字,就會發現每一個身高段的人數是同樣多的,這是比較無趣的,這樣的世界也與咱們習慣不一樣,現實應該是特別高和特別矮的都不多,處於中間的人數最多,這就要求隨機函數符合正態分佈。
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
從截斷的正態分佈中輸出隨機值,和 tf.random_normal() 同樣,可是全部數字都不超過兩個標準差
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
從正態分佈中輸出隨機值,由隨機正態分佈的數字組成的矩陣
# 正態分佈的 4X4X4 三維矩陣,平均值 0, 標準差 1 normal = tf.truncated_normal([4, 4, 4], mean=0.0, stddev=1.0) a = tf.Variable(tf.random_normal([2,2],seed=1)) b = tf.Variable(tf.truncated_normal([2,2],seed=2)) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) print(sess.run(a)) print(sess.run(b)) 輸出: [[-0.81131822 1.48459876] [ 0.06532937 -2.44270396]] [[-0.85811085 -0.19662298] [ 0.13895047 -1.22127688]]
tf.random_uniform(shape, minval=0.0, maxval=1.0, dtype=tf.float32, seed=None, name=None)
從均勻分佈輸出隨機值。生成的值遵循該範圍內的均勻分佈 [minval, maxval)。下限minval包含在範圍內,而maxval排除上限。
a = tf.random_uniform([2,3],1,10) with tf.Session() as sess: print(sess.run(a))
tf.random_shuffle(value, seed=None, name=None)
沿其第一維度隨機打亂
tf.set_random_seed(seed)
設置圖級隨機種子
要跨會話生成不一樣的序列,既不設置圖級別也不設置op級別的種子:
a = tf.random_uniform([1]) b = tf.random_normal([1]) print "Session 1" with tf.Session() as sess1: print sess1.run(a) print sess1.run(a) print sess1.run(b) print sess1.run(b) print "Session 2" with tf.Session() as sess2: print sess2.run(a) print sess2.run(a) print sess2.run(b) print sess2.run(b)
要爲跨會話生成一個可操做的序列,請爲op設置種子:
a = tf.random_uniform([1], seed=1) b = tf.random_normal([1]) print "Session 1" with tf.Session() as sess1: print sess1.run(a) print sess1.run(a) print sess1.run(b) print sess1.run(b) print "Session 2" with tf.Session() as sess2: print sess2.run(a) print sess2.run(a) print sess2.run(b) print sess2.run(b)
爲了使全部op產生的隨機序列在會話之間是可重複的,設置一個圖級別的種子:
tf.set_random_seed(1234) a = tf.random_uniform([1]) b = tf.random_normal([1]) print "Session 1" with tf.Session() as sess1: print sess1.run(a) print sess1.run(a) print sess1.run(b) print sess1.run(b) print "Session 2" with tf.Session() as sess2: print sess2.run(a) print sess2.run(a) print sess2.run(b) print sess2.run(b)
咱們能夠看到結果
TensorFlow提供了幾種操做,您能夠使用它們在圖形中改變張量數據類型。
提供了以下一些改變張量中數值類型的函數
咱們用一個其中一個舉例子
tf.string_to_number(string_tensor, out_type=None, name=None)
將輸入Tensor中的每一個字符串轉換爲指定的數字類型。注意,int32溢出致使錯誤,而浮點溢出致使舍入值
n1 = tf.constant(["1234","6789"]) n2 = tf.string_to_number(n1,out_type=tf.types.float32) sess = tf.Session() result = sess.run(n2) print result sess.close()
可用於肯定張量的形狀並更改張量的形狀
tf.shape(input, name=None)
返回張量的形狀。
t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]])
shape(t) -> [2, 2, 3]
靜態形狀與動態形狀
靜態維度 是指當你在建立一個張量或者由操做推導出一個張量時,這個張量的維度是肯定的。它是一個元祖或者列表。TensorFlow將盡最大努力去猜想不一樣張量的形狀(在不一樣操做之間),可是它不會老是可以作到這一點。特別是若是您開始用未知維度定義的佔位符執行操做。tf.Tensor.get_shape方法讀取靜態形狀
t = tf.placeholder(tf.float32,[None,2]) print(t.get_shape())
結果
動態形狀 當你在運行你的圖時,動態形狀纔是真正用到的。這種形狀是一種描述原始張量在執行過程當中的一種張量。若是你定義了一個沒有標明具體維度的佔位符,即用None表示維度,那麼當你將值輸入到佔位符時,這些無維度就是一個具體的值,而且任何一個依賴這個佔位符的變量,都將使用這個值。tf.shape來描述動態形狀
t = tf.placeholder(tf.float32,[None,2]) print(tf.shape(t))
tf.squeeze(input, squeeze_dims=None, name=None)
這個函數的做用是將input中維度是1的那一維去掉。可是若是你不想把維度是1的所有去掉,那麼你能夠使用squeeze_dims參數,來指定須要去掉的位置。
import tensorflow as tf sess = tf.Session() data = tf.constant([[1, 2, 1], [3, 1, 1]]) print sess.run(tf.shape(data)) d_1 = tf.expand_dims(data, 0) d_1 = tf.expand_dims(d_1, 2) d_1 = tf.expand_dims(d_1, -1) d_1 = tf.expand_dims(d_1, -1) print sess.run(tf.shape(d_1)) d_2 = d_1 print sess.run(tf.shape(tf.squeeze(d_1))) print sess.run(tf.shape(tf.squeeze(d_2, [2, 4])))
tf.expand_dims(input, dim, name=None)
該函數做用與squeeze相反,添加一個指定維度
import tensorflow as tf import numpy as np sess = tf.Session() data = tf.constant([[1, 2, 1], [3, 1, 1]]) print sess.run(tf.shape(data)) d_1 = tf.expand_dims(data, 0) print sess.run(tf.shape(d_1)) d_1 = tf.expand_dims(d_1, 2) print sess.run(tf.shape(d_1)) d_1 = tf.expand_dims(d_1, -1) print sess.run(tf.shape(d_1))
TensorFlow提供了幾個操做來切片或提取張量的部分,或者將多個張量加在一塊兒