使用to_categorical转换np.array时出现内存问题

时间:2018-08-17 08:02:57

标签: python numpy machine-learning keras classification

我有一个像这样的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数组包含用于二进制分类问题的标签。到目前为止,我已经像在Keras ANN中一样将其用作float32,并且效果很好,并且取得了不错的性能。那么实际上是否有必要运行to_categorical

2 个答案:

答案 0 :(得分:5)

您不需要使用to_categorical,因为我猜您正在执行多标签分类。为了避免一劳永逸(!),请允许我解释一下。

如果您要进行二进制分类,则意味着每个样本可能仅属于一个样本 两个类别中的一个猫与狗或快乐与悲伤或正面评论与负面评论,然后:

  • 标签应类似于[0 1 0 0 1 ... 0],形状为(n_samples,),即每个样本都带有一个(例如猫)或零(例如狗)标签。
  • 用于最后一层的激活函数通常是sigmoid(或任何其他输出范围[0,1]内的值的函数)。
  • 通常使用的损失函数为binary_crossentropy

如果您要进行多类别分类,则意味着每个样本可能仅属于许多类别之一,例如猫vs狗vs狮子或快乐vs中立vs悲伤或正面评论vs中立评论vs负面评论,然后:

  • 标签应采用单次热编码,即[1, 0, 0]对应于cat,[0, 1, 0]对应于dog,[0, 0, 1]对应于lion,在这种情况下,标签具有形状的(n_samples, n_classes);或者它们可以是整数(即稀疏标签),即1(代表猫),2(代表狗)和3(代表狮子),在这种情况下,标签的形状为{{1} }。 (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

答案 1 :(得分:0)

在我的场景中,忽略to_categorical的应用毫无意义的事实。以下解决了内存问题:

x_val = x_val.astype(np.uint8)