1. 程式人生 > 程式設計 >深入理解Tensorflow中的masking和padding

深入理解Tensorflow中的masking和padding

TensorFlow是一個採用資料流圖(data flow graphs),用於數值計算的開源軟體庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯絡的多維資料陣列,即張量(tensor)。它靈活的架構讓你可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GPU),伺服器,移動裝置等等。TensorFlow 最初由Google大腦小組(隸屬於Google機器智慧研究機構)的研究員和工程師們開發出來,用於機器學習和深度神經網路方面的研究,但這個系統的通用性使其也可廣泛用於其他計算領域。

宣告:

需要讀者對tensorflow和深度學習有一定了解

tf.boolean_mask

實現類似numpy陣列的mask操作

Python的numpy array可以使用boolean型別的陣列作為索引,獲得numpy array中對應boolean值為True的項。示例如下:

# numpy array中的boolean mask
import numpy as np
target_arr = np.arange(5)
print "numpy array before being masked:"
print target_arr
mask_arr = [True,False,True,False]
masked_arr = target_arr[mask_arr]
print "numpy array after being masked:"
print masked_arr

執行結果如下:

numpy array before being masked: [0 1 2 3 4] numpy array after being masked: [0 2]

tf.boolean_maks對目標tensor實現同上述numpy array一樣的mask操作,該函式的引數也比較簡單,如下所示:

tf.boolean_mask(
 tensor,# target tensor
 mask,# mask tensor
 axis=None,name='boolean_mask'
)

下面,我們來嘗試一下tf.boolean_mask函式,示例如下:

import tensorflow as tf
# tensorflow中的boolean mask
target_tensor = tf.constant([[1,2],[3,4],[5,6]])
mask_tensor = tf.constant([True,True])
masked_tensor = tf.boolean_mask(target_tensor,mask_tensor,axis=0)
sess = tf.InteractiveSession()
print masked_tensor.eval()

mask tensor中的第0和第2個元素是True,mask axis是第0維,也就是我們只選擇了target tensor的第0行和第1行。

[[1 2] [5 6]]

如果把mask tensor也換成2維的tensor會怎樣呢?

mask_tensor2 = tf.constant([[True,False],[False,[True,False]])
masked_tensor2 = tf.boolean_mask(target_tensor,axis=0)
print masked_tensor2.eval()

[[1 2] [5 6]]

我們發現,結果不是[[1],[5]]。tf.boolean_mask不做元素維度的mask,tersorflow中有tf.ragged.boolean_mask實現元素維度的mask。

tf.ragged.boolean_mask
tf.ragged.boolean_mask(
 data,mask,name=None
)

tensorflow中的sparse向量和sparse mask tensorflow中的sparse tensor由三部分組成,分別是indices、values、dense_shape。對於稀疏張量SparseTensor(indices=[[0,0],[1,2]],values=[1,dense_shape=[3,4]),轉化成dense tensor的值為:

[[1,0] [0,2,0]]

使用tf.sparse.mask可以對sparse tensor執行mask操作。

tf.sparse.mask(
 a,mask_indices,name=None
)

上文定義的sparse tensor有1和2兩個值,對應的indices為[[0,2]],執行tf.sparsse.mask(a,[[1,2]])後,稀疏向量轉化成dense的值為:

[[1,0]]

由於tf.sparse中的大多數函式都只在tensorflow2.0版本中有,所以沒有例項演示。

padded_batch

tf.Dataset中的padded_batch函式,根據輸入序列中的最大長度,自動的pad一個batch的序列。

padded_batch(
 batch_size,padded_shapes,padding_values=None,drop_remainder=False
)

這個函式與tf.Dataset中的batch函式對應,都是基於dataset構造batch,但是batch函式需要dataset中的所有樣本形狀相同,而padded_batch可以將不同形狀的樣本在構造batch時padding成一樣的形狀。

elements = [[1,4,5],[6,7],[8]] 
A = tf.data.Dataset.from_generator(lambda: iter(elements),tf.int32) 
B = A.padded_batch(2,padded_shapes=[None]) 
B_iter = B.make_one_shot_iterator()
print B_iter.get_next().eval()

[[1 2 0] [3 4 5]]

總結

到此這篇關於深入理解Tensorflow中的masking和padding的文章就介紹到這了,更多相關Tensorflow中的masking和padding內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!