【发布时间】:2020-11-13 10:38:55
【问题描述】:
我有一个问题,给定一组标记,预测另一个标记。对于这个任务,我使用带有Vocab-size + 1 的嵌入层作为input_size。 +1 是因为序列用零填充。例如。给定 Vocab-size 的 10 000 和 max_sequence_len=6,x_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