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

时间:2019-02-21 12:26:01

标签: python keras one-hot-encoding

首先,我是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 learning中也有一种解决此问题的方法,但这听起来像是解决该问题的巨大方法,该问题应该微不足道只是在喀拉拉邦,这使我相信我缺少明显的东西。

我希望有人能够仅使用Keras指出一个简单的选择。

2 个答案:

答案 0 :(得分:1)

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

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)

答案 1 :(得分:0)

另一种选择是使用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.]]