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



首先,我是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。

另一种选择是使用sklearn中的OneHotEncoder

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

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

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)

最新更新