3

DataLoader現在、numpy 配列をバッチ処理するために使用したい次のような状況があります。

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

# Create toy data
x = np.linspace(start=1, stop=10, num=10)
x = np.array([np.random.normal(size=len(x)) for i in range(100)])
print(x.shape)
# >> (100,10)

# Create DataLoader
input_as_tensor = torch.from_numpy(x).float()
dataset = data_utils.TensorDataset(input_as_tensor)
dataloader = data_utils.DataLoader(dataset,
                                   batch_size=100,
                                  )
batch = next(iter(dataloader))

print(type(batch))
# >> <class 'list'>

print(len(batch))
# >> 1

print(type(batch[0]))
# >> class 'torch.Tensor'>

batchはすでに であると予想していtorch.Tensorます。今のところbatch[0]、Tensor を取得するためにバッチにインデックスを付けていますが、これはあまりきれいではなく、コードが読みにくくなっていると感じています。

DataLoaderが と呼ばれるバッチ処理関数を使用することがわかりましたcollate_fn。ただし、設定は、唯一のエントリが Tensor としてのバッチでdata_utils.DataLoader(..., collage_fn=lambda batch: batch[0])あるタプルにリストを変更するだけです。(tensor([ 0.8454, ..., -0.5863]),)

バッチをテンソルにエレガントに変換する方法を見つけるのを手伝ってくれて、私を大いに助けてくれます (バッチ内の単一のエントリにインデックスを付けても問題ないことを教えてくれる場合でも)。

4

1 に答える 1

1

私の回答でご迷惑をおかけして申し訳ありません。

Dataset実際には、テンソルから作成する必要はありません。実装さtorch.Tensorれているので直接渡すことができるので、これで十分です。__getitem____len__

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

# Create toy data
x = np.linspace(start=1, stop=10, num=10)
x = np.array([np.random.normal(size=len(x)) for i in range(100)])

# Create DataLoader
dataset = torch.from_numpy(x).float()
dataloader = data_utils.DataLoader(dataset, batch_size=100)
batch = next(iter(dataloader))
于 2019-10-29T17:57:35.800 に答える