Pytorch TypeError:只能将单个元素的整数张量转换为索引

2024-04-25 17:12:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用pytorch进行nlp二元分类,我需要帮助完成神经网络的训练和验证。我是新手,这是我第一次使用pytorch,请参阅下面的代码和错误

X_train_tensor = torch.from_numpy(np.asarray(X_train)).type(torch.FloatTensor).to(device)
y_train_tensor = torch.from_numpy(np.asarray(y_train)).type(torch.FloatTensor).unsqueeze(1).to(device)

X_valid_tensor = torch.from_numpy(np.asarray(X_valid)).type(torch.FloatTensor).to(device)
y_valid_tensor = torch.from_numpy(np.asarray(y_valid)).type(torch.FloatTensor).unsqueeze(1).to(device)



X_train_tensor.size()

输出:火炬尺寸([5438768])

y_train_tensor.size()

输出:火炬尺寸([5438,1])

criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=1e-3, weight_decay=5e-4)


def binary_acc(preds, y_valid):
    
    y_valid_tag = torch.round(preds)

    correct_results = (y_valid_tag == y_valid).float()
    acc = correct_results.sum() / len(correct_results)
    
    return acc


def train(model, *var):
    
    epoch_loss = 0
    epoch_acc = 0
    
    model.train()
    
    for x in range(X_train_tensor):
    
        optimizer.zero_grad() 
    
        predictions = model(X_train_tensor)
        loss = criterion(predictions, y_train_tensor) 
        acc = binary_acc(predictions, y_valid_tensor)
    
        loss.backward()
        optimizer.step()
    
        epoch_loss += loss.item()
        epoch_acc += acc.item()
    
    return epoch_loss / len(X_train_tensor), epoch_acc / len(X_train_tensor)




def evaluate(model, *var):

    epoch_acc = 0
    
    model.eval()
    
    with torch.no_grad():
        for X in range(X_valid_tensor):
            predictions = model(X_train_tensor)
            acc = binary_acc(predictions, y_valid_tensor)
        
            epoch_acc += acc.item()
        
    return epoch_acc / len(X_valid_tensor)




loss=[]
acc=[]
val_acc=[]

for epoch in range(10):
    
    train_loss, train_acc = train(model, X_train_tensor, y_train_tensor, y_valid_tensor)
    valid_acc = evaluate(model, X_valid_tensor, y_valid_tensor)
    
    print(f'\tTrain Loss: {train_loss:.3f} | Train Acc: {train_acc*100:.2f}%')
    print(f'\t Val. Acc: {valid_acc*100:.2f}%')
    
    loss.append(train_loss)
    acc.append(train_acc)
    val_acc.append(valid_acc)

输出错误:TypeError:只有单个元素的整数张量可以转换为索引

请帮我解决这个问题

TypeError                                 Traceback (most recent call last)
<ipython-input-46-bfd7a45f13aa> in <module>
      5 for epoch in range(10):
      6 
----> 7     train_loss, train_acc = train(model, X_train_tensor, y_train_tensor, y_valid_tensor)
      8     valid_acc = evaluate(model, X_valid_tensor, y_valid_tensor)
      9 

<ipython-input-44-689c66e0e9ed> in train(model, *var)
      6     model.train()
      7 
----> 8     for x in range(X_train_tensor):
      9 
     10         optimizer.zero_grad()

TypeError: only integer tensors of a single element can be converted to an index

Tags: toinfromnumpyformodelrangetrain

热门问题