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]]
...,
`
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
私のために働く。お役に立てば幸いです。
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
にフィードすることをお勧めします。