【问题标题】:How to fix error while using DataParallel in GRU's network如何在 GRU 的网络中使用 DataParallel 时修复错误
【发布时间】:2019-08-31 08:30:12
【问题描述】:

我正在尝试按照文档中的说明对 GRU 的网络进行数据并行处理,但我一直收到同样的错误

"""Defines the neural network, losss function and metrics"""

import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F


class Net(nn.Module):
    def __init__(self, params, anchor_is_phrase):
        """
        Simple LSTM, used to generate the LSTM for both the word and video
        embeddings. 
        Args:
            params: (Params) contains vocab_size, embedding_dim, lstm_hidden_dim
            is_phrase: is word lstm or the vid lstm
        """
        super(Net, self).__init__()
        if anchor_is_phrase:
            self.lstm = nn.DataParallel(nn.GRU(params.word_embedding_dim, params.hidden_dim, 1)).cuda()#, batch_first=True)
        else:
            self.lstm = nn.DataParallel(nn.GRU(params.vid_embedding_dim, params.hidden_dim, 1)).cuda() #, batch_first=True)

    def forward(self, s, anchor_is_phrase = False):
        """
        Forward prop. 
        """
        s, _ = self.lstm(s)
        s.data.contiguous()
        return s

错误发生在前面代码中的第 s 行,_ = self.lstm(s):

 here:  s, _ = self.lstm(s)
        s.data.contiguous()
        return s

我收到以下错误消息:

    s, _ = self.lstm(s)
  File "/home/pavelameen/miniconda3/envs/TD2/lib/python3.6/site-packages/torch/nn/modules/module.py", line 493, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/pavelameen/miniconda3/envs/TD2/lib/python3.6/site-packages/torch/nn/parallel/data_parallel.py", line 152, in forward
    outputs = self.parallel_apply(replicas, inputs, kwargs)
  File "/home/pavelameen/miniconda3/envs/TD2/lib/python3.6/site-packages/torch/nn/parallel/data_parallel.py", line 162, in parallel_apply
    return parallel_apply(replicas, inputs, kwargs, self.device_ids[:len(replicas)])
  File "/home/pavelameen/miniconda3/envs/TD2/lib/python3.6/site-packages/torch/nn/parallel/parallel_apply.py", line 83, in parallel_apply
    raise output
  File "/home/pavelameen/miniconda3/envs/TD2/lib/python3.6/site-packages/torch/nn/parallel/parallel_apply.py", line 59, in _worker
    output = module(*input, **kwargs)
  File "/home/pavelameen/miniconda3/envs/TD2/lib/python3.6/site-packages/torch/nn/modules/module.py", line 493, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/pavelameen/miniconda3/envs/TD2/lib/python3.6/site-packages/torch/nn/modules/rnn.py", line 193, in forward
    max_batch_size = input.size(0) if self.batch_first else input.size(1)
AttributeError: 'tuple' object has no attribute 'size'

有趣的是我尝试在第 27 行输出 s 的类型并得到 PackedSequence ,为什么它在 lstm forward 方法中转换为元组?

【问题讨论】:

    标签: python deep-learning pytorch recurrent-neural-network


    【解决方案1】:

    nn.GRUexpects(第 181 行)PackedSequence 或张量作为输入。如错误中所述,您正在传递一个元组对象s intead。

    【讨论】:

    • 我在传递给 nn.GRU 之前打印了 s 的类型,我得到了 PackedSequence !!!
    • 这很奇怪,因为您的错误来自仅当输入不是PackedSequence 时才会执行的行。请参阅上述链接中的第 181 至 191 行。或者你可以浏览一下你正在使用的对应版本的pytorch。
    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多