x
是形状 (45000,3,128,128)
图像像素值范围为 0-255 的 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和其他地方的零。
也许有一种更 pythonic 的方法不需要内存缓存大量数组,但我不知道有更干净的方法,我需要像这样对数组进行编码。
不幸的是,负责此转换的 python 进程很快超出内存并被杀死。
总系统内存(物理):32.00 GB
谁能帮我编写执行我需要的编码的对内存更友好的代码?
编辑,为什么我要这种编码:
该数组将在链接器神经网络中用于图像预测。我不能在原始 x
上使用 softmax 交叉熵,因为 softmax 交叉熵需要概率分布和真值标签。这是我(也许是愚蠢的)尝试将连续实数数组转换为一种伪概率分布。因此,如果一个像素值被预测为 0.53122(约 135.4611),那么 xhat
中相应值的“分布”将在第 135(136)个位置为 0.5389,在第 134 个位置为 0.4611 (135) 位置。然后我将使用下一帧,将二进制编码作为真值标签。
最佳答案
如果您找到一种方法将中间结果存储在某处,您或许可以通过遍历值 (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
关于循环遍历大型 numpy 整数数组时 Python 内存溢出,一次性转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40883444/