そのため、3D numpy 配列と形状の長さを受け取る Dataset クラスを作成しましたpack_padded_sequence
。
class MyDataset(data.Dataset):
def __init__(self, dataset, data_shape):
self.dataset = dataset
self.transform = MyToTensor(data_shape)
独自の ToTensor クラスを作成しました。
class MyToTensor(object):
def __init__(self, data_shape):
self.data_shape = data_shape
def __call__(self, data):
data = torch.from_numpy(data)
return rnn.pack_padded_sequence(data, lengths=self.data_shape, batch_first=True)
しかし、何らかの理由print(list(MyDataset(dataset, data_shape)))
で、パディングが削除されずに通常の Tensor オブジェクトが返されます。
私の入力に関するもう少し詳しい情報はdataset
、次の順序で 3D numpy 配列ですbatch size, sequence length, features
。data_shape はbatch_size
、シーケンスの長さを表す数値とサイズが一致するリストです。
シーケンスの長さも、最大のシーケンスから最小のシーケンス サイズの順です。
私の入力の例:
[[[0 0.33000001311302185 1]
[0 0.4300000071525574 1]
[0 0.3799999952316284 1]
...
[0 0.33000001311302185 1]
[0 0.28999999165534973 1]
[0 0.33000001311302185 1]]
[[6 0.800000011920929 3]
[5 0.7300000190734863 3]
[7 0.8199999928474426 3]
...
[4 0.699999988079071 3]
[5 0.7799999713897705 3]
[5 0.7799999713897705 3]]
[[3 1.0 5]
[3 1.0 5]
[3 1.0 5]
...
[3 1.0 5]
[3 1.0 5]
[3 1.0 5]]
...
[[4.0 0.7599999904632568 3.0]
[6.0 0.8100000023841858 3.0]
[6.0 1.0 3.0]
...
[nan nan nan]
[nan nan nan]
[nan nan nan]]
[[8.0 1.0 0.0]
[8.0 0.9100000262260437 0.0]
[9.0 1.0 0.0]
...
[nan nan nan]
[nan nan nan]
[nan nan nan]]
[[5.0 1.0 1.0]
[4.0 1.0 1.0]
[4.0 1.0 1.0]
...
[nan nan nan]
[nan nan nan]
[nan nan nan]]]
対応する data_shape:
(235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 18, 18, 18)