Pytorch, когда я использую back() в цикле, сообщение не удалось передать во втором циклеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Pytorch, когда я использую back() в цикле, сообщение не удалось передать во втором цикле

Сообщение Anonymous »


Я использую циклы для распространения вперед и назад по моей модели. Однако во втором цикле я получаю уведомление об ошибке со следующим сообщением:

RuntimeError: попытка вернуться по графику во второй раз (или напрямую получить доступ к сохраненным тензорам после того, как они уже были освобождены). Сохраненные промежуточные значения графика освобождаются при вызове .backward() или autograd.grad(). Укажите continue_graph=True, если вам нужно пройти по графику назад во второй раз или если вам нужно получить доступ к сохраненным тензорам после обратного вызова.

Я изучил различные методы, доступные в сети, чтобы не использовать обратное распространение ошибки дважды за один цикл. Кажется, нет смысла публиковать график.

Я изо всех сил старался исправить ошибку, но решения по-прежнему нет. Это мой первый раз в С.О. Пожалуйста, простите меня, если в описании есть что-то неясное.

Рассматриваемый код выглядит следующим образом (показан не весь, поскольку я не думаю, что это необходимо)

criterion = torch.nn.MSELoss().type(data_type) оптимизатор = torch.optim.Adam(net.parameters(), lr=learning_rate) image_queue = очередь.Очередь() # отдельный поток для вычисления значения, используемого основным потоком denoise_thread = Thread(target=lambda q, f, p: q.put(f(*p)), # q -> очередь, f -> func, p -> параметры args=(image_queue, non_local_means, [benchmark_image.clone().squeeze().cpu().detach().numpy(), 3])) denoise_thread.start() temp_benchmark = тестовое изображение.clone() # копия эталонного теста для промежуточных вычислений для меня в диапазоне (num_iter + 1): оптимизатор.zero_grad() выход = сеть (net_input) temp = эталонное_изображение - lagrange_multiplier loss_net = критерий(out, уменьшение_изображения) # эта потеря в обычном порядке в обратном направлении loss_red = критерий(out, temp) # здесь все идет не так total_loss = loss_net + mu * loss_red total_loss.backward() # НЕУДАЧА назад!!! # обновляет эталонное значение на каждой итерации определенное количество раз если я % 30 == 0: denoise_thread.join() temp_benchmark = image_queue.get() temp_benchmark = torch.from_numpy(temp_benchmark)[Нет, :].cuda() temp_benchmark.requires_grad_() # как и раньше, он используется для обновления значений, которые будут использоваться основным потоком denoise_thread = Thread(target=lambda q, f, p: q.put(f(*p)), args=(image_queue, non_local_means, [benchmark_image.clone().squeeze().cpu().detach().numpy(), 3])) denoise_thread.start() сравнительное_изображение = 1 / (бета + мю) * (бета * temp_benchmark + мю * (выход + lagrange_multiplier)) lagrange_multiplier = lagrange_multiplier + out - сравнительное_изображение оптимизатор.шаг() если denoise_thread.is_alive(): denoise_thread.join() Я боролся с этой проблемой уже несколько дней, и если какая-то часть моего описания неясна, дайте мне знать. Ваша помощь очень ценится! ;-)
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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