一个热门表示给出索引的错误

时间:2017-06-03 11:14:19

标签: python numpy

我试图通过以下函数理解一个热表示。我已经打印了这个函数的每一行。但是我只在索引超出范围的最后一行收到错误。我无法理解原因。我该如何解决这个问题?

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

1 个答案:

答案 0 :(得分:0)

对于其他人,PO指的是Tensorflow使用MNIST数据的示例,请查看官方source code

labels_dense是一个numpy数组,它应该存储元素,其中每个元素都是类标识符(如0表示标记为“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的单元... phew ..

代码的其余部分非常简单,但我只是想添加更多中间步骤来展示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