Repository navigation
Expand file tree
/
Copy pathautoencoder.py
More file actions
67 lines (47 loc) · 2.06 KB
/
Copy pathautoencoder.py
File metadata and controls
67 lines (47 loc) · 2.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import torch
from torch import nn
class ConvEncoder(nn.Module):
def __init__(self,conv_channels=[32,64,128],bn=False,latent_dim=512,final_dim=4):
super().__init__()
self.latent_dim=latent_dim
conv_layers=[]
for c in conv_channels:
conv_layers.append(nn.LazyConv2d(out_channels=c,kernel_size=4,stride=2,padding=1))
if bn:
conv_layers.append(nn.BatchNorm2d(c))
conv_layers.append(nn.GELU())
conv_layers.append(nn.AdaptiveAvgPool2d(final_dim))
conv_layers.append(nn.Flatten())
conv_layers.append(nn.LazyLinear(latent_dim))
self.model=nn.Sequential(*conv_layers)
def forward(self,x):
return self.model(x)
class ConvDecoder(nn.Module):
def __init__(self,conv_channels=[64,32,16],out_channels=1,bn=False,latent_dim=512,target_side=96):
super().__init__()
conv_layers=[]
self.downsampled_side=target_side//2**len(conv_channels)
self.predecoder=nn.LazyLinear(conv_channels[0]*self.downsampled_side**2)
for c in conv_channels:
conv_layers.append(nn.LazyConvTranspose2d(out_channels=c,kernel_size=4,stride=2,padding=1))
if bn:
conv_layers.append(nn.BatchNorm2d(c))
conv_layers.append(nn.GELU())
conv_layers.append(nn.LazyConvTranspose2d(out_channels=out_channels,kernel_size=3,stride=1,padding=1))
conv_layers.append(nn.Sigmoid())
self.model=nn.Sequential(*conv_layers)
def forward(self,x):
#reshape features
bs=x.shape[0]
x=self.predecoder(x)
x=x.view(bs,-1,self.downsampled_side,self.downsampled_side)
return self.model(x)
class AE(nn.Module):
def __init__(self,encoder,decoder):
super().__init__()
self.encoder=encoder
self.decoder=decoder
def forward(self,x):
z=self.encoder(x)
x2=self.decoder(z)
return x2