Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import torch
- import torch.nn as nn
- import torch.optim as optim
- import torchvision
- import torchvision.transforms as transforms
- from torch.utils.data import DataLoader
- from torch.optim.lr_scheduler import StepLR
- import torch
- import torch.nn as nn
- class HyperEfficientCNN(nn.Module):
- def __init__(self):
- super(HyperEfficientCNN, self).__init__()
- self.conv1 = nn.Conv2d(1, 8, kernel_size=3, padding=1)
- self.bn1 = nn.BatchNorm2d(8)
- self.relu1 = nn.ReLU()
- self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
- self.conv2 = nn.Conv2d(8, 8, kernel_size=3, padding=1)
- self.bn2 = nn.BatchNorm2d(8)
- self.relu2 = nn.ReLU()
- self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
- self.global_avg_pool = nn.AdaptiveAvgPool2d((1, 1))
- self.fc1 = nn.Linear(8, 10)
- def forward(self, x):
- x = self.pool1(self.relu1(self.bn1(self.conv1(x))))
- x = self.pool2(self.relu2(self.bn2(self.conv2(x))))
- x = self.global_avg_pool(x)
- x = x.view(x.size(0), -1)
- x = self.fc1(x)
- return x
- def count_parameters(model):
- return sum(p.numel() for p in model.parameters() if p.requires_grad)
- temp_model = HyperEfficientCNN()
- print(f"模型总参数量: {count_parameters(temp_model):,} 个")
- device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
- print(f"Using device: {device}")
- batch_size = 64
- learning_rate = 0.01
- num_epochs = 20
- transform = transforms.Compose([
- transforms.ToTensor(),
- transforms.Normalize((0.1307,), (0.3081,))
- ])
- train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
- test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True)
- train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
- test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)
- model = HyperEfficientCNN().to(device)
- print(f'The model has {count_parameters(model):,} trainable parameters.')
- criterion = nn.CrossEntropyLoss()
- optimizer = optim.Adam(model.parameters(), lr=learning_rate)
- scheduler = StepLR(optimizer, step_size=5, gamma=0.5)
- for epoch in range(num_epochs):
- model.train()
- for i, (images, labels) in enumerate(train_loader):
- images = images.to(device)
- labels = labels.to(device)
- outputs = model(images)
- loss = criterion(outputs, labels)
- optimizer.zero_grad()
- loss.backward()
- optimizer.step()
- if (i + 1) % 200 == 0:
- print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')
- scheduler.step()
- print(f"Epoch {epoch+1} finished. Current learning rate: {scheduler.get_last_lr()[0]}")
- print("\nTraining Finished!")
- model.eval()
- with torch.no_grad():
- correct = 0
- total = 0
- for images, labels in test_loader:
- images = images.to(device)
- labels = labels.to(device)
- outputs = model(images)
- _, predicted = torch.max(outputs.data, 1)
- total += labels.size(0)
- correct += (predicted == labels).sum().item()
- accuracy = 100 * correct / total
- print(f'\nAccuracy of the HyperEfficientCNN model on the {total} test images: {accuracy:.2f} %')
Advertisement
Add Comment
Please, Sign In to add comment