深度学习 - 如何为大型分类集准备训练数据?

时间:2017-10-13 16:02:47

标签: machine-learning tensorflow deep-learning classification text-classification

所以我有一大组课程(现在说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 个答案:

答案 0 :(得分:1)

  

有替代方法吗?

是的,您可以使用稀疏表示。您的标签将是[0, num_classes-1]范围内的整数,而不是单热矢量,您需要应用tf.nn.sparse_softmax_cross_entropy_with_logits损失函数。

答案 1 :(得分:1)

分类任务1000(4000,如果你考虑完整的ILSVRC数据集)类在图像识别(ILSVRC)中很常见,并且在给定足够的训练数据的情况下证明工作得很好。

即便如此,至少有一篇论文显示,使用相同的模型设计,ILSVRC数据的分类准确度从1K降至4K类,显着(97% - > 95%)可能会降低。

面部识别研究provides an example,其中增加课程数量(以及训练样本的数量)实际上会导致分类准确性的提高。他们在多达10000个不同的类上测试它。

如果你超过10K,你就可以写一篇自己的论文了。

单热编码

下面的句法糖可能会帮助您避免手工构建单热矢量,但基本上一个热矢量仍然存在作为交叉熵损失函数的输入。 句法糖:

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

单热矢量用于交叉熵损失来计算分类误差。使用稀疏矢量的美妙之处在于即使训练示例已通过输出[0.7,0.1,0.1,0.1]正确分类 - > 0它仍然允许用向量[1.0,0,0,0,0]产生交叉熵误差。这允许即使在分类精度没有提高的情况下也具有梯度更新(即,训练分类误差小<1%并且普通分类误差仅在100个或更少的1个示例中产生梯度)。

您始终可以应用更多人工并执行输入群集,并为每个群集训练分类器,而不是。它可能适用于您,也可能不适合您。这是一个相似的方法实际上提高了准确度link的例子。但是,你是否应该使你的训练复杂化似乎没有共识。使用神经网络,最好将更多时间投入到模型设计而不是数据工程上,并尝试让网络为您处理所有事情。