【问题标题】:one-hot encoding of an array of floats using just keras仅使用 keras 对浮点数组进行单热编码
【发布时间】:2023-04-10 02:36:01
【问题描述】:

首先,我是 stackoverflow 的新手,所以如果有办法改进我提出问题的方式,或者如果我遗漏了一些明显的问题,请指出来!

我正在 Keras 中构建一个分类卷积网络,该网络被要求预测参数用于生成图像。这些类被编码为 5 个浮点值,例如类列表可能如下所示:

[[0.], [0.76666665], [0.5], [0.23333333], [1.]]

我想使用 keras.utils.to_categorical(y, num_classes=5, dtype='float32') 函数对这些类进行一次热编码。

但是,它返回以下内容:

array(
    [
       [1., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.]
    ], 
dtype=float32)

它只接受整数作为输入,因此它将所有值< 1. 映射到0。 我可以通过将所有值乘以一个常数来规避这个问题,所以它们都是整数,我认为在 scikit learn 中也有一种方法可以解决这个问题,但这对于一个应该很容易解决的问题来说听起来像是一个巨大的解决方法在 keras 中,这让我相信我遗漏了一些明显的东西。

我希望有人能够指出一个仅使用 Keras 的简单替代方案。

【问题讨论】:

    标签: python keras one-hot-encoding


    【解决方案1】:

    另一种选择是使用来自sklearnOneHotEncoder

    from sklearn.preprocessing import OneHotEncoder
    
    encoder = OneHotEncoder(categories='auto')
    
    input = [[0.], [0.76666665], [0.5], [0.23333333], [1.]]
    output = encoder.fit_transform(input)
    
    print(input)
    print(output.toarray())
    

    输出:

    [[0.0], [0.76666665], [0.5], [0.23333333], [1.0]]
    [[ 1.  0.  0.  0.  0.]
     [ 0.  0.  0.  1.  0.]
     [ 0.  0.  1.  0.  0.]
     [ 0.  1.  0.  0.  0.]
     [ 0.  0.  0.  0.  1.]]
    

    【讨论】:

    • 这确实可能是最简单的方法,但在这种情况下,我想知道是否可以在不使用 Keras 之外的任何其他库的情况下完成。尽管如此,还是感谢您的评论!
    • @Jeffrey 除非绝对必要,否则重用而不是重新发明轮子是个好主意。不知道您试图通过拒绝访问您的问题域中最有用的库来解决什么问题。
    【解决方案2】:

    由于浮点值的连续性,不建议尝试对它们进行一次热编码。相反,你应该尝试这样的事情:

    a = {}
    classes = []
    
    for item, i in zip(your_array, range(len(your_array))):
        a[str(i)] = item
        classes.append(str(i))
    
    encoded_classes = to_categorical(classes)
    

    字典是为了让你以后可以参考实际值。

    编辑:nuric 发表评论后更新。

    your_array = [[0.], [0.76666665], [0.5], [0.23333333], [1.]]
    
    class_values = {}
    classes = []
    
    for i, item in enumerate(your_array):
        class_values[str(i)] = item
        classes.append(i)
    
    encoded_classes = to_categorical(classes)
    

    【讨论】:

    • 好答案,我会避免转换为str 并使用enumerate 而不是zip(..., range())
    • @nuric 哦,是的,enumerate 会更明智,谢谢
    猜你喜欢
    • 2019-10-07
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多