实验 6 指南

GoogLeNet 的图像分类

复制代码后依次运行下面命令

python3 net_model.py
python3 train.py
python3 test.py

net_model.py

import torch
import torch.nn as nn
import torch.nn.functional as F

class InceptionA(nn.Module):
	def __init__(self, in_channels):
		super(InceptionA, self).__init__()
		self.branch3x3_1 = nn.Conv2d(in_channels, 16, kernel_size=1)
		self.branch3x3_2 = nn.Conv2d(16, 24, kernel_size=3, padding=1)
		self.branch3x3_3 = nn.Conv2d(24, 24, kernel_size=3, padding=1)

		self.branch5x5_1 = nn.Conv2d(in_channels, 16, kernel_size=1)
		self.branch5x5_2 = nn.Conv2d(16, 24, kernel_size=5, padding=2)

		self.branch1x1 = nn.Conv2d(in_channels, 16, kernel_size=1)

		self.branch_pool = nn.Conv2d(in_channels, 24, kernel_size=1)

	def forward(self, x):
		branch3x3 = self.branch3x3_1(x)
		branch3x3 = self.branch3x3_2(branch3x3)
		branch3x3 = self.branch3x3_3(branch3x3)

		branch5x5 = self.branch5x5_1(x)
		branch5x5 = self.branch5x5_2(branch5x5)

		branch1x1 = self.branch1x1(x)

		branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)
		branch_pool = self.branch_pool(branch_pool)

		outputs = [branch1x1, branch5x5, branch3x3, branch_pool]
		return torch.cat(outputs, dim=1)

class GoogLeNet(nn.Module):
	def __init__(self):
		super(GoogLeNet, self).__init__()
		self.conv1 = nn.Conv2d(3, 10, kernel_size=5)
		self.incep1 = InceptionA(in_channels=10)

		self.conv2 = nn.Conv2d(88, 20, kernel_size=5)
		self.incep2 = InceptionA(in_channels=20)

		self.mp = nn.MaxPool2d(2)
		self.fc = nn.Linear(2200, 10)	# 5 * 5 * 88
		# self.cls = nn.Softmax(dim=1)

	def forward(self, x):
		x = F.relu(self.mp(self.conv1(x)))
		x = self.incep1(x)
		x = F.relu(self.mp(self.conv2(x)))
		x = self.incep2(x)
		x = x.view(x.size(0), -1)
		x = self.fc(x)
		# x = self.cls(x)
		return x

if __name__ == "__main__":
	myNet = GoogLeNet()
	print(myNet)

train.py

from net_model import GoogLeNet
import time
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from torchvision import transforms
from torchvision.datasets import CIFAR10
from torch.utils.data import DataLoader

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=(0.5, 0.5, 0.5),
                         std=(0.5, 0.5, 0.5))
])

train_set = CIFAR10(
    root='./cifar-10',
    train=True,
    download=True,
    transform=transform
)

train_loader = DataLoader(
    train_set,
    batch_size = 100,
    shuffle = True
)

net = GoogLeNet().cuda()
optimizer = torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.5)
loss_func = nn.CrossEntropyLoss()

start_time = time.time()
epochs = 10
epoch_loss = []
for epoch in range(epochs):
	running_loss = 0
	for i, (inputs, labels) in enumerate(train_loader):
		inputs = torch.tensor(inputs).type(torch.FloatTensor).cuda()
		labels = torch.tensor(labels).type(torch.LongTensor).cuda()

		out = net(inputs)
		loss = loss_func(out, labels)
		optimizer.zero_grad()
		loss.backward()
		optimizer.step()

		running_loss += loss.item()
		avr_loss = running_loss / (i+1)
	epoch_loss.append(avr_loss)
	print('epoch %d, loss: %.3f' % (epoch, avr_loss))

end_time = time.time()
print('Finished training, time used: %.3f' % (end_time - start_time))

plt.figure(figsize=(8, 5), dpi=150)
plt.plot(epoch_loss, c='r')
# plt.savefig('./document/figure/loss.pdf')
plt.show()
torch.save(net, 'net.pkl')

test.py

import torch
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision.datasets import CIFAR10

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean = (0.5, 0.5, 0.5),
                        std = (0.5, 0.5, 0.5))
])

test_set  = CIFAR10(
    root='./cifar-10/',
    train=False,
    transform=transform
)

test_loader = DataLoader(
    test_set,
    batch_size = 100,
    shuffle = True,
)

net = torch.load('net.pkl')

correct = 0
total = 0
for i, (inputs, labels) in enumerate(test_loader):
    inputs = torch.tensor(inputs).type(torch.FloatTensor).cuda()
    labels = torch.tensor(labels).type(torch.LongTensor).cuda()

    out = net(inputs)
    y_pred = out.argmax(dim=1)

    correct += (y_pred == labels).sum().item()
    total += labels.size()[0]

print('Accuracy on test set: %.4f' % (correct / total))
posted @ 2022-05-17 02:13  2inf  阅读(62)  评论(0)    收藏  举报