在Tensorflow學(xué)習(xí)筆記(一)中间聊,我們介紹了tensorflow的主要思想攒盈,本節(jié)將介紹tensorflow關(guān)于矩陣的一些基本運算,他們是構(gòu)成圖的重要元素哎榴。
張量基本運算
- 加法運算
在tensorflow中使用加法可以運用重載的'+'和tf.add型豁,要求相加的兩個張量維度和數(shù)據(jù)類型是一致的(如果是矩陣加上標(biāo)量或者矩陣加上行數(shù)相等的行向量或者列數(shù)向量的列向量也是合法的)。下面例子說明'+'的默認(rèn)name是add尚蝌,tf.add的默認(rèn)name是Add迎变。
import tensorflow as tf
w1 = tf.Variable(tf.ones([2, 2]), name='w1')
w2 = tf.Variable(tf.ones([2, 2]), name='w2')
w3 = w1+w2
w4 = tf.add(w1, w2)
print(w3, w4)
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
print(w3.eval(), w4.eval())
>>Tensor("add:0", shape=(2, 2), dtype=float32) Tensor("Add:0", shape=(2, 2), dtype=float32)
[[2. 2.]
[2. 2.]] [[2. 2.]
[2. 2.]]
- 矩陣乘法
矩陣乘法要求相乘的兩個矩陣必須滿足維數(shù)要求,且均為2維矩陣飘言。值得注意的是衣形,如果是兩個向量相乘,必須指定shape = [1,n]這種形式姿鸿,否則shape=[n]會報錯谆吴。例如
w1 = tf.constant([1, 2], shape=[1, 2])
w1_p = tf.constant([1, 2])
w2 = tf.constant([2, 3], shape=[2, 1])
w2_p = tf.constant([1, 2])
# 以下OK
w3 = tf.matmul(w1, w2)
# 以下報錯>>Shape must be rank 2 but is rank 1 for 'MatMul_1' (op: 'MatMul') with input shapes: [2], [2].
w3_p = tf.matmul(w1_p, w2_p)
有的時候,為了使得矩陣維度相容苛预,張量可以reshape句狼,例如
import tensorflow as tf
w1_p = tf.reshape(tf.constant([3, 4]), [2, 1])
w2_p = tf.reshape(tf.constant([5, 6]), [1, 2])
w3_p = tf.matmul(w1_p, w2_p)
tf.InteractiveSession()
print(w3_p.eval())
>>[[15 18]
[20 24]]
另外一個重要的矩陣操作是轉(zhuǎn)置tf.transpose,其使用方法如下
import tensorflow as tf
w1 = tf.reshape(tf.constant([3, 4]), [2, 1])
w2 = tf.transpose(w1, perm=[1, 0])
tf.InteractiveSession()
print(w1.eval(), w2.eval())
>>[[3]
[4]] [[3 4]]
其中perm是定義的轉(zhuǎn)置之后各個軸的順序热某,對二維矩陣的轉(zhuǎn)置來說腻菇,perm默認(rèn)為[1, 0]。如果perm=[0,1]則transpose得到原矩陣苫拍。
- 元素乘法(點乘)
兩個矩陣元素相乘可以使用tf.multiply或者重載運算符“*”芜繁,兩者等價。調(diào)用方法如下:
import tensorflow as tf
w1 = (tf.constant([3, 4]))
w2 = (tf.constant([5, 6]))
tf.InteractiveSession()
print(tf.multiply(w1, w2).eval())
print((w1*w2).eval())
需要注意的一點是绒极,矩陣元素相乘要求兩個矩陣維度是相同的骏令,得到的結(jié)果是對應(yīng)的元素相乘。如果維度不同垄提,要注意以下特殊情況
- 矩陣點乘向量或者標(biāo)量榔袋,將會自動擴充向量或者標(biāo)量到與矩陣相同的維度再進行點乘。但要注意向量擴充的時候必須有一個軸的維度是一致的铡俐,例如階矩陣可以和階列向量點乘(階列向量會被擴展成階矩陣凰兑,且每列為原列向量),也可以和階行向量點乘审丘,但是階矩陣和階行向量點乘則會報錯吏够,因為其無法擴展成相同維度的矩陣。
- 對于兩個不同維度的向量,只允許行向量點乘列向量或者列向量點乘行向量锅知,不允許同為行向量相乘或者同為列向量相乘播急。階行向量點乘階將會得到階矩陣,即階行向量被展開成階矩陣(每行相同)售睹,階列向量被展開成階矩陣(每列相同)再點積桩警。
- 其他運算
tensorflow提供和numpy一樣豐富的矩陣及元素級計算API,包括基本四則運算昌妹、矩陣數(shù)學(xué)函數(shù)(如trace捶枢、求逆、svd分解等)飞崖、規(guī)約計算(reduction: 如reduce_sum(input_tensor, axis=none)烂叔、reduce_mean等)、累加累積計算固歪、切割操作運算长已、序列比較與索引提取操作,詳細(xì)可見運算API解析昼牛。 - 關(guān)系運算
比較兩個維度相同的矩陣,返回相同shape的邏輯矩陣康聂。如下例
w1 = tf.constant([1,2,3])
w2 = tf.constant([1,3,2])
tf.InteractiveSession()
print(tf.equal(w1, w2).eval())
>>[True False False]
print(tf.greater(w1, w2).eval())
>>[False False True]
print(tf.less(w1, w2).eval())
>>[False True False]
print(tf.greater_equal(w1, w2).eval())
>>[True False True]