仅使用 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.]]
首先,我是 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.]]