TypeError: iteration over a 0-d tensor

Viewed 1222

I used python in jupyter to text classification, but i got this error:

TypeError: iteration over a 0-d tensor

The below are my important code summary related to this error:

print(len(train_ds)) # 44
print(len(valid_ds)) # 22


class LSTMClassifier(nn.Module):

    def __init__(self, embed_size, hidden_size, vocab_size, num_layers, num_classes, batch_size):
        super(LSTMClassifier, self).__init__()

        self.embed_size = embed_size
        self.hidden_size = hidden_size
        self.batch_size = batch_size
        self.num_layers = num_layers
        self.embedding = nn.Embedding(vocab_size, embed_size) # a lookup table

        self.lstm = nn.LSTM(embed_size, hidden_size, num_layers, dropout=0.3, bidirectional=True)

        self.fc = nn.Sequential(
            nn.Linear(2*hidden_size, 100),
            nn.ReLU(),
            nn.Dropout(p=0.2),
            nn.Linear(100, num_classes)
        )

        self.hidden = self.init_hidden()

    def init_hidden(self):
        h = to_var(torch.zeros((2*self.num_layers, self.batch_size, self.hidden_size)))
        c = to_var(torch.zeros((2*self.num_layers, self.batch_size, self.hidden_size)))
        return h, c

    def forward(self, x):
        x = self.embedding(x)
        x, self.hidden = self.lstm(x, self.hidden)
        x = self.fc(x[-1]) # select the last output
        return x

LSTM Parameters

embed_size =50

hidden_size = 100

num_layers = 1

Training Parameters

lr = 0.001

num_epochs = 10

model = LSTMClassifier(embed_size=embed_size, 
                       hidden_size=hidden_size, 
                       vocab_size=vocab_size,
                       num_layers=num_layers,
                       num_classes=train_ds.num_classes, 
                       batch_size=batch_size)

if use_gpu:
    model = model.cuda()

criterion = nn.CrossEntropyLoss()

if use_gpu:
    criterion = criterion.cuda()

    optimizer = optim.Adam(model.parameters(), lr=lr, betas=(0.7, 0.99))
    scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=1, gamma=0.975)

hist = train(model, train_dl, valid_dl, criterion, optimizer, scheduler, num_epochs)

TypeError Traceback (most recent call last) in ----> 1 hist = train(model, train_dl, valid_dl, criterion, optimizer, scheduler, num_epochs)

~\train_utils.py in train(model, train_dl, valid_dl, criterion, optimizer, scheduler, num_epochs)
     82 
     83         ## perform one epoch of training and validation
---> 84         trn_loss, trn_acc = train_step(model, train_dl, criterion, optimizer, scheduler)
     85         val_loss, val_acc = validate_step(model, valid_dl, criterion)
     86 

~\train_utils.py in train_step(model, train_dl, criterion, optimizer, scheduler)
     24         # Starting each batch, we detach the hidden state from how it was previously produced.
     25         # If we didn't, the model would try backpropagating all the way to start of the dataset.
---> 26         model.hidden = detach(model.hidden)
     27         model.zero_grad()
     28         output = model(train_inputs.t())

~\utils.py in detach(x)
     10 def detach(x):
     11     """ Detach hidden states from their history."""
---> 12     return Variable(x.data) if type(x) == Variable else tuple(detach(v) for v in x)

~\utils.py in <genexpr>(.0)
     10 def detach(x):
     11     """ Detach hidden states from their history."""
---> 12     return Variable(x.data) if type(x) == Variable else tuple(detach(v) for v in x)

~\utils.py in detach(x)
     10 def detach(x):
     11     """ Detach hidden states from their history."""
---> 12     return Variable(x.data) if type(x) == Variable else tuple(detach(v) for v in x)

~\utils.py in <genexpr>(.0)
     10 def detach(x):
     11     """ Detach hidden states from their history."""
---> 12     return Variable(x.data) if type(x) == Variable else tuple(detach(v) for v in x)

~\utils.py in detach(x)
     10 def detach(x):
     11     """ Detach hidden states from their history."""
---> 12     return Variable(x.data) if type(x) == Variable else tuple(detach(v) for v in x)

~\utils.py in <genexpr>(.0)
     10 def detach(x):
     11     """ Detach hidden states from their history."""
---> 12     return Variable(x.data) if type(x) == Variable else tuple(detach(v) for v in x)

~\utils.py in detach(x)
     10 def detach(x):
     11     """ Detach hidden states from their history."""
---> 12     return Variable(x.data) if type(x) == Variable else tuple(detach(v) for v in x)

~\utils.py in <genexpr>(.0)
     10 def detach(x):
     11     """ Detach hidden states from their history."""
---> 12     return Variable(x.data) if type(x) == Variable else tuple(detach(v) for v in x)

~\utils.py in detach(x)
     10 def detach(x):
     11     """ Detach hidden states from their history."""
---> 12     return Variable(x.data) if type(x) == Variable else tuple(detach(v) for v in x)

C:\ProgramData\Anaconda3\lib\site-packages\torch\tensor.py in __iter__(self)
    448     def __iter__(self):
    449         if self.dim() == 0:
--> 450             raise TypeError('iteration over a 0-d tensor')
    451         if torch._C._get_tracing_state():
    452             warnings.warn('Iterating over a tensor might cause the trace to be incorrect. '

TypeError: iteration over a 0-d tensor

please help me,i dont know why this error appears... Thanks

0 Answers
Related