web-dev-qa-db-ja.com

numpy配列のリストをpytorchデータセットローダーにロードするにはどうすればよいですか?

Numpy配列の膨大なリストがあり、各配列は画像を表し、torch.utils.data.Dataloaderオブジェクトを使用してそれをロードします。ただし、torch.utils.data.Dataloaderのドキュメントには、フォルダーから直接データを読み込むことが記載されています。私の目的のためにどのように変更しますか?私はpytorchが初めてであり、どんな助けも大歓迎です。単一の画像のnumpy配列は次のようになります。画像はRBG画像です。

`[[[ 70  82  94]
  [ 67  81  93]
  [ 66  82  94]
  ..., 
  [182 182 188]
  [183 183 189]
  [188 186 192]]

 [[ 66  80  92]
  [ 62  78  91]
  [ 64  79  95]
  ..., 
  [176 176 182]
  [178 178 184]
  [180 180 186]]

 [[ 62  82  93]
  [ 62  81  96]
  [ 65  80  99]
  ..., 
  [169 172 177]
  [173 173 179]
  [172 172 178]]

 ..., 
`
16
deepayan das

DataLoaderが実際に必要とするのは、Datasetをサブクラス化する入力だと思います。以下で行ったように、Datasetをサブクラス化する独自のデータセットクラスを作成するか、TensorDatasetを使用できます。

import torch
import numpy as np
import torch.utils.data as utils

my_x = [np.array([[1.0,2],[3,4]]),np.array([[5.,6],[7,8]])] # a list of numpy arrays
my_y = [np.array([4.]), np.array([2.])] # another list of numpy arrays (targets)

tensor_x = torch.stack([torch.Tensor(i) for i in my_x]) # transform to torch tensors
tensor_y = torch.stack([torch.Tensor(i) for i in my_y])

my_dataset = utils.TensorDataset(tensor_x,tensor_y) # create your datset
my_dataloader = utils.DataLoader(my_dataset) # create your dataloader

私のために働く。お役に立てば幸いです。

30
mexmex

PyTorch DataLoaderにはDataSetが必要です。これは docs で確認できます。それを行う正しい方法は以下を使用することです:

torch.utils.data.TensorDataset(*tensors)

これは、テンソルをラッピングするためのデータセットであり、各サンプルは、最初の次元に沿ってテンソルにインデックスを付けることにより取得されます。パラメーター*tensorsは、最初の次元と同じサイズのテンソルを意味します。

他のclass torch.utils.data.Datasetは抽象クラスです。

Numpy配列をテンソルに変換する方法は次のとおりです。

import torch
import numpy as np
n = np.arange(10)
print(n) #[0 1 2 3 4 5 6 7 8 9]
t1 = torch.Tensor(n)  # as torch.float32
print(t1) #tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
t2 = torch.from_numpy(n)  # as torch.int32
print(t2) #tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=torch.int32)

受け入れられた回答ではtorch.Tensorコンストラクト。 0〜255のピクセルの画像がある場合、これを使用できます。

timg = torch.from_numpy(img).float()

またはトーチビジョン to_tensor メソッド。PILImageまたはnumpy.ndarrayをテンソルに変換します。


しかし、ここでは、numpy配列を直接配置できるちょっとしたトリックがあります。

x1 = np.array([1,2,3])
d1 = DataLoader( x1, batch_size=3)

これも機能しますが、d1.datasetタイプ:

print(type(d1.dataset)) # <class 'numpy.ndarray'>

CUDAを使用するには実際にTensorが必要なので、Tensorを使用してDataLoaderにフィードすることをお勧めします。

0
prosti