在张量流代码中将标量标记为一个热点?
Posted
技术标签:
【中文标题】在张量流代码中将标量标记为一个热点?【英文标题】:Label scalar into one hot in Tensorr flow code? 【发布时间】:2017-09-18 12:12:17 【问题描述】:有人可以指导我从标量转换为热值是什么意思吗? labels_dense.shape[0]
的目的是什么,最后为什么标签一 hot.flat 等于一?
def dense_to_one_hot(labels_dense, num_classes=10):
"""Convert class labels from scalars to one-hot vectors"""
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
【问题讨论】:
【参考方案1】:我认为您可能会发现以下描述机器学习中一种热编码如何工作的答案很有帮助: One Hot Encoding for Machine learning
【讨论】:
【参考方案2】:我遇到了同样的function 并写了一个更简单的理解。我使用的数字 0 到 4 代表 5 个类别。
labels_dense.shape[0] 的作用是什么?
在这个例子中它返回标签的数量是'10'。
这段代码是什么意思?
labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
如您在输出中看到的那样,将“1”放在正确的位置是符合逻辑的。它只是从整个 one-hot 表示的开头计算位置。
因此,要将数字“0”表示为 one-hot 向量,第 45 位应为“1”。这对应于最后一个向量的第 0 个元素。
所以
[1. 0. 0. 0. 0.]
当我们有 5 个类时,是数字“0”的 one-hot 表示。
def onehot():
labels_dense = numpy.array([1,2,3,4,3,4,3,2,1,0])
print('Shape of labels_dense is ' + str(labels_dense.shape))
index_offset = numpy.arange(10) * 5
print('Index offset is \n' + str(index_offset))
labels_one_hot = numpy.zeros((10, 5))
print('index_offset + labels_dense.ravel() is\n' + str(index_offset + labels_dense.ravel()))
labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
print('One-hot labels are ' + str(labels_one_hot))
输出是这样的。
Shape of labels_dense is (10,)
Index offset is
[ 0 5 10 15 20 25 30 35 40 45]
index_offset + labels_dense.ravel() is
[ 1 7 13 19 23 29 33 37 41 45]
One-hot labels are
[[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 1. 0.]
[0. 0. 1. 0. 0.]
[0. 1. 0. 0. 0.]
[1. 0. 0. 0. 0.]]
【讨论】:
以上是关于在张量流代码中将标量标记为一个热点?的主要内容,如果未能解决你的问题,请参考以下文章
在张量流中将 SSD 转换为冻结图。必须使用哪些输出节点名称?
无法将列表转换为数组:ValueError:只有一个元素张量可以转换为 Python 标量