Что не так с моим диффузным обучением, которое не позволяет модели учиться?Python

Программы на Python
Anonymous
Что не так с моим диффузным обучением, которое не позволяет модели учиться?

Сообщение Anonymous »

Я новичок в моделях диффузии, и я впервые обучаю диффузию для перевода изображения в изображение (суперразрешение). Я хочу обучить модель диффузии и использую UNet2DModel из библиотеки диффузоров, и это модель:

Код: Выделить всё

model = UNet2DModel(
sample_size= (576, 768),  # the target image resolution
in_channels=6,  # the number of input channels, 3 for RGB images
out_channels=3,  # the number of output channels
layers_per_block=2,  # how many ResNet layers to use per UNet block
# block_out_channels=(128, 128, 256, 256, 512, 512),  # the number of output channels for each UNet block
block_out_channels=(16, 16, 32, 32, 64, 64),  # the number of output channels for each UNet block
norm_num_groups=4,
down_block_types=(
"DownBlock2D",  # a regular ResNet downsampling block
"DownBlock2D",
"DownBlock2D",
"DownBlock2D",
"AttnDownBlock2D",  # a ResNet downsampling block with spatial self-attention
"DownBlock2D",
),
up_block_types=(
"UpBlock2D",  # a regular ResNet upsampling block
"AttnUpBlock2D",  # a ResNet upsampling block with spatial self-attention
"UpBlock2D",
"UpBlock2D",
"UpBlock2D",
"UpBlock2D",
),
)
а это мой цикл тренировок:

Код: Выделить всё

def train_network(model, train_loader, val_loader, epochs, device, writer):
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-2, weight_decay=1e-6)
criterion = torch.nn.MSELoss()
diffusion_scheduler = DDPMScheduler(num_train_timesteps=1000)  # Diffusion Scheduler
lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=20)
best_loss = float('inf')
train_losses = []
val_losses = []
global_step = 0  # Track global step for TensorBoard logging

for epoch in range(epochs):
model.train()
running_loss = 0.0
for i, (inputs, targets) in enumerate(tqdm(train_loader)):
inputs, targets = inputs.to(device), targets.to(device)
inputs.requires_grad_(True)
targets.requires_grad_(True)
optimizer.zero_grad()
# Adding noise
noise = torch.randn(targets.shape).to(device)
timesteps = torch.randint(0, diffusion_scheduler.config.num_train_timesteps, (inputs.size(0),), device=device)
noisy_targets = diffusion_scheduler.add_noise(targets, noise, timesteps).to(device)

# Combine inputs with the noisy targets for model input
combined_input = torch.cat((inputs, noisy_targets), dim=1).to(device)

# Predict the noise added at the chosen timestep
predicted_noise = model(combined_input, timesteps)
predicted_noise = predicted_noise.sample

# Compute the loss between predicted noise and actual noise
loss = criterion(predicted_noise.float(), noise.float())
loss.backward()

optimizer.step()

running_loss += loss.item()
global_step += 1#

epoch_loss = running_loss / len(train_loader.dataset)
train_losses.append(epoch_loss)
writer.add_scalar('Loss/train_epoch', epoch_loss, epoch)
writer.add_scalar('Learning Rate', optimizer.param_groups[0]['lr'], epoch)
# Validation
val_loss, avg_ssim, avg_psnr, avg_mae = validate(model, val_loader, criterion, device, writer, epoch, diffusion_scheduler)
val_losses.append(val_loss)

if val_loss < best_loss:
best_loss = val_loss
save_model(model, f'diffusion_{epoch}_{best_loss: .3f}.pth', best_loss)

lr_scheduler.step()

writer.close()
return train_losses, val_losses
Что-то не так с моими тренировками, но я не могу понять, что именно не так. Модель вообще не обучается, метрики очень низкие и никакого прогресса вообще нет, хотя я дал ей большой набор данных и обучал ее достаточное время, но она все равно просто генерирует шум (то, что я рисую и вижу, это цели- предсказание модели; потому что модель должна предсказывать шум).
Что не так в моем обучении, что не позволяет модели учиться?
Что я сделал, так это записал гиперпараметры в журнал посмотрите, нет ли с ними каких-либо проблем, которых нет. Я изменил гиперпараметры и не сработало. Поменял модель, а проблема все та же, поэтому пришел к выводу, что с моим таринингом что-то не так, но не мог понять, что именно.

Подробнее здесь: https://stackoverflow.com/questions/789 ... l-to-learn

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