天天看點

用python實作one-hot編碼

失敗不可怕,怕的是偶然的成功。碼代碼跑實驗談戀愛找工作莫不如此。 之前用TensorFlow 跑了I3D的模型,很順利。Loss完美下降,視訊資料讀入也沒遇到大問題。 偶然的成功,讓我以為tensorflow So-easy嘛。

現在自己想做點東西,才發現有些坑你沒遇到是因為你做的太少太簡單Too young, Too simple.

tensorflow 封裝的函數tf.one_hot():

import tensorflow as tf
import numpy as np
z=np.random.randint(0,10,size=[10])
y=tf.one_hot(z,10,on_value=1,off_value=None,axis=0)
with tf.Session()as sess:
    print(z)
    print(sess.run(y))
[5 7 7 0 5 5 2 0 0 0]
[[0 0 0 1 0 0 0 1 1 1]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 1 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [1 0 0 0 1 1 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 1 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]]
           

瞅上去很完美,但是,tf.one_hot()會讓你的graph動态增添節點,可能導緻的後果就是記憶體洩露,模型越來越慢.....

是以當你發現模型占用記憶體越來越大,然後執行以下操作tf.get_default_graph().finalize()  報錯的時候

就應該考慮自己實作one-hot()功能了。

def one_hot ( labels , Label_class ): one_hot_label = np.array([[ int (i == int (labels[j])) for i in range (Label_class)] for j in range ( len (labels))]) return one_hot_label

舉例:

import numpy as np
def one_hot(labels,Label_class):
    one_hot_label = np.array([[int(i == int(labels[j])) for i in range(Label_class)] for j in range(len(labels))])   
    return one_hot_label

y = [2,5,6,7,8]
Label_class = 20
print one_hot(y,Label_class)
[[0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]]
           

繼續閱讀