python - 使用 to_categorical 转换 np.array 时的内存问题

标签 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

最佳答案

你不需要使用 to_categorical 因为我猜你正在做多标签分类。为了一劳永逸地避免任何混淆(!),让我解释一下。

如果您正在进行二元分类,这意味着每个样本可能只属于一个 两类,例如猫与狗或快乐与悲伤或正面评论与负面评论,然后:

  • 标签应该像 [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] 对应 lion,在本例中标签的形状为 (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

关于python - 使用 to_categorical 转换 np.array 时的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51890883/

相关文章:

python - 需要帮助理解 Python 中的 Comet(使用 Django)

在 while 循环内记录更改的 Pythonic 方式

python - 查看 .npy 图像

python - 检测 NumPy 数组是否包含至少一个非数字值?

python - DataFrame 操作函数/方法

python - 在 Amazon SageMaker 中进行预测之前预处理输入数据

Python:彩色打印和风格打印

python - 使用 python 的多处理并行化 keras 中的模型预测

python - 在 scikit learn 中自定义损失函数

machine-learning - 隐马尔可夫模型 : Automatically determine hidden states?