Я использую остаточную нейронную сеть для задачи классификации. Каким-то образом добавление или отсутствие активации ReLU приводит к сбою автограда. Буду признателен за любую информацию о причине этого? Это не может иметь никакого смысла. ReLU — это не операция на месте, не так ли? Сообщение об ошибке:
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation
Вот архитектура сети. Третья после последней строки — это то, что вызывает проблему, если она не закомментирована.
class ResidualBlock(nn.Module):
def __init__(self, num_filters, kernel_size):
super(ResidualBlock, self).__init__()
self.conv1 = nn.Conv1d(num_filters, num_filters, kernel_size=kernel_size, padding='same')
self.bn1 = nn.BatchNorm1d(num_filters)
self.conv2 = nn.Conv1d(num_filters, num_filters, kernel_size=kernel_size, padding='same')
self.bn2 = nn.BatchNorm1d(num_filters)
def forward(self, x):
shortcut = x
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out = F.relu(out) # causes the issue when not commented out
out += shortcut
return out
Ниже приведен минимальный рабочий пример. Я использую Python 3.12 и Torch 2.5.1.
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader, TensorDataset
# Define the ResidualBlock
class ResidualBlock(nn.Module):
def __init__(self, num_filters, kernel_size):
super(ResidualBlock, self).__init__()
self.conv1 = nn.Conv1d(num_filters, num_filters, kernel_size=kernel_size, padding='same')
self.bn1 = nn.BatchNorm1d(num_filters)
self.conv2 = nn.Conv1d(num_filters, num_filters, kernel_size=kernel_size, padding='same')
self.bn2 = nn.BatchNorm1d(num_filters)
def forward(self, x):
shortcut = x
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out = F.relu(out) # causes the issue
out += shortcut
return out
class SimpleModel(nn.Module):
def __init__(self, num_filters, kernel_size):
super(SimpleModel, self).__init__()
self.res_block = ResidualBlock(num_filters, kernel_size)
self.fc = nn.Linear(num_filters, 1)
def forward(self, x):
x = self.res_block(x)
x = x.mean(dim=2)
x = self.fc(x)
return x
torch.manual_seed(42)
num_samples = 1000
sequence_length = 32
num_filters = 16
X = torch.randn(num_samples, num_filters, sequence_length) # Random input
y = torch.sum(X, dim=(1, 2), keepdim=True) # Simple target (sum of all values)
dataset = TensorDataset(X, y)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
model = SimpleModel(num_filters=num_filters, kernel_size=3)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
epochs = 5
for epoch in range(epochs):
model.train()
epoch_loss = 0.0
for batch_X, batch_y in dataloader:
optimizer.zero_grad()
outputs = model(batch_X)
loss = criterion(outputs, batch_y)
loss.backward()
optimizer.step()
epoch_loss += loss.item()
print(f"Epoch {epoch+1}/{epochs}, Loss: {epoch_loss/len(dataloader):.4f}")
print("Training complete!")
Подробнее здесь: https://stackoverflow.com/questions/792 ... in-pytorch
Ошибка Autograd, вызванная ReLU в Pytorch? ⇐ Python
Программы на Python
-
Anonymous
1732747315
Anonymous
Я использую остаточную нейронную сеть для задачи классификации. Каким-то образом добавление или отсутствие активации ReLU приводит к сбою автограда. Буду признателен за любую информацию о причине этого? Это не может иметь никакого смысла. ReLU — это не операция на месте, не так ли? Сообщение об ошибке:
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation
Вот архитектура сети. Третья после последней строки — это то, что вызывает проблему, если она не закомментирована.
class ResidualBlock(nn.Module):
def __init__(self, num_filters, kernel_size):
super(ResidualBlock, self).__init__()
self.conv1 = nn.Conv1d(num_filters, num_filters, kernel_size=kernel_size, padding='same')
self.bn1 = nn.BatchNorm1d(num_filters)
self.conv2 = nn.Conv1d(num_filters, num_filters, kernel_size=kernel_size, padding='same')
self.bn2 = nn.BatchNorm1d(num_filters)
def forward(self, x):
shortcut = x
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out = F.relu(out) # causes the issue when not commented out
out += shortcut
return out
Ниже приведен минимальный рабочий пример. Я использую Python 3.12 и Torch 2.5.1.
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader, TensorDataset
# Define the ResidualBlock
class ResidualBlock(nn.Module):
def __init__(self, num_filters, kernel_size):
super(ResidualBlock, self).__init__()
self.conv1 = nn.Conv1d(num_filters, num_filters, kernel_size=kernel_size, padding='same')
self.bn1 = nn.BatchNorm1d(num_filters)
self.conv2 = nn.Conv1d(num_filters, num_filters, kernel_size=kernel_size, padding='same')
self.bn2 = nn.BatchNorm1d(num_filters)
def forward(self, x):
shortcut = x
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out = F.relu(out) # causes the issue
out += shortcut
return out
class SimpleModel(nn.Module):
def __init__(self, num_filters, kernel_size):
super(SimpleModel, self).__init__()
self.res_block = ResidualBlock(num_filters, kernel_size)
self.fc = nn.Linear(num_filters, 1)
def forward(self, x):
x = self.res_block(x)
x = x.mean(dim=2)
x = self.fc(x)
return x
torch.manual_seed(42)
num_samples = 1000
sequence_length = 32
num_filters = 16
X = torch.randn(num_samples, num_filters, sequence_length) # Random input
y = torch.sum(X, dim=(1, 2), keepdim=True) # Simple target (sum of all values)
dataset = TensorDataset(X, y)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
model = SimpleModel(num_filters=num_filters, kernel_size=3)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
epochs = 5
for epoch in range(epochs):
model.train()
epoch_loss = 0.0
for batch_X, batch_y in dataloader:
optimizer.zero_grad()
outputs = model(batch_X)
loss = criterion(outputs, batch_y)
loss.backward()
optimizer.step()
epoch_loss += loss.item()
print(f"Epoch {epoch+1}/{epochs}, Loss: {epoch_loss/len(dataloader):.4f}")
print("Training complete!")
Подробнее здесь: [url]https://stackoverflow.com/questions/79232069/autograd-error-caused-by-relu-in-pytorch[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия