標籤:numpy imp print highlight 推導 lob img ESS put
張量操作
在tensorflow中,有很多操作張量的函數,有產生張量、建立隨機張量、張量類型與形狀變換和張量的切片與運算
產生張量固定值張量
tf.zeros(shape, dtype=tf.float32, name=None)
建立所有元素設定為零的張量。此操作返回一個dtype具有形狀shape和所有元素設定為零的類型的張量。
tf.zeros_like(tensor, dtype=None, name=None)
給tensor定單張量(),此操作返回tensor與所有元素設定為零相同的類型和形狀的張量。
tf.ones(shape, dtype=tf.float32, name=None)
建立一個所有元素設定為1的張量。此操作返回一個類型的張量,dtype形狀shape和所有元素設定為1。
tf.ones_like(tensor, dtype=None, name=None)
給tensor定單張量(),此操作返回tensor與所有元素設定為1 相同的類型和形狀的張量。
tf.fill(dims, value, name=None)
建立一個填充了標量值的張量。此操作建立一個張量的形狀dims並填充它value。
tf.constant(value, dtype=None, shape=None, name=‘Const‘)
建立一個常數張量。
用常數張量作為例子
t1 = tf.constant([1, 2, 3, 4, 5, 6, 7])t2 = tf.constant(-1.0, shape=[2, 3])print(t1,t2)
我們可以看到在沒有啟動並執行時候,輸出值為:
(<tf.Tensor ‘Const:0‘ shape=(7,) dtype=int32>, <tf.Tensor ‘Const_1:0‘ shape=(2, 3) dtype=float32>)
一個張量包含了一下幾個資訊
- 一個名字,它用於索引值對的儲存,用於後續的檢索:Const: 0
- 一個形狀描述, 描述資料的每一維度元素個數:(2,3)
- 資料類型,比如int32,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, 標準差 1normal = 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)
- tf.to_double(x, name=‘ToDouble‘)
- tf.to_float(x, name=‘ToFloat‘)
- tf.to_bfloat16(x, name=‘ToBFloat16‘)
- tf.to_int32(x, name=‘ToInt32‘)
- tf.to_int64(x, name=‘ToInt64‘)
- tf.cast(x, dtype, name=None)
我們用一個其中一個舉例子
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 resultsess.close()
形狀和變換
可用於確定張量的形狀並更改張量的形狀
- tf.shape(input, name=None)
- tf.size(input, name=None)
- tf.rank(input, name=None)
- tf.reshape(tensor, shape, name=None)
- tf.squeeze(input, squeeze_dims=None, name=None)
- tf.expand_dims(input, dim, name=None)
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 tfsess = 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_1print 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 tfimport numpy as npsess = 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提供了幾個操作來切片或提取張量的部分,或者將多個張量加在一起
- tf.slice(input_, begin, size, name=None)
- tf.split(split_dim, num_split, value, name=‘split‘)
- tf.tile(input, multiples, name=None)
- tf.pad(input, paddings, name=None)
- tf.concat(concat_dim, values, name=‘concat‘)
- tf.pack(values, name=‘pack‘)
- tf.unpack(value, num=None, name=‘unpack‘)
- tf.reverse_sequence(input, seq_lengths, seq_dim, name=None)
- tf.reverse(tensor, dims, name=None)
- tf.transpose(a, perm=None, name=‘transpose‘)
- tf.gather(params, indices, name=None)
- tf.dynamic_partition(data, partitions, num_partitions, name=None)
- tf.dynamic_stitch(indices, data, name=None)
其它一些張量運算(瞭解查閱)張量複製與組合
- tf.identity(input, name=None)
- tf.tuple(tensors, name=None, control_inputs=None)
- tf.group(inputs, *kwargs)
- tf.no_op(name=None)
- tf.count_up_to(ref, limit, name=None)
邏輯運算子
- tf.logical_and(x, y, name=None)
- tf.logical_not(x, name=None)
- tf.logical_or(x, y, name=None)
- tf.logical_xor(x, y, name=‘LogicalXor‘)
比較子
- tf.equal(x, y, name=None)
- tf.not_equal(x, y, name=None)
- tf.less(x, y, name=None)
- tf.less_equal(x, y, name=None)
- tf.greater(x, y, name=None)
- tf.greater_equal(x, y, name=None)
- tf.select(condition, t, e, name=None)
- tf.where(input, name=None)
判斷檢查
- tf.is_finite(x, name=None)
- tf.is_inf(x, name=None)
- tf.is_nan(x, name=None)
- tf.verify_tensor_all_finite(t, msg, name=None) 斷言張量不包含任何NaN或Inf
- tf.check_numerics(tensor, message, name=None)
- tf.add_check_numerics_ops()
- tf.Assert(condition, data, summarize=None, name=None)
- tf.Print(input_, data, message=None, first_n=None, summarize=None, name=None)
TensorFlow進階(二)