TensorFlow、把數字標簽轉化成onehot標簽


用sklearn 最方便:

 

 

 

在MNIST手寫字數據集中,我們導入的數據和標簽都是預先處理好的,但是在實際的訓練中,數據和標簽往往需要自己進行處理。

以手寫數字識別為例,我們需要將0-9共十個數字標簽轉化成onehot標簽。例如:數字標簽“6”轉化為onehot標簽就是[0,0,0,0,0,0,1,0,0,0].

首先獲取需要處理的標簽的個數:

batch_size = tf.size(labels)
1
假設輸入了6張手寫字圖片,那么對應的標簽數為6,batch_size=6.

tf.size(input) 函數為獲取輸入tensor的元素數量。

例:設 t = [[1,2],[3,4]],則 tf.size(t) 的結果為4。

然后我們知道onehot標簽的shape為[batch_size,10],采用稀疏編碼的方法,在onehot標簽中選擇能夠代表標簽的位置,將其置為1,其余位置置為0。因此要選擇onehot中需要置為1的位置的坐標。

labels = tf.expand_dims(labels, 1)
indices = tf.expand_dims(tf.range(0, batch_size, 1), 1)
concated = tf.concat([indices, labels],1)

  

這里得到的concated就是所要置為1 的位置的坐標了。

tf.expand_dims(input, axis=None)函數表示給定輸入tensor,在輸入shape的維度索引軸axis處插入為1的尺寸。 尺寸索引軸從0開始; 如果axis為負數,則從后向前計數。列表內容

例:
t2是shape為[2,3,5]的一個tensor,則:

shape(expand_dims(t2, 0)) ==> [1, 2, 3, 5]
shape(expand_dims(t2, 2)) ==> [2, 3, 1, 5]
shape(expand_dims(t2, 3)) ==> [2, 3, 5, 1]
shape(expand_dims(t2, -1)) ==> [2, 3, 5, 1]

 

tf.range(start, limit, delta=1)函數是用來生成tensor等差序列,序列在start到limit之間(包含start不包含limit),步長為dalta。

tf.concat(values,concat_dim )函數用來連接兩個tensor。老版本的是concat_dim參數在前,values參數在后。

參數:

values:表示兩個或者一組待連接的tensor.
concat_dim:表示在哪一維上連接,必須是一個數.

如果concat_dim=0,表示在第一個維度上連,相當於疊放到列上;如果concat_dim是1,表示在第二個維度上連。

例:

t1 = [[1, 2, 3], [4, 5, 6]] 
t2 = [[7, 8, 9], [10, 11, 12]] 
tf.concat(0, [t1, t2]) == > [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] 
tf.concat(1, [t1, t2]) ==> [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]

 

這里要注意的是,如果values是兩個向量,它們是無法調用tf.concat()函數來進行連接的,因為向量對應的shape只有一個維度,不能在第二維上連了。雖然實際中兩個向量可以在行上相連,但是放在程序里是會報錯的。

如果要連接兩個向量,必須要調用tf.expand_dims()函數來擴維,這也就是在調用tf.concat()函數前先調用tf.expand_dims()函數的原因。

最后,將坐標給定的位置置為1,其余位置置為0,生成onehot標簽。

onehot_labels = tf.sparse_to_dense(concated, tf.stack([batch_size, 10]), 1.0, 0.0)

 

輸出了一個對應標簽位為1,其余位為0的,shape為[batch_size,10]的onehot標簽。

tf.sparse_to_dense(sparse_indices, output_shape, sparse_values, default_value)可以用來生成稀疏矩陣。

參數:

sparse_indices:稀疏矩陣中那些個別元素對應的索引值。

有三種情況:
sparse_indices是個數,那么它只能指定一維矩陣的某一個元素.
sparse_indices是個向量,那么它可以指定一維矩陣的多個元素.
sparse_indices是個矩陣,那么它可以指定二維矩陣的多個元素.

output_shape:輸出的稀疏矩陣的shape.

sparse_values:個別元素的值,即第一個參數選中的位置的值.

分為兩種情況:
sparse_values是個數,那么所有索引指定的位置都用這個數.
sparse_values是個向量,那么輸出矩陣的某一行向量里某一行對應的數(因此這里向量的長度應該和輸出矩陣的行數應該對應,不然會報錯).

default_value:未指定元素的默認值,如果是稀疏矩陣,則應該為0.

tf.stack(values, axis=0)函數將一系列rank-R的tensor打包為一個rank-(R+1)的tensor,老版本里用的是tf.ack()函數。

例:

x = [1,4]
y = [2,5]
z = [3,6]
tf.stack([x, y, z]) => [[1, 4], [2, 5], [3, 6]] 
# 沿着第一維stack
tf.stack([x, y, z], axis=1) => [[1, 2, 3], [4, 5, 6]]

 

舉個栗子可以更直觀的理解這段代碼:
假設一個batch有5個樣本,其label分別為1,3,5,7,9,則

import tensorflow as tf
sess = tf.Session()
labels = [1,3,5,7,9]
batch_size = tf.size(labels)
labels = tf.expand_dims(labels, 1)
indices = tf.expand_dims(tf.range(0, batch_size, 1), 1)
concated = tf.concat([indices, labels],1)
onehot_labels = tf.sparse_to_dense(concated, tf.stack([batch_size, 10]), 1.0, 0.0)

采用sess.run()函數來查看每一個函數的輸出,結果為:

 

 


————————————————
原文鏈接:https://blog.csdn.net/a_yangfh/article/details/77911126


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM