Commit ·
2dfdcd4
0
Parent(s):
AI417 A5 AlexNet model
Browse files- .gitattributes +35 -0
- README.md +3 -0
- alexnet_weights.pth +3 -0
- hubconf.py +11 -0
- model.py +51 -0
- train.py +74 -0
.gitattributes
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
README.md
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: apache-2.0
|
| 3 |
+
---
|
alexnet_weights.pth
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ac4b336b945369337fa90a3ddb7999979aad01e91ce51480c887ce9286231c5b
|
| 3 |
+
size 24202694
|
hubconf.py
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
from model import CNNModel
|
| 3 |
+
|
| 4 |
+
def AlexNet(pretrained=True):
|
| 5 |
+
model = CNNModel()
|
| 6 |
+
|
| 7 |
+
if pretrained:
|
| 8 |
+
state_dict = torch.load("alexnet_weights.pth", map_location="cpu")
|
| 9 |
+
model.load_state_dict(state_dict)
|
| 10 |
+
|
| 11 |
+
return model
|
model.py
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
import torch.nn as nn
|
| 3 |
+
import torch.optim as optim
|
| 4 |
+
|
| 5 |
+
class CNNModel(nn.Module):
|
| 6 |
+
|
| 7 |
+
def __init__(self):
|
| 8 |
+
super(CNNModel, self).__init__()
|
| 9 |
+
self.conv1 = nn.Conv2d(3, 64, kernel_size=5, padding=2)
|
| 10 |
+
self.relu1 = nn.ReLU()
|
| 11 |
+
self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
|
| 12 |
+
self.conv2 = nn.Conv2d(64, 128, kernel_size=5, padding=2)
|
| 13 |
+
self.relu2 = nn.ReLU()
|
| 14 |
+
self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
|
| 15 |
+
self.conv3 = nn.Conv2d(128, 256, kernel_size=3, padding=1)
|
| 16 |
+
self.relu3 = nn.ReLU()
|
| 17 |
+
self.pool3 = nn.MaxPool2d(kernel_size=2, stride=2)
|
| 18 |
+
self.conv4 = nn.Conv2d(256, 384, kernel_size=5, padding=1)
|
| 19 |
+
self.relu4 = nn.ReLU()
|
| 20 |
+
self.conv5 = nn.Conv2d(384, 256, kernel_size=1, padding=0)
|
| 21 |
+
self.relu5 = nn.ReLU()
|
| 22 |
+
self.avgpool = nn.AdaptiveAvgPool2d((3, 3))
|
| 23 |
+
self.flatten = nn.Flatten()
|
| 24 |
+
self.dropout1 = nn.Dropout(p=0.1)
|
| 25 |
+
self.fc1 = nn.Linear(256 * 3 * 3, 1024)
|
| 26 |
+
self.relu6 = nn.ReLU()
|
| 27 |
+
self.dropout2 = nn.Dropout(p=0.1)
|
| 28 |
+
self.fc2 = nn.Linear(1024, 512)
|
| 29 |
+
self.relu7 = nn.ReLU()
|
| 30 |
+
self.fc3 = nn.Linear(512, 200)
|
| 31 |
+
self.softmax = nn.Softmax(dim=1)
|
| 32 |
+
|
| 33 |
+
def forward(self, x):
|
| 34 |
+
x = self.pool1(self.relu1(self.conv1(x)))
|
| 35 |
+
x = self.pool2(self.relu2(self.conv2(x)))
|
| 36 |
+
x = self.pool3(self.relu3(self.conv3(x)))
|
| 37 |
+
x = self.relu4(self.conv4(x))
|
| 38 |
+
x = self.relu5(self.conv5(x))
|
| 39 |
+
x = self.avgpool(x)
|
| 40 |
+
x = self.flatten(x)
|
| 41 |
+
x = self.dropout1(x)
|
| 42 |
+
x = self.relu6(self.fc1(x))
|
| 43 |
+
x = self.dropout2(x)
|
| 44 |
+
x = self.relu7(self.fc2(x))
|
| 45 |
+
x = self.fc3(x)
|
| 46 |
+
x = self.softmax(x)
|
| 47 |
+
return x
|
| 48 |
+
|
| 49 |
+
model = CNNModel()
|
| 50 |
+
loss_fn = nn.NLLLoss()
|
| 51 |
+
optimizer = optim.Adam(model.parameters(), lr=0.0003)
|
train.py
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import time
|
| 2 |
+
import torch as tr
|
| 3 |
+
import torchvision as tv
|
| 4 |
+
import torchvision.transforms as transforms
|
| 5 |
+
from model import model, loss_fn, optimizer
|
| 6 |
+
|
| 7 |
+
def main():
|
| 8 |
+
batch_size = 128
|
| 9 |
+
epochs = 10
|
| 10 |
+
transform = transforms.Compose([
|
| 11 |
+
transforms.Resize((64, 64)),
|
| 12 |
+
transforms.ToTensor()])
|
| 13 |
+
|
| 14 |
+
trn_dataset = tv.datasets.ImageFolder(
|
| 15 |
+
root='data/tiny-imagenet-200/train',
|
| 16 |
+
transform=transform)
|
| 17 |
+
|
| 18 |
+
evl_dataset = tv.datasets.ImageFolder(
|
| 19 |
+
root='data/tiny-imagenet-200/val',
|
| 20 |
+
transform=transform)
|
| 21 |
+
|
| 22 |
+
trn_loader = tr.utils.data.DataLoader(
|
| 23 |
+
trn_dataset,
|
| 24 |
+
batch_size=batch_size,
|
| 25 |
+
shuffle=True,
|
| 26 |
+
num_workers=8,
|
| 27 |
+
pin_memory=True)
|
| 28 |
+
|
| 29 |
+
evl_loader = tr.utils.data.DataLoader(
|
| 30 |
+
evl_dataset,
|
| 31 |
+
batch_size=batch_size,
|
| 32 |
+
shuffle=False,
|
| 33 |
+
num_workers=8,
|
| 34 |
+
pin_memory=True)
|
| 35 |
+
|
| 36 |
+
device = tr.device("cuda" if tr.cuda.is_available() else "cpu")
|
| 37 |
+
model.to(device)
|
| 38 |
+
print("Running on:", device)
|
| 39 |
+
start_time = time.time()
|
| 40 |
+
for epoch in range(1, epochs + 1):
|
| 41 |
+
model.train()
|
| 42 |
+
for images, labels in trn_loader:
|
| 43 |
+
images = images.to(device)
|
| 44 |
+
labels = labels.to(device)
|
| 45 |
+
optimizer.zero_grad()
|
| 46 |
+
output = model(images)
|
| 47 |
+
loss = loss_fn(tr.log(tr.clamp(output, min=1e-9)), labels)
|
| 48 |
+
loss.backward()
|
| 49 |
+
optimizer.step()
|
| 50 |
+
model.eval()
|
| 51 |
+
correct = 0
|
| 52 |
+
total = 0
|
| 53 |
+
|
| 54 |
+
with tr.no_grad():
|
| 55 |
+
for images, labels in evl_loader:
|
| 56 |
+
images = images.to(device)
|
| 57 |
+
labels = labels.to(device)
|
| 58 |
+
output = model(images)
|
| 59 |
+
preds = tr.argmax(output, dim=1)
|
| 60 |
+
correct += tr.sum(preds == labels).item()
|
| 61 |
+
total += labels.size(0)
|
| 62 |
+
accuracy = correct / total
|
| 63 |
+
print(f"Epoch {epoch}/{epochs} - Loss: {loss.item():.4f} - Accuracy: {accuracy*100:.2f}%")
|
| 64 |
+
|
| 65 |
+
end_time = time.time()
|
| 66 |
+
|
| 67 |
+
print("Training finished")
|
| 68 |
+
print(f"Final Loss: {loss.item():.4f}")
|
| 69 |
+
print(f"Final Accuracy: {accuracy*100:.2f}%")
|
| 70 |
+
print(f"Total Time: {end_time - start_time:.2f} seconds")
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
if __name__ == "__main__":
|
| 74 |
+
main()
|