Python在int的大numpy数组上循环时内存溢出,onehot转换

2024-09-27 00:15:04 发布

您现在位置:Python中文网/ 问答频道 /正文

x是图像像素值范围为0-255的形状(45000,3,128,128)numpy数组。你知道吗

我想对x进行一次热编码,我尝试用以下方式进行编码:

#x.shape = (45000,3,128,128)
n_frames = x.shape[0]           # (45000)
flatdim  = np.prod(x.shape[1:]) # (49152)
x_flat   = x.reshape((n_frames,flatdim)) # shape=(45000,49152)

x_1h = np.zeros((n_frames,flatdim,256))

for s in xrange(n_frames):
    cur = x_flat[s] # current frame
    for i in xrange(flatdim):
        x_1h[s][i][cur[i]] = 1

x_1h然后是一个稀疏矩阵,x中的每个像素值都由一个(256,)数组表示,在像素值的对应索引中有一个1,其他地方为零。你知道吗

也许有一种更为python的方法可以做到这一点,它不需要内存缓存大量数组,但我不知道有一种更干净的方法,我需要像这样对数组进行编码。你知道吗

不幸的是,负责此转换的python进程很快就超出了内存并被杀死。你知道吗

总系统内存(物理):32.00 GB

有没有人能帮我编写一些内存友好的代码来执行我需要的编码?你知道吗

编辑,为什么要使用此编码:

该阵列将用于链式神经网络的图像预测。我不能在原始的x上使用softmax交叉熵,因为softmax交叉熵需要一个概率分布和真值标签。这是我(也许是愚蠢的)将连续实数数组转换成伪概率分布的尝试。因此,如果像素值被预测为0.53122(约135.4611),则xhat中对应值的“分布”在第135(136)位置处将具有0.5389,并且在第134(135)位置处具有0.4611。然后我将使用下一帧,以二进制编码作为真值标签。你知道吗


Tags: 方法内存in图像编码forframesnp
1条回答
网友
1楼 · 发布于 2024-09-27 00:15:04

如果您找到一种方法将中间结果存储到某个地方,您也许可以通过对值(0-255)进行迭代来更有效地进行存储。 大多数情况下,我通过pandas而不是numpy直接工作,所以这种语法可能是不正确的。对于Python2,使用xrange而不是range。你知道吗

max = 256
for i in range(max):
    x1_h_part = np.zeros((n_frames,flatdim), dtype='bool_')
    x1_h_part[x_flat==i] = 1
    #store x1_h_part

相关问题 更多 >

    热门问题