2017-06-03 82 views
0

我想通過以下函數來理解一個熱表示。我已經打印了這個函數的每一行。但是,我只是在索引超出限制的最後一行發生錯誤。我無法理解原因。我該如何解決這個問題?給出錯誤的索引

def dense_to_one_hot(labels_dense, num_classes): 
    num_labels = labels_dense.shape[0] 
    index_offset = np.arange(num_labels) * num_classes 
    labels_one_hot = np.zeros((num_labels, num_classes)) 
    labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1 
    return labels_one_hot 

labels_dense = np.arange(475000) 
print labels_dense.shape 
num_classes=10 
num_labels = labels_dense.shape[0] 
print num_labels 
index_offset = np.arange(num_labels) * num_classes 
print index_offset 
print len(index_offset) 
print 'index offset is '+str(index_offset.shape) 
labels_one_hot = np.zeros((num_labels, num_classes)) 
print labels_one_hot.shape 
x= labels_dense.ravel() 
print x 
print x.shape 
plus= index_offset+x 
print plus 
print plus.shape 
labels_one_hot.flat[plus]=1 

回答

0

對於其他情況下,PO指的是從一個Tensorflow的例子有MNIST數據時,檢查出的官方source code

labels_dense是一個numpy數組,應該存儲元素,其中每個元素都是類標識符(如0表示標記爲「零」的圖像,9表示標記爲「9」的圖像)。

這是默認的測試數據標籤看起來怎麼樣:

In [20]: labels # same as labels_dense 
Out[20]: array([7, 2, 1, ..., 4, 5, 6], dtype=uint8) 

在自己的代碼,你在正確的大小產生labels_dense,但走錯了路:

In [34]: labels_dense 
Out[34]: array([ 0, 1, 2, ..., 474997, 474998, 474999]) 

你明白嗎?我很高興你的代碼沒有工作,否則,它可能會創建一個0.5M * 0.5 M〜50B的單元...唷..

其餘的代碼很簡單,但我只是想添加更多一點介紹labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1如何工作的中間步驟。另外,我不建議使用475K記錄,而是建議使用3條記錄來證明這個想法。

In [35]: labels_dense = labels[:3] 
In [36]: labels_dense 
Out[36]: array([7, 2, 1], dtype=uint8) 
In [37]: num_classes = 10 
In [38]: num_labels = labels_dense.shape[0] 
In [39]: index_offset = np.arange(num_labels) * num_classes 
In [40]: index_offset 
Out[40]: array([ 0, 10, 20]) 
In [41]: labels_one_hot = np.zeros((num_labels, num_classes)) 
In [42]: labels_one_hot 
Out[42]: 
array([[ 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., 0., 0., 0.]]) 
In [43]: index_offset + labels_dense.ravel() 
Out[43]: array([ 7, 12, 21]) 
In [44]: labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1 
In [45]: labels_one_hot 
Out[45]: 
array([[ 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.]]) 

而且,在這個階段,您的代碼無關Tensorflow可言,如果你用的標籤或numpy的甚至Python的一般你的問題,你會得到幫助更快,可能會更好。

參考:flatravelarangezeros

+0

謝謝你這麼多這麼詳細的解釋。現在我得到了代碼中的錯誤,這就是爲什麼我的算法在訓練和測試測試中效率低下的原因。你能解釋一下如何將我的label_dense [0,1,... 474999]轉換成你提到的標籤合成文件。在我的代碼中,我開始從1 uptil 24開始標記,但是當我將數據同時洗牌和標籤時。我把他們的行索引換成sample.shape [0],這就是我得到錯誤的原因。 –

+0

@ R.ali,我不認爲我明白你想要什麼。 「我如何將我的label_dense轉換爲您提到的標籤格式?」 –

+0

行= sample.shape [0] 標記= np.array([在範圍1對於i(行)]) 爲i的範圍(1100): \t k4_label = i + 1的 \t label_file = np.array ([k4_label for i in range(row)]) \t label = np.append(label,label_file,axis = 0)sample.shape [0] == label.shape [0] shuffled_sample.shape [0] = = shuffled_label.shape [0] –