# ·±Å¸ÀÓ À¯Çü GPU ¸ðµå·Î º¯°æ
!pip install torch torchvision
Requirement already satisfied: torch in /usr/local/lib/python3.6/dist-packages (1.1.0) Requirement already satisfied: torchvision in /usr/local/lib/python3.6/dist-packages (0.3.0) Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from torch) (1.16.4) Requirement already satisfied: pillow>=4.1.1 in /usr/local/lib/python3.6/dist-packages (from torchvision) (4.3.0) Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from torchvision) (1.12.0) Requirement already satisfied: olefile in /usr/local/lib/python3.6/dist-packages (from pillow>=4.1.1->torchvision) (0.46)
!rm -r images
import os
try:
os.mkdir("images")
os.mkdir("images/dogs")
os.mkdir("images/cats")
except:
pass
!wget https://i.kinja-img.com/gawker-media/image/upload/s--WFkXeene--/c_scale,f_auto,fl_progressive,q_80,w_800/ol9ceoqxidudap8owlwn.jpg -P images/dogs
!wget https://www.rspcansw.org.au/wp-content/uploads/2017/08/50_a-feature_dogs-and-puppies_mobile.jpg -P images/dogs
!wget https://www.catster.com/wp-content/uploads/2018/05/A-gray-cat-crying-looking-upset.jpg -P images/cats
!wget https://www.scarymommy.com/wp-content/uploads/2018/01/c1.jpg?w=700 -P images/cats
rm: cannot remove 'images': No such file or directory --2019-08-26 13:37:28-- https://i.kinja-img.com/gawker-media/image/upload/s--WFkXeene--/c_scale,f_auto,fl_progressive,q_80,w_800/ol9ceoqxidudap8owlwn.jpg Resolving i.kinja-img.com (i.kinja-img.com)... 151.101.194.166, 151.101.130.166, 151.101.2.166, ... Connecting to i.kinja-img.com (i.kinja-img.com)|151.101.194.166|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 32099 (31K) [image/jpeg] Saving to: ¡®images/dogs/ol9ceoqxidudap8owlwn.jpg¡¯ ol9ceoqxidudap8owlw 100%[===================>] 31.35K --.-KB/s in 0.005s 2019-08-26 13:37:28 (5.83 MB/s) - ¡®images/dogs/ol9ceoqxidudap8owlwn.jpg¡¯ saved [32099/32099] --2019-08-26 13:37:31-- https://www.rspcansw.org.au/wp-content/uploads/2017/08/50_a-feature_dogs-and-puppies_mobile.jpg Resolving www.rspcansw.org.au (www.rspcansw.org.au)... 101.0.77.122 Connecting to www.rspcansw.org.au (www.rspcansw.org.au)|101.0.77.122|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 130940 (128K) [image/jpeg] Saving to: ¡®images/dogs/50_a-feature_dogs-and-puppies_mobile.jpg¡¯ 50_a-feature_dogs-a 100%[===================>] 127.87K 158KB/s in 0.8s 2019-08-26 13:37:33 (158 KB/s) - ¡®images/dogs/50_a-feature_dogs-and-puppies_mobile.jpg¡¯ saved [130940/130940] --2019-08-26 13:37:35-- https://www.catster.com/wp-content/uploads/2018/05/A-gray-cat-crying-looking-upset.jpg Resolving www.catster.com (www.catster.com)... 192.124.249.102 Connecting to www.catster.com (www.catster.com)|192.124.249.102|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 165145 (161K) [image/jpeg] Saving to: ¡®images/cats/A-gray-cat-crying-looking-upset.jpg¡¯ A-gray-cat-crying-l 100%[===================>] 161.27K --.-KB/s in 0.03s 2019-08-26 13:37:35 (5.28 MB/s) - ¡®images/cats/A-gray-cat-crying-looking-upset.jpg¡¯ saved [165145/165145] --2019-08-26 13:37:37-- https://www.scarymommy.com/wp-content/uploads/2018/01/c1.jpg?w=700 Resolving www.scarymommy.com (www.scarymommy.com)... 104.18.168.96, 104.18.164.96, 104.18.167.96, ... Connecting to www.scarymommy.com (www.scarymommy.com)|104.18.168.96|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 2169547 (2.1M) [image/jpeg] Saving to: ¡®images/cats/c1.jpg?w=700¡¯ c1.jpg?w=700 100%[===================>] 2.07M --.-KB/s in 0.03s 2019-08-26 13:37:38 (68.3 MB/s) - ¡®images/cats/c1.jpg?w=700¡¯ saved [2169547/2169547]
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.init as init
import torch.utils.data as data
import torchvision.datasets as dset
import torchvision.transforms as transforms
#from torch.utils.data import DataLoader
batch_size= 1
learning_rate = 0.0002
num_epoch = 100
img_dir = "./images"
img_data = dset.ImageFolder(img_dir, transforms.Compose([
transforms.Resize(256),
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
]))
train_loader = data.DataLoader(img_data, batch_size=batch_size,
shuffle=True, num_workers=2)
def conv_1(in_dim,out_dim):
model = nn.Sequential(
nn.Conv2d(in_dim,out_dim,1,1),
nn.ReLU(),
)
return model
def conv_1_3(in_dim,mid_dim,out_dim):
model = nn.Sequential(
nn.Conv2d(in_dim,mid_dim,1,1),
nn.ReLU(),
nn.Conv2d(mid_dim,out_dim,3,1,1),
nn.ReLU()
)
return model
def conv_1_5(in_dim,mid_dim,out_dim):
model = nn.Sequential(
nn.Conv2d(in_dim,mid_dim,1,1),
nn.ReLU(),
nn.Conv2d(mid_dim,out_dim,5,1,2),
nn.ReLU()
)
return model
def max_3_1(in_dim,out_dim):
model = nn.Sequential(
nn.MaxPool2d(3,1,1),
nn.Conv2d(in_dim,out_dim,1,1),
nn.ReLU(),
)
return model
class inception_module(nn.Module):
def __init__(self,in_dim,out_dim_1,mid_dim_3,out_dim_3,mid_dim_5,out_dim_5,pool):
super(inception_module,self).__init__()
self.conv_1 = conv_1(in_dim,out_dim_1)
self.conv_1_3 = conv_1_3(in_dim,mid_dim_3,out_dim_3)
self.conv_1_5 = conv_1_5(in_dim,mid_dim_5,out_dim_5)
self.max_3_1 = max_3_1(in_dim,pool)
def forward(self,x):
out_1 = self.conv_1(x)
out_2 = self.conv_1_3(x)
out_3 = self.conv_1_5(x)
out_4 = self.max_3_1(x)
output = torch.cat([out_1,out_2,out_3,out_4],1)
return output
# Ç¥¿Í ºñ±³ÇÏ¸é¼ º¼ ¼ö ÀÖµµ·Ï ±¸ÇöÇß½À´Ï´Ù.
class GoogLeNet(nn.Module):
def __init__(self, base_dim, num_classes=2):
super(GoogLeNet, self).__init__()
self.num_classes=num_classes
self.layer_1 = nn.Sequential(
nn.Conv2d(3,base_dim,7,2,3),
nn.MaxPool2d(3,2,1),
nn.Conv2d(base_dim,base_dim*3,3,1,1),
nn.MaxPool2d(3,2,1),
)
self.layer_2 = nn.Sequential(
inception_module(base_dim*3,64,96,128,16,32,32),
inception_module(base_dim*4,128,128,192,32,96,64),
nn.MaxPool2d(3,2,1),
)
self.layer_3 = nn.Sequential(
inception_module(480,192,96,208,16,48,64),
inception_module(512,160,112,224,24,64,64),
inception_module(512,128,128,256,24,64,64),
inception_module(512,112,144,288,32,64,64),
inception_module(528,256,160,320,32,128,128),
nn.MaxPool2d(3,2,1),
)
self.layer_4 = nn.Sequential(
inception_module(832,256,160,320,32,128,128),
inception_module(832,384,192,384,48,128,128),
nn.AvgPool2d(7,1),
)
self.layer_5 = nn.Dropout2d(0.4)
self.fc_layer = nn.Linear(1024,self.num_classes)
def forward(self, x):
out = self.layer_1(x)
out = self.layer_2(out)
out = self.layer_3(out)
out = self.layer_4(out)
out = self.layer_5(out)
out = out.view(batch_size,-1)
out = self.fc_layer(out)
return out
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(device)
model = GoogLeNet(base_dim=64)
for i in model.named_children():
print(i)
model = GoogLeNet(base_dim=64).to(device)
loss_func = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(),lr=learning_rate)
cuda:0 ('layer_1', Sequential( (0): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3)) (1): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False) (2): Conv2d(64, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False) )) ('layer_2', Sequential( (0): inception_module( (conv_1): Sequential( (0): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() ) (conv_1_3): Sequential( (0): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(96, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) (conv_1_5): Sequential( (0): Conv2d(192, 16, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(16, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)) (3): ReLU() ) (max_3_1): Sequential( (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1)) (2): ReLU() ) ) (1): inception_module( (conv_1): Sequential( (0): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() ) (conv_1_3): Sequential( (0): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(128, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) (conv_1_5): Sequential( (0): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(32, 96, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)) (3): ReLU() ) (max_3_1): Sequential( (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1)) (2): ReLU() ) ) (2): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False) )) ('layer_3', Sequential( (0): inception_module( (conv_1): Sequential( (0): Conv2d(480, 192, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() ) (conv_1_3): Sequential( (0): Conv2d(480, 96, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(96, 208, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) (conv_1_5): Sequential( (0): Conv2d(480, 16, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(16, 48, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)) (3): ReLU() ) (max_3_1): Sequential( (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv2d(480, 64, kernel_size=(1, 1), stride=(1, 1)) (2): ReLU() ) ) (1): inception_module( (conv_1): Sequential( (0): Conv2d(512, 160, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() ) (conv_1_3): Sequential( (0): Conv2d(512, 112, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(112, 224, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) (conv_1_5): Sequential( (0): Conv2d(512, 24, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(24, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)) (3): ReLU() ) (max_3_1): Sequential( (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1)) (2): ReLU() ) ) (2): inception_module( (conv_1): Sequential( (0): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() ) (conv_1_3): Sequential( (0): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) (conv_1_5): Sequential( (0): Conv2d(512, 24, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(24, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)) (3): ReLU() ) (max_3_1): Sequential( (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1)) (2): ReLU() ) ) (3): inception_module( (conv_1): Sequential( (0): Conv2d(512, 112, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() ) (conv_1_3): Sequential( (0): Conv2d(512, 144, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(144, 288, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) (conv_1_5): Sequential( (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)) (3): ReLU() ) (max_3_1): Sequential( (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1)) (2): ReLU() ) ) (4): inception_module( (conv_1): Sequential( (0): Conv2d(528, 256, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() ) (conv_1_3): Sequential( (0): Conv2d(528, 160, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(160, 320, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) (conv_1_5): Sequential( (0): Conv2d(528, 32, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(32, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)) (3): ReLU() ) (max_3_1): Sequential( (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv2d(528, 128, kernel_size=(1, 1), stride=(1, 1)) (2): ReLU() ) ) (5): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False) )) ('layer_4', Sequential( (0): inception_module( (conv_1): Sequential( (0): Conv2d(832, 256, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() ) (conv_1_3): Sequential( (0): Conv2d(832, 160, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(160, 320, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) (conv_1_5): Sequential( (0): Conv2d(832, 32, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(32, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)) (3): ReLU() ) (max_3_1): Sequential( (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv2d(832, 128, kernel_size=(1, 1), stride=(1, 1)) (2): ReLU() ) ) (1): inception_module( (conv_1): Sequential( (0): Conv2d(832, 384, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() ) (conv_1_3): Sequential( (0): Conv2d(832, 192, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU() ) (conv_1_5): Sequential( (0): Conv2d(832, 48, kernel_size=(1, 1), stride=(1, 1)) (1): ReLU() (2): Conv2d(48, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)) (3): ReLU() ) (max_3_1): Sequential( (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False) (1): Conv2d(832, 128, kernel_size=(1, 1), stride=(1, 1)) (2): ReLU() ) ) (2): AvgPool2d(kernel_size=7, stride=1, padding=0) )) ('layer_5', Dropout2d(p=0.4)) ('fc_layer', Linear(in_features=1024, out_features=2, bias=True))
for i in range(num_epoch):
for j,[image,label] in enumerate(train_loader):
x = image.to(device)
y_= label.to(device)
optimizer.zero_grad()
output = model.forward(x)
loss = loss_func(output,y_)
loss.backward()
optimizer.step()
if i % 10 ==0:
print(loss)
tensor(0.6841, device='cuda:0', grad_fn=<NllLossBackward>) tensor(0.5502, device='cuda:0', grad_fn=<NllLossBackward>) tensor(0.4387, device='cuda:0', grad_fn=<NllLossBackward>) tensor(0.4535, device='cuda:0', grad_fn=<NllLossBackward>) tensor(0.4449, device='cuda:0', grad_fn=<NllLossBackward>) tensor(0.4561, device='cuda:0', grad_fn=<NllLossBackward>) tensor(1.0644, device='cuda:0', grad_fn=<NllLossBackward>) tensor(0.4067, device='cuda:0', grad_fn=<NllLossBackward>) tensor(0.9659, device='cuda:0', grad_fn=<NllLossBackward>) tensor(0.3646, device='cuda:0', grad_fn=<NllLossBackward>)