PyTorch 相当于`numpy.unpackbits`?

Kon*_*kin 7 pytorch

我正在 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 有函数packbitsunpackbits

>>> 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 中解压缩位?

And*_*uib 1

在撰写此答案时没有类似的功能。然而,解决方法是使用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)