【问题标题】:Ignore padding class (0) during multi class classification在多类分类期间忽略填充类 (0)
【发布时间】:2020-11-13 10:38:55
【问题描述】:

我有一个问题,给定一组标记,预测另一个标记。对于这个任务,我使用带有Vocab-size + 1 的嵌入层作为input_size+1 是因为序列用零填充。例如。给定 Vocab-size 的 10 000 和 max_sequence_len=6x_train 看起来像:

array([[    0,     0,     0,    11,    22,     4],
       [    29,     6,     12,    29,  1576,    29],
       ...,
       [    0,     0,     67,    8947,  7274,  7019],
       [    0,     0,     0,    15,  10000,    50]])

y_train 由 1 到 10000 之间的整数组成,换句话说,这变成了一个有 10000 个类的多类分类问题。

我的问题:当我在输出层指定输出大小时,我想指定 10000,但如果我这样做,模型将预测 0-9999 的类。另一种方法是将输出大小设置为 10001,但随后模型可以预测 0 类(填充),这是不需要的。

由于y_train 是从 1 映射到 10000,我可以将其重新映射到 0-9999,但由于它们与输入共享映射,这似乎是一种不必要的解决方法。

编辑:
我意识到,@Andrey 在 cmets 中指出,我可以允许 10001 个类,并且只需在词汇表中添加填充,尽管我对预测 0 的网络从不感兴趣。

如何告诉模型在标签 1-10000 上进行预测,同时有 10000 个类,而不是 10001 个?

【问题讨论】:

  • 我通常将 vocab_size 设置为 10001,我从未见过模型预测为 0
  • 实际上,我的 vocab_size 要大得多,并且我在我的用例中使用了前 k 个概率,所以它实际上(非常罕见)发生,即 0 是前 k 个预测的一部分:(
  • 我会在词汇末尾添加填充符号并将输出形状固定为 10000(不是 len(vocab) = 10001)
  • 或者我会添加填充作为附加输入(而不是使用特殊的词汇符号)

标签: python-3.x tensorflow keras nlp tensorflow2.0


【解决方案1】:

我会使用以下方法:

import tensorflow as tf
inputs = tf.keras.layers.Input(shape=())
x = tf.keras.layers.Embedding(10001, 512)(inputs) # input shape of full vocab size [10001]
x = tf.keras.layers.Dense(10000, activation='softmax')(x) # training weights based on reduced vocab size [10000]
z = tf.zeros(tf.shape(x)[:-1])[..., tf.newaxis]
x = tf.concat([z, x], axis=-1) # add constant zero on the first position (to avoid predicting 0)
model = tf.keras.Model(inputs=inputs, outputs=x)

inputs = tf.random.uniform([10, 10], 0, 10001, dtype=tf.int32) 
labels = tf.random.uniform([10, 10], 0, 10001, dtype=tf.int32)
model.compile(loss='sparse_categorical_crossentropy')
model.fit(inputs, labels)

pred = model.predict(inputs) # all zero positions filled by 0 (which is minimum value)

【讨论】:

  • 感谢您的持续努力,这可能是最好的解决方案,尽管我希望使用 keras 模型而不是数据进行修改。这是因为,如果我保存模型以供我或其他人以后使用,用户必须记住输出和输入不一样,并且不能忘记通过pred += 1修改预测。
  • 这个答案对我来说很好——第一个(未使用的)输出单元的概率总是 0。取预测的 argmax 将产生所需的类。
猜你喜欢
  • 2015-05-04
  • 2013-04-19
  • 2015-04-20
  • 1970-01-01
  • 2011-12-10
  • 2014-09-07
  • 2020-05-15
  • 2011-02-13
  • 1970-01-01
相关资源
最近更新 更多