我正在 GPU 上训练神经网络。它使用了很多二进制输入功能。
由于将数据移入/移出 GPU 的成本很高,因此我正在寻找使初始表示更紧凑的方法。现在,我将我的特征编码为int8,将它们移到 GPU 上,然后扩展为float32:
# create int8
features = torch.zeros(*dims, dtype=torch.int8)
# fill in some data (set some features to 1.)
…
# move int8 to GPU
features = features.to(device=cuda, non_blocking=True)
# expand int8 as float32
features = features.to(dtype=float32)
Run Code Online (Sandbox Code Playgroud)
现在,我正在寻找将这些二进制特征压缩为位而不是字节的方法。
NumPy 有函数packbits和unpackbits
>>> a = np.array([[2], [7], [23]], dtype=np.uint8)
>>> b = np.unpackbits(a, axis=1)
>>> b
array([[0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
有没有办法在 GPU 上的 PyTorch 中解压缩位?
在撰写此答案时没有类似的功能。然而,解决方法是使用torch.from_numpy如下:
In[2]: import numpy as np
In[3]: a = np.array([[2], [7], [23]], dtype=np.uint8)
In[4]: b = np.unpackbits(a, axis=1)
In[5]: b
Out[5]:
array([[0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8)
In[6]: import torch
In[7]: torch.from_numpy(b)
Out[7]:
tensor([[0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 1, 0, 1, 1, 1]], dtype=torch.uint8)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |