用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
