深度学习 - 如何为大型分类集准备训练数据?
Posted
技术标签:
【中文标题】深度学习 - 如何为大型分类集准备训练数据?【英文标题】:Deep Learning - How to prepare the training data for large classification set? 【发布时间】:2018-03-25 19:45:09 【问题描述】:所以我有大量的课程(现在说 500 个,随着时间的推移可能会增加)。这些类可以被认为是不同的领域特定规则。
每条规则都有与之相关的特定类型的测试。我的数据是这样的:
Some text regarding Rule 1 ------> Rule 1
Some other text for Rule 1 ------> Rule 1
Some other other text for Rule 1 -----> Rule 1
Text regarding Rule 2 ----> Rule 2
Some other text regarding Rule 2 ----> Rule 2
你有一个想法。我有很多文本需要分类到规则中。我开始使用的一种方法是使用one hot encoded form
的数据作为规则分类。
这些是我遵循的步骤:
1. Create a Lexicon with all my Rule texts.
2. Create an array of 0s(of size of lexicon) for each line of text and turn on the index when the word is in lexicon.
3. Create a one hot encoded array (size = length(Rules)) with the index corresponding to Rule set to 1.
4. Feed this data to TensorFlow.
5. Test it out. I get prediction vector of size = length(Rules),
which gives me 1 for the index corresponding to the Rule the text was classified
into. I used tf.argmax()
到目前为止效果很好。我的问题是,当班级规模增长到 1000、一万个班级等等时,这种方法是否有效。我还需要传递一个热编码向量作为实际分类吗?
还有其他方法吗?
【问题讨论】:
您打算在每次添加新类时从头开始重新训练模型,还是希望将已训练的模型“扩展”到新规则?因为这是 2 项完全不同的任务,而后一项研究较少 @yauheni_selivonchyk 每次添加新类时,我都可以从头开始重新训练模型(因为这将是一个不常见的操作) 【参考方案1】:1000(4000,如果您考虑完整的 ILSVRC 数据集)类的分类任务在图像识别中非常常见 (ILSVRC),并且在有足够的训练数据的情况下证明工作得很好。
即便如此,至少有一篇论文显示,在使用相同模型设计的 ILSVRC 数据上,分类准确度从 1K 类下降到 4K 类时明显下降(97% -> 95%,可能)。
人脸识别研究provides an example 增加类的数量(以及旁边的训练示例的数量)实际上会提高分类准确度。他们在多达 10000 个不同的类上对其进行了测试。
如果你的文章超过 10K,那将是你自己写一篇论文的时候了。
单热编码
下面的语法糖可能会帮助您避免手动构建 one-hot 向量,但本质上一个 hot 向量仍将作为交叉熵损失函数的输入存在。 语法糖:
tf.nn.sparse_softmax_cross_entropy_with_logits
或者
def to_one_hot(index, num_classes):
res = np.zeros(num_classes)
res[index] = 1
return res
在交叉熵损失中使用 One-hot 向量计算分类误差。使用稀疏向量的美妙之处在于,即使输出 [0.7, 0.1, 0.1, 0.1] -> 0 对训练示例进行了正确分类,它仍然允许使用向量 [1.0, 0., 0., 0.]。这允许即使在分类精度没有提高的情况下也可以进行梯度更新(即训练分类误差很小
您始终可以投入更多的精力,对输入进行聚类,并为每个聚类训练分类器,等等。它可能适合您,也可能不适合您。这是一个示例,其中类似方法实际上提高了准确性link。但是对于是否应该使训练复杂化似乎没有达成共识。对于神经网络,最好将更多时间投入到模型设计而不是数据工程上,并尝试让网络为您处理所有事情。
【讨论】:
我的问题更多,如何将训练分类传递给 tensorflow?目前,我传递了一个热编码向量,我手动构建了它。这是标准方式吗? @AgentX,是的,这是使用 NN 进行多类分类的标准方法。并且没有理由担心大量的课程。至少从技术角度来看,它应该可以轻松处理 100K+ 类。随意选择tf.nn.sparse_softmax_cross_entropy_with_logits
,因为@Maxim 建议让TF 为您处理。【参考方案2】:
还有其他方法吗?
是的,您可以使用稀疏表示。您的标签将是[0, num_classes-1]
范围内的整数,而不是单热向量,您需要应用tf.nn.sparse_softmax_cross_entropy_with_logits
损失函数。
【讨论】:
以上是关于深度学习 - 如何为大型分类集准备训练数据?的主要内容,如果未能解决你的问题,请参考以下文章
Java程序员学深度学习 DJL上手9 在CIFAR-10数据集使用风格迁移学习