首先,我是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学习中也有一种解决这个问题的方法,但这听起来像是一个解决这个问题的巨大解决办法在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.]]