-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmodel_mnist.py
executable file
·132 lines (111 loc) · 3.86 KB
/
model_mnist.py
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import torch
import torch.nn as nn
import torch.nn.functional as F
from collections import OrderedDict
torch.manual_seed(10)
class LinAutoencoder(nn.Module):
def __init__(self, mid_dim=20, latent_dim=10):
super(LinAutoencoder, self).__init__()
## encoder layers ##
self.fc1 = nn.Linear(32*32, mid_dim)
self.fc2 = nn.Linear(mid_dim, latent_dim)
## decoder layers ##
self.fc3 = nn.Linear(latent_dim, mid_dim)
self.fc4 = nn.Linear(mid_dim, 32*32)
def transformer(self, x):
x = x.view(-1, 32*32)
x = self.fc1(x)
return x
def encoder(self, x):
# add layer, with relu activation function
# and maxpooling after
x = self.transformer(x)
x = self.fc2(F.relu(x))
return x
def decoder(self, x):
# upsample, followed by a conv layer, with relu activation function
# upsample again, output should have a sigmoid applied
x = F.relu(self.fc3(F.relu(x)))
x = F.sigmoid(self.fc4(x))
x = x.view(-1, 1, 32, 32)
return x
def i_transformer(self, x):
x = self.fc2(F.relu(x))
x = self.decoder(x)
return x
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
class ConvAutoencoder(nn.Module):
def __init__(self):
super(ConvAutoencoder, self).__init__()
## encoder layers ##
self.conv1 = nn.Conv2d(1, 16, 3, padding=1)
self.conv2 = nn.Conv2d(16, 4, 3, padding=1)
# self.pool = nn.MaxPool2d(2, 2)
## decoder layers ##
self.conv3 = nn.Conv2d(4, 16, 3, padding=1)
self.conv4 = nn.Conv2d(16, 1, 3, padding=1)
def transformer(self, x):
x = self.conv1(x)
return x
def encoder(self, x):
# add layer, with relu activation function
# and maxpooling after
x = F.relu(self.transformer(x))
x = F.relu(self.conv2(x))
return x
def decoder(self, x):
# upsample, followed by a conv layer, with relu activation function
# upsample again, output should have a sigmoid applied
# x = F.upsample(x, scale_factor=2, mode='nearest')
x = F.relu(self.conv3(x))
x = F.sigmoid(self.conv4(x))
return x
def i_transformer(self, x):
x = F.relu(x)
x = F.relu(self.conv2(x))
x = self.decoder(x)
return x
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
class LeNet5(nn.Module):
"""
Input - 1x32x32
C1 - 6@28x28 (5x5 kernel)
tanh
S2 - 6@14x14 (2x2 kernel, stride 2) Subsampling
C3 - 16@10x10 (5x5 kernel, complicated shit)
tanh
S4 - 16@5x5 (2x2 kernel, stride 2) Subsampling
C5 - 120@1x1 (5x5 kernel)
F6 - 84
tanh
F7 - 10 (Output)
"""
def __init__(self):
super(LeNet5, self).__init__()
self.convnet = nn.Sequential(OrderedDict([
('c1', nn.Conv2d(1, 6, kernel_size=(5, 5))),
('relu1', nn.ReLU()),
('s2', nn.MaxPool2d(kernel_size=(2, 2), stride=2)),
('c3', nn.Conv2d(6, 16, kernel_size=(5, 5))),
('relu3', nn.ReLU()),
('s4', nn.MaxPool2d(kernel_size=(2, 2), stride=2)),
('c5', nn.Conv2d(16, 120, kernel_size=(5, 5))),
('relu5', nn.ReLU())
]))
self.fc = nn.Sequential(OrderedDict([
('f6', nn.Linear(120, 84)),
('relu6', nn.ReLU()),
('f7', nn.Linear(84, 10)),
('sig7', nn.LogSoftmax(dim=-1))
]))
def forward(self, img):
output = self.convnet(img)
output = output.view(img.size(0), -1)
output = self.fc(output)
return output