一个热表示索引错误



我试图通过以下功能理解一个热表示。我已经打印了此功能的每一行。但是我只在索引不限制的最后一行中遇到错误。我无法理解原因。如何解决此问题?

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

对于其他人,PO指的是tensorflow使用MNIST数据的示例,请查看官方源代码。

labels_dense是一个numpy数组,应该存储每个元素,每个元素是类标识符(例如0表示标记为"零"的图像,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牢房... ph ..

该代码的其余部分非常简单,但我只想添加一些中间步骤来显示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标记问题,您将获得更快甚至更好的帮助。

参考:扁平,ravel,arange,zeros

最新更新