Невозможно преобразовать тензор типа устройства cuda:0 в numpy При попытке перечисления через объект torch.utils.data.DaPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно преобразовать тензор типа устройства cuda:0 в numpy При попытке перечисления через объект torch.utils.data.Da

Сообщение Anonymous »


Я попытался запустить модель регрессии многослойного персептрона (MLP), написанную на PyTorch, через графический процессор в Google Colab. Однако я столкнулся с кучей ошибок при разных подходах. Ниже приведен код, который отлично работает для процессора.

импортировать факел из импорта фонарика nn из torch.utils.data импортировать DataLoader # из sklearn.datasets import load_boston из sklearn.preprocessing импорт StandardScaler импортировать панд как pd импортировать numpy как np класс BostonDataset(torch.utils.data.Dataset): ''' Подготовьте набор данных Бостона для регрессии ''' def __init__(self, X, y, Scale_data=True): если не torch.is_tensor(X) и не torch.is_tensor(y): # Примените масштабирование, если необходимо если масштаб_данных: X = StandardScaler().fit_transform(X) self.X = факел.from_numpy(X) self.y = факел.from_numpy(y) защита __len__(сам): вернуть len(self.X) def __getitem__(self, i): вернуть self.X, self.y класс MLP(nn.Module): ''' Многослойный персептрон для регрессии. ''' защита __init__(сам): супер().__init__() self.layers = nn.Sequential( nn.Линейный(13, 64), nn.ReLU(), nn.Линейный(64, 32), nn.ReLU(), nn.Линейный(32, 1) ) защита вперед (я, х): ''' Пас вперед ''' вернуть self.layers(x) если __name__ == '__main__': # Установить фиксированное начальное значение случайного числа torch.manual_seed(42) # Загрузить набор данных Бостона # X, y = load_boston(return_X_y=True) data_url = "http://lib.stat.cmu.edu/datasets/boston" raw_df = pd.read_csv(data_url, sep="\s+",skiprows=22, header=None) X = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]]) y = raw_df.values[1::2, 2] # Подготовьте набор данных Бостона набор данных = BostonDataset(X, y) trainloader = torch.utils.data.DataLoader (набор данных, пакетный размер = 10, перемешивание = True, num_workers = 1) # Инициализируем MLP млп = МЛП() # Определим функцию потерь и оптимизатор функция_потери = nn.L1Loss() оптимизатор = torch.optim.Adam(mlp.parameters(), lr=1e-4) # Запускаем цикл обучения для эпохи в диапазоне (0, 5): # 5 эпох максимум # Печать эпохи print(f'Начальная эпоха {эпоха+1}') # Установить текущее значение потерь текущая_потеря = 0,0 # Перебираем DataLoader для получения обучающих данных для i данные в перечислении (поездный погрузчик): # Получите и подготовьте входные данные входы, цели = данные входы, цели = inputs.float(), target.float() цели = target.reshape((targets.shape[0], 1)) # Обнуляем градиенты оптимизатор.zero_grad() # Выполняем проход вперед выходы = mlp(входы) # Вычисление потерь потеря = функция_потери(выходы, цели) # Выполняем обратный проход потеря.назад() # Выполняем оптимизацию оптимизатор.шаг() # Печать статистики current_loss += loss.item() если я% 10 == 0: print('Потери после мини-пакета %5d: %.3f' % (i + 1, current_loss/500)) текущая_потеря = 0,0 # Процесс завершен. print('Процесс обучения завершен.') Мои вопросы следующие:
[*]Что не так с текущим подходом, показанным ниже, и как это исправить? [*]Существуют ли какие-либо общие правила запуска модели на графическом процессоре? [*]Следует ли в самом начале указывать устройство глобально? Если да, то почему первоначальный подход не сработал? [*]Должен ли я указывать устройство для каждого нового определенного тензора, модели и загруженных данных?
Я начал с установки устройства по умолчанию на GPU:

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") torch.set_default_device(устройство) но есть следующая ошибка:

-------------------------------------------- ------------------------------- RuntimeError Traceback (самый последний вызов — последний) в () 94 95 # Перебор DataLoader для получения обучающих данных. ---> 96 для i, данные в перечислении (поездный погрузчик): 97 98 # Получить и подготовить входные данные 8 кадров /usr/local/lib/python3.10/dist-packages/torch/utils/_device.py в __torch_function__(self, func,types, args, kwargs) 75, если func в _device_constructors() и kwargs.get('device') имеет значение None: 76 kwargs['device'] = self.device ---> 77 return func(*args, **kwargs) 78 79 # Примечание: это вызывается напрямую из C++ в torch/csrc/Device.cpp. RuntimeError: ожидался тип устройства «cuda» для генератора, но найден «процессор». Затем я попытался указать устройство для модели и данных по одному, потому что понял, что переменная dataset не находится на графическом процессоре, даже если я установил устройство по умолчанию на графический процессор. Ниже приведены мои модификации:

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") ... self.X = torch.from_numpy(X).to(устройство) self.y = torch.from_numpy(y).to(устройство) ... self.layers = nn.Sequential(nn.Linear(13, 64), nn.ReLU(), nn.Linear(64, 32), nn.ReLU(), nn.Linear(32, 1)).to( устройство) но есть следующая ошибка:

-------------------------------------------- ------------------------------- RuntimeError Traceback (самый последний вызов — последний) в () 86 87 # Перебор DataLoader для получения обучающих данных. ---> 88 для i, данные в перечислении (поездный погрузчик): 89 90 # Получить и подготовить входные данные 8 кадров /usr/local/lib/python3.10/dist-packages/torch/utils/_device.py в __torch_function__(self, func,types, args, kwargs) 75, если func в _device_constructors() и kwargs.get('device') имеет значение None: 76 kwargs['device'] = self.device ---> 77 return func(*args, **kwargs) 78 79 # Примечание: это вызывается напрямую из C++ в torch/csrc/Device.cpp. RuntimeError: ожидался тип устройства «cuda» для генератора, но найден «процессор». Я провел поиск и внес следующие изменения:

trainloader = torch.utils.data.DataLoader(набор данных, пакетный размер=10, перемешивание=True, num_workers=1, генератор=torch.Generator(device=device)) но есть следующая ошибка:

-------------------------------------------- ------------------------------- TypeError Traceback (самый последний вызов — последний) в () 86 87 # Перебор DataLoader для получения обучающих данных. ---> 88 для i, данные в перечислении (поездный погрузчик): 89 90 # Получить и подготовить входные данные 8 кадров /usr/local/lib/python3.10/dist-packages/torch/utils/_device.py в __torch_function__(self, func,types, args, kwargs) 75, если func в _device_constructors() и kwargs.get('device') имеет значение None: 76 kwargs['device'] = self.device ---> 77 return func(*args, **kwargs) 78 79 # Примечание: это вызывается напрямую из C++ в torch/csrc/Device.cpp. TypeError: невозможно преобразовать тензор типа устройства cuda:0 в numpy. Используйте Tensor.cpu(), чтобы сначала скопировать тензор в память хоста. Я много искал, но у людей возникает проблема, когда они пытаются что-то спланировать. Я не знаю, почему у меня возникает та же проблема при попытке перечислить объект torch.utils.data.DataLoader. Тем не менее, я попробовал еще одну вещь, которая применяет .to(device) только к данным в цикле обучения, и надеялся, что, по крайней мере, во время перечисления не будет ошибок (помимо исходной версии ЦП): device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") ... self.layers = nn.Sequential(nn.Linear(13, 64), nn.ReLU(), nn.Linear(64, 32), nn.ReLU(), nn.Linear(32, 1)).to( устройство) ... входы, цели = inputs.float().to(устройство), Targets.float().to(устройство) Но выдает аналогичную ошибку:

-------------------------------------------- ------------------------------- RuntimeError Traceback (самый последний вызов — последний) в () 86 87 # Перебор DataLoader для получения обучающих данных. ---> 88 для i, данные в перечислении (поездный погрузчик): 89 90 # Получить и подготовить входные данные 8 кадров /usr/local/lib/python3.10/dist-packages/torch/utils/_device.py в __torch_function__(self, func,types, args, kwargs) 75, если func в _device_constructors() и kwargs.get('device') имеет значение None: 76 kwargs['device'] = self.device ---> 77 return func(*args, **kwargs) 78 79 # Примечание: это вызывается напрямую из C++ в torch/csrc/Device.cpp. RuntimeError: ожидался тип устройства «cuda» для генератора, но найден «процессор». Я пытался несколько часов и очень благодарен за любую помощь в решении этой проблемы!
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • ОШИБКА: TypeError: невозможно преобразовать тензор типа устройства cuda:0 в numpy. Используйте Tensor.cpu(), чтобы снача
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • ОШИБКА: TypeError: невозможно преобразовать тензор типа устройства cuda:0 в numpy. Используйте Tensor.cpu(), чтобы снача
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Ошибка из Torch.utils.data Импорт UTILS
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Ошибка из Torch.utils.data Импорт UTILS
    Anonymous » » в форуме Python
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous
  • Нет модуля с именем utils.utils, utils не является пакетом.
    Anonymous » » в форуме Python
    0 Ответы
    70 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»