Python 将np.array使用转换为_category时的内存问题

Python 将np.array使用转换为_category时的内存问题,python,numpy,machine-learning,keras,classification,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

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

忽略这样一个事实,即to_category的应用在我的场景中是毫无意义的。以下解决了内存问题:

x_val = x_val.astype(np.uint8)

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

x_val = x_val.astype(np.uint8)

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

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

  • 标签应类似于
    [0 1 0 0 1…0]
    ,形状为
    (n_样本,)
    ,即每个样本都有一个(如猫)或零个(如狗)标签
  • 最后一层使用的激活函数通常是
    sigmoid
    (或输出范围[0,1]内的值的任何其他函数)
  • 通常使用的损失函数是二进制交叉熵
如果您正在进行多类别分类,这意味着每个样本可能只属于多个类别中的一个,例如猫对狗对狮子或快乐对中性对悲伤或积极评价对中性评价对消极评价,那么:

  • 标签应该是一个热编码的,即
    [1,0,0]
    对应于猫,
    [0,1,0]
    对应于狗,
    [0,0,1]
    对应于狮子,在这种情况下,标签的形状为
    (n_样本,n_类)
    ;或者它们可以是整数(即稀疏标签),即猫的
    1
    ,狗的
    2
    ,狮子的
    3
    ,在这种情况下,标签的形状为
    (n_样本,)
    to_category
    函数用于将稀疏标签转换为一个热编码标签,当然,如果您希望这样做的话
  • 使用的激活功能通常是
    softmax
  • 使用的损失函数取决于标签的格式:如果标签是一个热编码的,则使用
    category\u crossentropy
    ,如果标签是稀疏的,则使用
    sparse\u category\u crossentropy
如果您正在进行多标签分类,这意味着每个样本可能属于零、一个或多个类别,例如图像可能同时包含猫和狗,则:

  • 标签应类似于
    [[1 0 0 1…0],…,[0 0 1 0…1]
    ,形状为
    (n_样本,n_类)
    。例如,标签
    [1 1]
    表示相应的样本属于这两个类别(例如猫和狗)
  • 所使用的激活函数是
    sigmoid
    ,因为假定每个类独立于另一个类
  • 使用的损失函数是
    二进制交叉熵

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

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

  • 标签应类似于
    [0 1 0 0 1…0]
    ,形状为
    (n_样本,)
    ,即每个样本都有一个(如猫)或零个(如狗)标签
  • 最后一层使用的激活函数通常是
    sigmoid
    (或输出范围[0,1]内的值的任何其他函数)
  • 通常使用的损失函数是二进制交叉熵
如果您正在进行多类别分类,这意味着每个样本可能只属于多个类别中的一个,例如猫对狗对狮子或快乐对中性对悲伤或积极评价对中性评价对消极评价,那么:

  • 标签应该是一个热编码的,即
    [1,0,0]
    对应于猫,
    [0,1,0]
    对应于狗,
    [0,0,1]
    对应于狮子,在这种情况下,标签的形状为
    (n_样本,n_类)
    ;或者它们可以是整数(即稀疏标签),即猫的
    1
    ,狗的
    2
    ,狮子的
    3
    ,在这种情况下,标签的形状为
    (n_样本,)
    to_category
    函数用于将稀疏标签转换为一个热编码标签,当然,如果您希望这样做的话
  • 使用的激活功能通常是
    softmax
  • 使用的损失函数取决于标签的格式:如果标签是一个热编码的,则使用
    category\u crossentropy
    ,如果标签是稀疏的,则使用
    sparse\u category\u crossentropy
如果您正在进行多标签分类,这意味着每个样本可能属于零、一个或多个类别,例如图像可能同时包含猫和狗,则:

  • 标签应类似于
    [[1 0 0 1…0],…,[0 0 1 0…1]
    ,形状为
    (n_样本,n_类)
    。例如,标签
    [1 1]
    表示相应的样本属于这两个类别(例如猫和狗)
  • 所使用的激活函数是
    sigmoid
    ,因为假定每个类独立于另一个类
  • 使用的损失函数是
    二进制交叉熵
如果是二进制分类