[Fix]invalid URL

This commit is contained in:
UdonDa
2018-04-21 19:56:06 +09:00
parent 6c785eb810
commit b60ac38382

View File

@ -1,14 +1,14 @@
# Implementation of https://arxiv.org/pdf/1512.03385.pdf/ # Implementation of https://arxiv.org/pdf/1512.03385.pdf
# See section 4.2 for model architecture on CIFAR-10. # See section 4.2 for model architecture on CIFAR-10.
# Some part of the code was referenced below. # Some part of the code was referenced below.
# https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py # https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py
import torch import torch
import torch.nn as nn import torch.nn as nn
import torchvision.datasets as dsets import torchvision.datasets as dsets
import torchvision.transforms as transforms import torchvision.transforms as transforms
from torch.autograd import Variable from torch.autograd import Variable
# Image Preprocessing # Image Preprocessing
transform = transforms.Compose([ transform = transforms.Compose([
transforms.Scale(40), transforms.Scale(40),
transforms.RandomHorizontalFlip(), transforms.RandomHorizontalFlip(),
@ -17,26 +17,26 @@ transform = transforms.Compose([
# CIFAR-10 Dataset # CIFAR-10 Dataset
train_dataset = dsets.CIFAR10(root='./data/', train_dataset = dsets.CIFAR10(root='./data/',
train=True, train=True,
transform=transform, transform=transform,
download=True) download=True)
test_dataset = dsets.CIFAR10(root='./data/', test_dataset = dsets.CIFAR10(root='./data/',
train=False, train=False,
transform=transforms.ToTensor()) transform=transforms.ToTensor())
# Data Loader (Input Pipeline) # Data Loader (Input Pipeline)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
batch_size=100, batch_size=100,
shuffle=True) shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
batch_size=100, batch_size=100,
shuffle=False) shuffle=False)
# 3x3 Convolution # 3x3 Convolution
def conv3x3(in_channels, out_channels, stride=1): def conv3x3(in_channels, out_channels, stride=1):
return nn.Conv2d(in_channels, out_channels, kernel_size=3, return nn.Conv2d(in_channels, out_channels, kernel_size=3,
stride=stride, padding=1, bias=False) stride=stride, padding=1, bias=False)
# Residual Block # Residual Block
@ -49,7 +49,7 @@ class ResidualBlock(nn.Module):
self.conv2 = conv3x3(out_channels, out_channels) self.conv2 = conv3x3(out_channels, out_channels)
self.bn2 = nn.BatchNorm2d(out_channels) self.bn2 = nn.BatchNorm2d(out_channels)
self.downsample = downsample self.downsample = downsample
def forward(self, x): def forward(self, x):
residual = x residual = x
out = self.conv1(x) out = self.conv1(x)
@ -76,7 +76,7 @@ class ResNet(nn.Module):
self.layer3 = self.make_layer(block, 64, layers[1], 2) self.layer3 = self.make_layer(block, 64, layers[1], 2)
self.avg_pool = nn.AvgPool2d(8) self.avg_pool = nn.AvgPool2d(8)
self.fc = nn.Linear(64, num_classes) self.fc = nn.Linear(64, num_classes)
def make_layer(self, block, out_channels, blocks, stride=1): def make_layer(self, block, out_channels, blocks, stride=1):
downsample = None downsample = None
if (stride != 1) or (self.in_channels != out_channels): if (stride != 1) or (self.in_channels != out_channels):
@ -89,7 +89,7 @@ class ResNet(nn.Module):
for i in range(1, blocks): for i in range(1, blocks):
layers.append(block(out_channels, out_channels)) layers.append(block(out_channels, out_channels))
return nn.Sequential(*layers) return nn.Sequential(*layers)
def forward(self, x): def forward(self, x):
out = self.conv(x) out = self.conv(x)
out = self.bn(out) out = self.bn(out)
@ -101,7 +101,7 @@ class ResNet(nn.Module):
out = out.view(out.size(0), -1) out = out.view(out.size(0), -1)
out = self.fc(out) out = self.fc(out)
return out return out
resnet = ResNet(ResidualBlock, [3, 3, 3]) resnet = ResNet(ResidualBlock, [3, 3, 3])
resnet.cuda() resnet.cuda()
@ -109,28 +109,28 @@ resnet.cuda()
criterion = nn.CrossEntropyLoss() criterion = nn.CrossEntropyLoss()
lr = 0.001 lr = 0.001
optimizer = torch.optim.Adam(resnet.parameters(), lr=lr) optimizer = torch.optim.Adam(resnet.parameters(), lr=lr)
# Training # Training
for epoch in range(80): for epoch in range(80):
for i, (images, labels) in enumerate(train_loader): for i, (images, labels) in enumerate(train_loader):
images = Variable(images.cuda()) images = Variable(images.cuda())
labels = Variable(labels.cuda()) labels = Variable(labels.cuda())
# Forward + Backward + Optimize # Forward + Backward + Optimize
optimizer.zero_grad() optimizer.zero_grad()
outputs = resnet(images) outputs = resnet(images)
loss = criterion(outputs, labels) loss = criterion(outputs, labels)
loss.backward() loss.backward()
optimizer.step() optimizer.step()
if (i+1) % 100 == 0: if (i+1) % 100 == 0:
print ("Epoch [%d/%d], Iter [%d/%d] Loss: %.4f" %(epoch+1, 80, i+1, 500, loss.data[0])) print ("Epoch [%d/%d], Iter [%d/%d] Loss: %.4f" %(epoch+1, 80, i+1, 500, loss.data[0]))
# Decaying Learning Rate # Decaying Learning Rate
if (epoch+1) % 20 == 0: if (epoch+1) % 20 == 0:
lr /= 3 lr /= 3
optimizer = torch.optim.Adam(resnet.parameters(), lr=lr) optimizer = torch.optim.Adam(resnet.parameters(), lr=lr)
# Test # Test
correct = 0 correct = 0
total = 0 total = 0
@ -144,4 +144,4 @@ for images, labels in test_loader:
print('Accuracy of the model on the test images: %d %%' % (100 * correct / total)) print('Accuracy of the model on the test images: %d %%' % (100 * correct / total))
# Save the Model # Save the Model
torch.save(resnet.state_dict(), 'resnet.pkl') torch.save(resnet.state_dict(), 'resnet.pkl')