转化np.array当内存使用问题to_categorical转化np.array当内存使用问题to

2019-05-12 13:32发布

我有一个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

Answer 1:

你并不需要使用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


Answer 2:

忽略一个事实,即to_categorical的应用是在我的方案毫无意义。 以下解决内存问题:

x_val = x_val.astype(np.uint8)


文章来源: memory issues when transforming np.array using to_categorical