#python #deep-learning #pytorch
Вопрос:
я получаю эту ошибку от метода во время процесса обучения модели. я использую google colab для запуска кода. в Google colab нет графического процессора. Есть ли у них какой-либо другой способ, которым я могу запустить код, не требуя процессора cuda.
Как я могу исправить эту ошибку ?
def train_model(model, train_loader, val_loader, epoch, loss_function, optimizer, path, early_stop): # GPU #device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # device = torch.device("cpu") device = torch.device("cuda") model = model.to(device) patience, eval_loss = 0, 0 # train for i in range(epoch): total_loss, count = 0, 0 y_pred = list() y_true = list() for idx, (x, y) in tqdm(enumerate(train_loader), total=len(train_loader)): x, y = x.to(device), y.to(device) u, m = model(x) predict = torch.sigmoid(torch.sum(u*m, 1)) y_pred.extend(predict.cpu().detach().numpy()) y_true.extend(y.cpu().detach().numpy()) loss = loss_function(predict, y.float()) optimizer.zero_grad() loss.backward() optimizer.step() total_loss = float(loss) count = 1 train_auc = roc_auc_score(np.array(y_true), np.array(y_pred)) torch.save(model, path.format(i 1)) print("Epoch %d train loss is %.3f and train auc is %.3f" % (i 1, total_loss / count, train_auc)) # verify total_eval_loss = 0 model.eval() count_eval = 0 val_y_pred = list() val_true = list() for idx, (x, y) in tqdm(enumerate(val_loader), total=len(val_loader)): x, y = x.to(device), y.to(device) u, m = model(x) predict = torch.sigmoid(torch.sum(u*m, 1)) val_y_pred.extend(predict.cpu().detach().numpy()) val_true.extend(y.cpu().detach().numpy()) loss = loss_function(predict, y.float()) total_eval_loss = float(loss) count_eval = 1 val_auc = roc_auc_score(np.array(y_true), np.array(y_pred)) print("Epoch %d val loss is %.3fand train auc is %.3f" % (i 1, total_eval_loss / count_eval, val_auc))
Ответ №1:
Просто удалите строку, в которой вы ее создаете torch.device()
, и удалите все .to(device)
функции, в которых вы ее используете. Тогда вам также не нужно также писать .cpu().detach()
. Вы можете просто писать predict.numpy()
как таковой. Когда вы пишете device = torch.device("cuda")
, вы создаете устройство с графическим процессором, а затем переносите свою модель и данные на устройство с графическим процессором, когда оно недоступно. В этом и заключается причина ошибки.
Комментарии:
1. но если я удалю
device = torch.device("cuda")
его, это повлияет на ` x, y = x.to(устройство), y.to(устройство)` строка в коде.2. Вы можете удалить эти строки кода. Эти строки просто переносят ваши x и y с процессора на графический процессор. Вы даже можете удалить строку
model = model.to(device)
.3. Большое спасибо. я действительно внес эти изменения, и это работает.
4. Пожалуйста. Затем вы можете отметить мой ответ как принятый. Спасибо!