# Codeblock 16c def backward_diffusion(self, current_image, predicted_noise, t): #(1) denoised_image = (current_image - (self.sqrt_one_minus_alphas_cum_prod[t] * predicted_noise)) / self.sqrt_alphas_cum_prod[t] #(2) denoised_image = 2 * (denoised_image - denoised_image.min()) / (denoised_image.max() - denoised_image.min()) - 1 #(3) current_prediction = current_image - ((self.betas[t] * predicted_noise) / (self.sqrt_one_minus_alphas_cum_prod[t])) #(4) current_prediction = current_prediction / torch.sqrt(self.alphas[t]) #(5) if t == 0: #(6) return current_prediction, denoised_image else: variance = (1 - self.alphas_cum_prod[t-1]) / (1. - self.alphas_cum_prod[t]) #(7) variance = variance * self.betas[t] #(8) sigma = variance ** 0.5 z = torch.randn(current_image.shape).to(DEVICE) current_prediction = current_prediction + sigma*z return current_prediction, denoised_image