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

标签 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

你有一个想法。我有很多文本需要分类为规则。我开始采用的一种方法是使用数据的一种热编码形式作为规则分类。

这些是我遵循的步骤:

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()

到目前为止效果很好。我的问题是,当类(class)规模增长到 1000 个、一万个类(class)等时,这种方法是否有效。我是否仍然需要传递一个热编码向量作为实际分类?

还有其他方法吗?

最佳答案

1000 个(4000 个,如果考虑完整的 ILSVRC 数据集)类别的分类任务在图像识别 ( ILSVRC ) 中非常常见,并且事实证明,在足够的训练数据下,效果非常好。

即便如此,至少有一篇论文表明,使用相同模型设计的 ILSVRC 数据从 1K 类别到 4K 类别时,分类准确率明显下降(可能是 97% -> 95%)。

人脸识别研究provides an example增加类的数量(以及旁边的训练示例的数量)实际上会导致分类准确性的提高。他们在多达 10000 个不同的类别上进行了测试。

如果你的文章超过 10K,那么你就该写一篇自己的论文了。

One-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.]。即使分类精度没有提高,这也允许进行梯度更新(即训练分类误差小<1%,并且普通分类误差仅在 100 个或更少的示例中的 1 个示例上产生梯度)。

您始终可以应用更多的劳动力并对输入进行聚类,并为每个聚类训练分类器等等。它可能适合你,也可能不适合你。这是一个示例,其中类似的方法实际上提高了准确性 link 。但对于是否应该使训练复杂化,似乎没有达成共识。对于神经网络,最好将更多时间投入到模型设计而不是数据工程上,并尝试让网络为您处理一切。

关于machine-learning - 深度学习 - 如何为大型分类集准备训练数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46733863/

相关文章:

java - 使用 Alchemy 实体提取检索 JSON 输出

python - 如何更改 Pytorch 预训练模块中的激活层?

python - 训练的 Tensorflow CNN 回归 MSE 高于测试

python - 如何在 Keras 中重用 VGG19 进行图像分类?

python - 将 Scaler 与 LassoCV、RidgeCV 一起使用

java - Weka 的 PCA 运行时间太长

tensorflow - 将张量板直方图与 tf.contrib.layers 一起使用

python - 使用 TensorFlow Transform 创建序列示例

azure - 模块未找到错误: 'matplotlib_inline'

machine-learning - 如何使 RNN 单元的权重在 Tensorflow 中无法训练?