diff --git a/denoising_diffusion_pytorch/denoising_diffusion_pytorch.py b/denoising_diffusion_pytorch/denoising_diffusion_pytorch.py index aabe5b8..27d1774 100644 --- a/denoising_diffusion_pytorch/denoising_diffusion_pytorch.py +++ b/denoising_diffusion_pytorch/denoising_diffusion_pytorch.py @@ -61,9 +61,6 @@ def convert_image_to_fn(img_type, image): return image.convert(img_type) return image -def l2norm(t): - return F.normalize(t, dim = -1) - # normalization functions def normalize_to_neg_one_to_one(img): @@ -239,9 +236,10 @@ class LinearAttention(nn.Module): class Attention(nn.Module): def __init__(self, dim, heads = 4, dim_head = 32, scale = 10): super().__init__() - self.scale = scale + self.scale = dim_head ** -0.5 self.heads = heads hidden_dim = dim_head * heads + self.to_qkv = nn.Conv2d(dim, hidden_dim * 3, 1, bias = False) self.to_out = nn.Conv2d(hidden_dim, dim, 1) @@ -250,11 +248,12 @@ class Attention(nn.Module): qkv = self.to_qkv(x).chunk(3, dim = 1) q, k, v = map(lambda t: rearrange(t, 'b (h c) x y -> b h c (x y)', h = self.heads), qkv) - q, k = map(l2norm, (q, k)) + q = q * self.scale - sim = einsum('b h d i, b h d j -> b h i j', q, k) * self.scale + sim = einsum('b h d i, b h d j -> b h i j', q, k) attn = sim.softmax(dim = -1) out = einsum('b h i j, b h d j -> b h i d', attn, v) + out = rearrange(out, 'b h (x y) d -> b (h d) x y', x = h, y = w) return self.to_out(out) diff --git a/setup.py b/setup.py index 18f1e14..780cbf9 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages setup( name = 'denoising-diffusion-pytorch', packages = find_packages(), - version = '0.27.12', + version = '0.28.0', license='MIT', description = 'Denoising Diffusion Probabilistic Models - Pytorch', author = 'Phil Wang',