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