Преобразовать словарь Dataloader в Pytorch Tensor - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь применить автокодер к пользовательскому набору данных в Pytorch, используя в качестве руководства следующее руководство.

https://pytorch.org/tutorials/beginner/data_loading_tutorial.html

Мой набор данных состоит из изображений и значений, связанных с этими изображениями.

У меня возникают проблемы при обучении модели, поскольку элементы в созданном мною наборе данных действуют как словарь, а модели нужны тензоры.

dataloader type =  <class 'torch.utils.data.dataloader.DataLoader'>

Для элемента в загрузчике данных:

<class 'dict'>
{'image': tensor([[[[0.5270, 0.5667, 0.6228,  ..., 0.6588, 0.6748, 0.6787],
          [0.5551, 0.5591, 0.6049,  ..., 0.6441, 0.6659, 0.6718],
          [0.4706, 0.4230, 0.5051,  ..., 0.6439, 0.6608, 0.6627],
          ...,
          [0.6914, 0.6478, 0.6574,  ..., 0.5968, 0.5735, 0.5676],
          [0.6814, 0.6475, 0.6713,  ..., 0.5664, 0.5059, 0.4669],
          [0.6588, 0.6623, 0.6914,  ..., 0.4667, 0.3453, 0.3132]],

         [[0.5061, 0.5270, 0.6422,  ..., 0.6642, 0.6787, 0.6931],
          [0.5375, 0.5426, 0.6169,  ..., 0.6520, 0.6711, 0.6730],
          [0.3980, 0.3314, 0.4326,  ..., 0.6608, 0.6738, 0.6716],
          ...,
          [0.7196, 0.6326, 0.6333,  ..., 0.6000, 0.5814, 0.5801],
          [0.6877, 0.6005, 0.6537,  ..., 0.5368, 0.4382, 0.3944],
          [0.6828, 0.6755, 0.6983,  ..., 0.3880, 0.2973, 0.2806]],

         [[0.5456, 0.5431, 0.5968,  ..., 0.6657, 0.6650, 0.6735],
          [0.4939, 0.3998, 0.4319,  ..., 0.6650, 0.6765, 0.6676],
          [0.4272, 0.2904, 0.3010,  ..., 0.6618, 0.6745, 0.6583],
          ...,
          [0.7324, 0.6740, 0.6505,  ..., 0.5436, 0.4958, 0.4971],
          [0.6939, 0.6836, 0.6887,  ..., 0.4218, 0.3672, 0.3875],
          [0.6669, 0.6686, 0.6826,  ..., 0.3093, 0.3108, 0.3341]],

         [[0.9961, 0.9961, 0.9961,  ..., 0.9961, 0.9961, 0.9961],
          [0.9961, 0.9961, 0.9961,  ..., 0.9961, 0.9961, 0.9961],
          [0.9961, 0.9961, 0.9961,  ..., 0.9961, 0.9961, 0.9961],
          ...,
          [0.9961, 0.9961, 0.9961,  ..., 0.9961, 0.9961, 0.9961],
          [0.9961, 0.9961, 0.9961,  ..., 0.9961, 0.9961, 0.9961],
          [0.9961, 0.9961, 0.9961,  ..., 0.9961, 0.9961, 0.9961]]]],
       dtype=torch.float64), 'hardness_arr': tensor([[[ 54.1600,   8.1600],
         [  7.4000, -38.6000]]], dtype=torch.float64)}

Могу ли я выполнить преобразование из словаря набора данных в тензор или есть лучший способ решения этой проблемы?

    autoencoder = AutoEncoder()

optimizer = torch.optim.Adam(autoencoder.parameters(), lr=LR)
loss_func = nn.MSELoss()

for epoch in range(EPOCH):
    for step, (dataloader['image'], dataloader['hardness_arr']) in enumerate(dataloader['image']):
        b_x = x['image'].view(-1, crop_size*crop_size)   # batch x, shape (batch, 28*28)
        b_y = x['image'].view(-1, crop_size*crop_size)   # batch y, shape (batch, 28*28)

        encoded, decoded = autoencoder(b_x)

        loss = loss_func(decoded, b_y)      # mean square error
        optimizer.zero_grad()               # clear gradients for this training step
        loss.backward()                     # backpropagation, compute gradients
        optimizer.step()                    # apply gradients

TypeError                                 Traceback (most recent call last)
<ipython-input-82-25093ba202c6> in <module>
      5 
      6 for epoch in range(EPOCH):
----> 7     for step, (dataloader['image'], dataloader['hardness_arr']) in enumerate(dataloader['image']):
      8         b_x = x['image'].view(-1, crop_size*crop_size)   # batch x, shape (batch, 28*28)
      9         b_y = x['image'].view(-1, crop_size*crop_size)   # batch y, shape (batch, 28*28)

TypeError: 'DataLoader' object is not subscriptable

В качестве альтернативы, если я попытаюсьдля перечисления самого загрузчика данных я получаю следующую ошибку:

TypeError: 'DataLoader' object does not support item assignment
...