cs0*_*815 1 python numpy classification machine-learning keras
我有一个像这样的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.]]
Run Code Online (Sandbox Code Playgroud)
我这样转换它以减少内存需求:
x_val = x_val.astype(np.int)
Run Code Online (Sandbox Code Playgroud)
结果是:
[[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]]
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时:
x_val = to_categorical(x_val)
Run Code Online (Sandbox Code Playgroud)
我得到:
in to_categorical
categorical = np.zeros((n, num_classes), dtype=np.float32)
MemoryError
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?最终,numpy数组包含用于二进制分类问题的标签。到目前为止,我已经float32
像在Keras ANN中一样使用了它,并且效果很好,并且我取得了不错的性能。那么实际上有必要跑步to_categorical
吗?
您不需要使用,to_categorical
因为我猜您正在执行多标签分类。为了避免一劳永逸(!),让我解释一下。
如果您正在执行二进制分类,则意味着每个样本可能仅属于两个类别之一,例如猫与狗或快乐与悲伤或正面评论与负面评论,那么:
[0 1 0 0 1 ... 0]
具有以下形状:(n_samples,)
即每个样本都带有一个(例如猫)或零(例如狗)标签。sigmoid
(或输出范围在[0,1]范围内的值的任何其他函数)。binary_crossentropy
。如果您要进行多类别分类,这意味着每个样本可能仅属于许多类别中的一种,例如猫与狗,狮子或快乐,中立,悲伤或正面评论,中立评论,负面评论,那么:
[1, 0, 0]
对应于cat,[0, 1, 0]
对应于dog和[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
。 归档时间: |
|
查看次数: |
480 次 |
最近记录: |