# Codeblock 21 def train(): optimizer = Adam(model.parameters(), lr=LEARNING_RATE) #(1) loss_function = nn.MSELoss() #(2) losses = [] for epoch in range(NUM_EPOCHS): print(f'Epoch no {epoch}') for images, _ in tqdm(loader): optimizer.zero_grad() images = images.float().to(DEVICE) #(3) noise = torch.randn_like(images) #(4) t = torch.randint(0, NUM_TIMESTEPS, (BATCH_SIZE,)) #(5) noisy_images = noise_scheduler.forward_diffusion(images, noise, t).to(DEVICE) #(6) predicted_noise = model(noisy_images, t) #(7) loss = loss_function(predicted_noise, noise) #(8) losses.append(loss.item()) loss.backward() optimizer.step() return losses