在 Tensorflow 中为 cifar 的子类训练神经网络:地图标签

Train a NN for a subclass of cifar in Tensorflow : map labels

我选择了 cifar100 的一个子类,仅包含 100 个中的 20 个 classes.When 我尝试构建一个具有 20 个输出的 NN 我收到此错误:

我的 20 个标签的值在 [0-100] 范围内,但我最后只需要 20 个神经元 layer.When 我让最后一层有 100 个神经元 我可以训练我的模型,但准确度很低.

我想将范围 (100) 中的数字映射为范围 (20),以便 NN 接受它们。 提前谢谢你。

我想你可能想做这样的事情(这将在你将 data/labels 提供给网络之前作为预处理步骤完成):

# dummy array/labels
arr = [1, 3, 6, 8, 10, 4, 7, 15, 25, 19]
print('original array =', arr)

# create mapping (range(20) in your case)
mapping = dict(zip(set(arr), range(10)))
print('mapping =', mapping)

# apply the mapping
new_arr = list(map(lambda x: mapping[x], arr))
print('new array =', new_arr)

# >> output:
# original array = [1, 3, 6, 8, 10, 4, 7, 15, 25, 19]
# mapping = {1: 0, 3: 1, 4: 2, 6: 3, 7: 4, 8: 5, 10: 6, 15: 7, 19: 8, 25: 9}
# new array = [0, 1, 3, 5, 6, 2, 4, 7, 9, 8]

所以基本上你的原始标签(即 len(set(labels)) = 20 但值 > 20,如果我理解正确的话)被映射到尽可能小的值,以便它可以与你的损失函数。如果您需要将标签映射回原始值,最好保留映射以备后用。