-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStandardCNN.py
145 lines (117 loc) · 5.42 KB
/
StandardCNN.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
133
134
135
136
137
138
139
140
141
142
143
144
145
import torch
import torch.nn as nn
import torchvision.models as models
import torch.nn.functional as F
# from torchviz import make_dot
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
class ResNet50(nn.Module):
def __init__(self, num_classes, input_channels=3):
super(ResNet50, self).__init__()
self.resnet = models.resnet50(pretrained=True)
# Modify the first convolutional layer to accept input_channels
if input_channels != 3:
self.resnet.conv1 = nn.Conv2d(input_channels, 64, kernel_size=7, stride=2, padding=3, bias=False)
# Replace the fully connected layer with a flexible one
num_features = self.resnet.fc.in_features
self.resnet.fc = nn.Linear(num_features, num_classes)
def forward(self, x):
return self.resnet(x)
def train_model(model, train_loader, criterion, optimizer, num_epochs):
model.to(device)
model.train()
for epoch in range(num_epochs):
running_loss = 0.0
for i, (inputs, labels) in enumerate(train_loader):
inputs = inputs.to(device)
labels = labels.to(device)
optimizer.zero_grad()
outputs = model(inputs)
try:
assert not torch.any(torch.isnan(outputs)), "Model output contains NaN values."
except:
print("The new loop fucked it up")
exit()
loss = criterion(outputs, labels,epoch)
loss.backward()
try:
assert not torch.any(torch.isnan(model(inputs))), "Model output contains only NaN values."
except:
print("The backward fucked it up")
exit()
optimizer.step()
try:
assert not torch.any(torch.isnan(model(inputs))), "Model output contains only NaN values."
except:
print("The optimizer fucked it up")
exit()
running_loss += loss.item()
print(f'Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(train_loader)}')
class SimpleCNN(nn.Module):
def __init__(self, classes, num_input_channels=3):
super(SimpleCNN, self).__init__()
self.num_input_channels = num_input_channels
self.num_classes = classes
self.conv1 = nn.Conv2d(num_input_channels, 16, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
self.fc1 = nn.Linear(32 * 56 * 56, 128) # Adjusted input size
self.fc2 = nn.Linear(128, classes)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 32 * 56 * 56) # Properly flatten the output
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
def train_model(model, train_loader, criterion, optimizer, num_epochs):
model.to(device)
model.train()
for epoch in range(num_epochs):
running_loss = 0.0
for i, (inputs, labels) in enumerate(train_loader):
inputs = inputs.to(device)
labels = labels.to(device)
model.train()
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels,epoch, i)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f'Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(train_loader)}')
# make_dot(loss, params=dict(model.named_parameters())).render("computation_graph", format="png")
class SimplestCNN(nn.Module):
def __init__(self, classes, num_input_channels=3):
super(SimplestCNN, self).__init__()
self.num_input_channels = num_input_channels
self.num_classes = classes
self.conv1 = nn.Conv2d(num_input_channels, 8, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.adaptive_pool = nn.AdaptiveAvgPool2d((1, 1)) # Adaptive pooling to ensure fixed size output
self.fc1 = nn.Linear(8, 64) # 8 channels from conv1
self.fc2 = nn.Linear(64, classes)
def forward(self, x):
x = F.relu(self.conv1(x))
x = self.pool(x)
x = self.adaptive_pool(x) # Adaptive pooling to (1, 1)
x = x.view(x.size(0), -1) # Flatten the tensor
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
def train_model(model, train_loader, criterion, optimizer, num_epochs):
model.to(device)
model.train()
for epoch in range(num_epochs):
running_loss = 0.0
for i, (inputs, labels) in enumerate(train_loader):
inputs = inputs.to(device)
labels = labels.to(device)
optimizer.zero_grad()
outputs = model(inputs)
# loss = criterion(outputs, labels)
loss = criterion(outputs, labels,epoch, i)
loss.backward()
# torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=0.0)
optimizer.step()
running_loss += loss.item()
print(f'Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(train_loader)}')