TensorFlow筆記 常用運算函式解析

2021-08-13 17:25:39 字數 4501 閱讀 7963

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維的矩陣。

另外需要理解的是transposeadjoint引數,前者表示矩陣相乘之前進行轉置操作,後者表示矩陣相乘之前進行共軛轉置操作,兩者不能同時設為true,否則報錯。

共軛轉置:

首先複習一下什麼是共軛複數:實部相同,虛部符號相反的複數,如2+3i2-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...