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

我有一个这样的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,),即每个样本有一个标签(例如猫为1,狗为0)。
  • 最后一层的激活函数通常是sigmoid(或任何其他输出范围在[0,1]的函数)。
  • 通常使用的损失函数是binary_crossentropy

如果你在做多类分类,即每个样本只能属于多个类别中的一个,例如猫与狗与狮子、快乐与中立与悲伤、正面评价与中立评价与负面评价,那么:

  • 标签可以是一热编码,即[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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注