【问题标题】:one_hot encoding for batches will be incomplete tensorflow批量的 one_hot 编码将是不完整的 tensorflow
【发布时间】:2026-02-18 17:00:01
【问题描述】:

如您所知,tf.one_hot 可以进行一次热编码。但是,当我的数据集非常大时,我需要进行批量训练。这样,当我使用 for 循环遍历所有批次时,在每次迭代中,当我执行 tf.one_hot 时,一个热矩阵的维度会比我预期的要小。

例如,对于“a”列,我们有 47 个类别,但在一批中它们可能只显示 20 个,当我在这批上执行 one_hot 时,它将创建一个维度为 rows * 20 而不是 a行数 * 47。

如何在每批中获得一个维度* 47 的一个热矩阵?

谢谢!

【问题讨论】:

    标签: python tensorflow one-hot-encoding


    【解决方案1】:

    tf.one_hot() 将参数depth 作为第二个参数,它决定了单热向量应该有多长。如果你像这样运行你的操作:

    b = tf.one_hot( a, 47 )
    

    最后一个维度应该是 47。

    没有代码很难说,但是有些人不会硬编码 one_hot 大小,而是尝试从标签张量中获取它,例如

    max_class = tf.reduce_max( a )
    b = tf.one_hot( a, max_class )
    

    如果您的代码中是这种情况,那么可能批次只能达到 20 级。

    否则需要看你的代码才能说些什么。

    如果 TensorFlow 内存不足,它会因错误而停止,而不会默默地咬掉一半的数据。 :)

    【讨论】:

    • 谢谢!在我发布这个问题后,我也注意到了这一点。但似乎类别标签应该从0开始并且是连续的吧?比如,如果我的类别是 1、5、6、8、10,当我将其设置为 5 时,如果批次只包含 6、8、5,那可能会导致不匹配,对吧?
    • 如果你的批次被适当地随机化,那么它就会到处都是,这是这样做的好方法! :) 如果您按顺序从 0 类到 47 类,它们可能是连续的,但这会产生不合标准的网络。随机化为王! :)
    • 不完全明白...所以你的意思是如果我将深度设置为 5。批处理中的数据仍然会给出这样的矩阵 [[0,0,1,0,0], [0,0,0,1,0],[0,1,0,0,0]]?(其中子列表中第一个元素到第五个元素代表 1,5,6,8,10 )
    • 如果将depth设置为5,那么one_hot向量的长度将始终为5。设置为47,则始终为47。但要注意,one_hot是固定数值的,如果你例如 10 级,你必须有至少 10 级的深度,否则你会得到一个错误。
    • 哦,我现在明白了。谢谢!