仅使用 keras 对一组浮点数进行一次性编码

one-hot encoding of an array of floats using just keras

首先,我是 Whosebug 的新手,所以如果有什么方法可以改进我提出问题的方式,或者如果我遗漏了一些明显的东西,请务必指出来!

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

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

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

但是,它 returns 以下内容:

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 的简单替代方案。

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

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)

另一种选择是使用 OneHotEncoder 来自 sklearn:

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.]]