1. 矩陣乘法
tf.matmul(a, b, transpose_a=false, transpose_b=false, adjoint_a=false, adjoint_b=false, a_is_sparse=false, b_is_sparse=false, name=none)
函式實現了數學上的矩陣乘法,最簡單的二維例子:
a = np.array([[
1,2]
,[3,
4]])
b = np.array([[
5,6]
,[7,
8]])
prod = tf.matmul(a, b)
out:
[[19 22]
[43 50]]
如果a, b都是3階及以上的張量,則倒數第三之前的維度都當做是矩陣的數量。如a.shape=[4, 2, 3],b.shape=[4, 3, 2],則可以看做是4個2×3維的矩陣分別和4個3×2維的矩陣相乘,得到4個2×2維的矩陣。
另外需要理解的是transpose
和adjoint
引數,前者表示矩陣相乘之前進行轉置操作,後者表示矩陣相乘之前進行共軛轉置操作,兩者不能同時設為true,否則報錯。
共軛轉置:
首先複習一下什麼是共軛複數:實部相同,虛部符號相反的複數,如2+3i
和2-3i
,共軛轉置就是先將矩陣裡每個元素進行共軛,然後再得到矩陣的轉置。
[ 2+
3i45
6−7i
]→[2
−3i5
46+7
i]\begin 2+3i & 4 \\ 5 & 6-7i \end \rightarrow \begin 2-3i & 5 \\ 4 & 6+7i \end
[2+3i5
46−
7i]
→[2−
3i4
56+7
i]對於實數矩陣,共軛轉置跟轉置其實是一樣的。
2. 掩碼
tf.sequence_mask(lengths, maxlen=none, dtype=tf.bool, name=none)
這個函式在表示句子長度時非常有用。
# ['ok'],
# ['i','love','you'],
# ['damn','it']]
tf.sequence_mask([1
,3,2
],5)
out:[[
true
,false
,false
,false
,false],
[true
,true
,true
,false
,false],
[true
,true
,false
,false
,false
]]
[1, 3, 2]表示有3個句子,第乙個句子有1個單詞,第二個有3,第三個有2。5表示句子最大長度為5。maxlen
可不設,預設是lengths
中的最大值。
tf.sequence_mask([[
1,3]
,[2,
0]])
out:[[
[true
,false
,false],
[true
,true
,true]]
,[[true
,true
,false],
[false
,false
,false]]
]
3. 切片tf.slice(input_, begin, size, name=none)
這個簡單,佔坑先。
tf.strided_slice(input_, begin, end, trides=none, begin_mask=0, end_mask=0, ellipsis_mask=0, new_axis_mask=0, shrink_axis_mask=0, var=none, name=none)
主要看3個引數即可:input_, begin, end
假設輸入為:
input = [[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]],
[[2, 3, 4],
[5, 6, 7],
[8, 9, 1]],
[[3, 4, 5],
[6, 7, 8],
[9, 1, 2]]]
以tf.strided_slice(input, [0, 0, 0], [3, 2, 2])
為例,表示的是,取第一維度[0, 3)索引、第二維度[0, 2)索引、第三維度[0,2)索引的資料,得到:
[[[1 2]
[4 5]]
[[2 3]
[5 6]]
[[3 4]
[6 7]]]
三個維度的區別:
strides引數表示步長,各個維度預設步長是1。以tf.strided_slice(input, [0, 0, 0], [3, 2, 2], [2, 1, 1])
為例,表示第一維度的步長是2,因此取到的是第0,2索引的資料,結果為:
[[[1 2]
[4 5]]
[[3 4]
[6 7]]]
softmaxtf.nn.softmax函式通常用於分類任務中計算概率。
例如乙個batch_size=5,3分類的資料,經過全連線網路後輸出為logits,然後經過softmax變換後:
log_softmax在softmax運算之後,加了乙個log運算,因為輸入都是 [0,1],所以輸出都是小數。
log_softmax通常用來計算多分類的交叉熵損失:
labels = tf.constant([2, 2, 0, 1, 0], dtype=tf.int32)
logits = tf.constant([[1, 3, 6], [2, 3, 5], [5, 2, 3], [3, 4, 3], [4, 2, 4]], dtype=tf.float32)
one_hot_labels = tf.one_hot(labels, depth=3, dtype=tf.float32)
log_probs = tf.nn.log_softmax(logits, axis=-1)
batch_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1)
loss = tf.reduce_mean(batch_loss)
另一種寫法:
labels = tf.constant([2, 2, 0, 1, 0], dtype=tf.int32)
logits = tf.constant([[1, 3, 6], [2, 3, 5], [5, 2, 3], [3, 4, 3], [4, 2, 4]], dtype=tf.float32)
one_hot_labels = tf.one_hot(labels, depth=3, dtype=tf.float32)
batch_loss = tf.nn.softmax_cross_entropy_with_logits_v2(labels=one_hot_labels, logits=logits)
loss = tf.reduce_mean(batch_loss)
Tensorflow2 0學習筆記 常用函式(一)
1.資料型別轉換函式 定義乙個張量 a tf.constant 0,1,2 3,4,5 6,7,8 dtype tf.int64 強制轉換型別函式 b tf.cast a,tf.float32 reduce max查詢張量中最大的數,axis x表示對對應的行或者列求和 本例中為二維張量,0對應的對...
tensorflow常用函式
1.variable 主要在於一些可訓練變數 trainable variables 比如模型的權重 weights 或者偏執值 bias 1 宣告時,必須提供初始值 2 在真實訓練時,其值是會改變的,自然事先需要指定初始值 weights tf.variable tf.random normal ...
TensorFlow常用函式
使用tensorflow計算流程 1 prepare train data 2 define model and graph 3 choose optimizer 4 create a session to run import tensorflow as tf 1.tf.reduce mean i...