我有一个numpy的数组是这样的:
[[0. 1. 1. ... 0. 0. 1.]
[0. 0. 0. ... 0. 0. 1.]
[0. 0. 1. ... 0. 0. 0.]
...
[0. 0. 0. ... 0. 0. 1.]
[0. 0. 0. ... 0. 0. 1.]
[0. 0. 0. ... 1. 0. 1.]]
我变换像这样来减少内存需求:
x_val = x_val.astype(np.int)
造成这样的:
[[0 1 1 ... 0 0 1]
[0 0 0 ... 0 0 1]
[0 0 1 ... 0 0 0]
...
[0 0 0 ... 0 0 1]
[0 0 0 ... 0 0 1]
[0 0 0 ... 1 0 1]]
然而,当我这样做:
x_val = to_categorical(x_val)
我得到:
in to_categorical
categorical = np.zeros((n, num_classes), dtype=np.float32)
MemoryError
任何想法,为什么? 最终,numpy的数组包含的二元分类问题的标签。 到目前为止,我已经用它作为float32
作为处于Keras ANN和它的工作很好,我取得了相当不错的表现。 因此,它实际上是需要运行to_categorical
?
你并不需要使用to_categorical
因为我猜你是做多标签分类。 为了避免混淆一劳永逸(!),让我解释这一点。
如果你正在做的二元分类 ,这意味着每个样品可能仅属于两个类别之一,例如猫VS狗或喜VS悲伤或积极的评价VS负面评论,则:
- 标签应该像
[0 1 0 0 1 ... 0]
与形状(n_samples,)
即每个样品具有一个(例如猫)或零(例如狗)的标签。 - 用于上一次层的激活函数通常为
sigmoid
(或输出在范围内的值的任何其他函数[0,1])。 - 通常使用的损失函数是
binary_crossentropy
。
如果你正在做的多类分类 ,这意味着每个样品可能仅属于众多类别之一,例如猫VS狗VS狮子还是开心VS中性VS悲伤或积极的评价VS中性的评论VS负面评论,则:
- 标签应该是独热的编码,即
[1, 0, 0]
对应于猫, [0, 1, 0]
对应于狗和[0, 0, 1]
对应于狮子,在这种情况下,标签具有的形状(n_samples, n_classes)
; 或者它们可以是整数(即,稀疏标签),即1
为猫, 2
为狗和3
为狮子,在这种情况下,标签具有的形状(n_samples,)
。 该to_categorical
功能用于稀疏标签转换成独热编码的标签,当然如果你愿意的话。 - 所用的激活函数通常是
softmax
。 - 所使用的损失函数取决于标签的格式:如果它们是独热编码,
categorical_crossentropy
被使用并且如果它们是稀疏然后sparse_categorical_crossentropy
被使用。
如果你是做多标签分类 ,这意味着每个样品可能属于零个,一个或多个类别,例如图像可以包含猫,狗等,则:
- 标签应该像
[[1 0 0 1 ... 0], ..., [0 0 1 0 ... 1]]
用的形状(n_samples, n_classes)
例如,一个标签[1 1]
表示相应的样品属于这两个类(例如猫,狗等)。 - 所用的激活函数是
sigmoid
,因为假定每类是独立另一个类的。 - 使用的损失函数是
binary_crossentropy
。
忽略一个事实,即to_categorical的应用是在我的方案毫无意义。 以下解决内存问题:
x_val = x_val.astype(np.uint8)