Ошибка Autograd, вызванная ReLU в Pytorch?Python

Программы на Python
Ответить
Anonymous
 Ошибка Autograd, вызванная ReLU в Pytorch?

Сообщение 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!")


Подробнее здесь: https://stackoverflow.com/questions/792 ... in-pytorch
Ответить

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

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

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

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

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