2024-07-08 10:07:36 +08:00

50 lines
1.4 KiB
Python

from . import gaussian_diffusion as gd
from .respace import SpacedDiffusion, space_timesteps
def create_diffusion(
*,
steps=1000,
learn_sigma=True,
sigma_small=False,
noise_schedule="linear",
use_kl=False,
predict_type='epsilon',
rescale_timesteps=False,
rescale_learned_sigmas=False,
timestep_respacing="",
mse_loss_weight_type='constant',
beta_start=0.0001,
beta_end=0.02,
noise_offset=0.0,
):
betas = gd.get_named_beta_schedule(noise_schedule, steps, beta_start, beta_end)
if use_kl:
loss_type = gd.LossType.RESCALED_KL
elif rescale_learned_sigmas:
loss_type = gd.LossType.RESCALED_MSE
else:
loss_type = gd.LossType.MSE
if timestep_respacing is None or timestep_respacing == "":
timestep_respacing = [steps]
mean_type = gd.predict_type_dict[predict_type]
return SpacedDiffusion(
use_timesteps=space_timesteps(steps, timestep_respacing),
betas=betas,
model_mean_type=mean_type,
model_var_type=(
(
gd.ModelVarType.FIXED_LARGE
if not sigma_small
else gd.ModelVarType.FIXED_SMALL
)
if not learn_sigma
else gd.ModelVarType.LEARNED_RANGE
),
loss_type=loss_type,
rescale_timesteps=rescale_timesteps,
mse_loss_weight_type=mse_loss_weight_type,
noise_offset=noise_offset,
)