1) 입력은 어떻게 정의?(input value setting?)
2) batch나 epoch는 어떻게?
3) 선처리를 하고 싶은데?
👉torchvision
- anaconda prompt > pip install torchvision
- [torchvision]https://pytorch.org/vision/stable/transforms.html
- transforms: 선처리를 하기 위한 함수
- Compose: 선처리로 처리할 단계들이 여러 개 일 때 필요, 선처리로 해주고 싶은 function들을 Compose안에 넣어줌
- transforms.ToTensor(): convert or PIL image or numpy.ndarray(HxWxC) in the range[0,255] to a torch.FloatTensor of shape(CxHxW) in the range [0.0, 1.0]
- transforms.Normalize(mean, std)
- transforms.CenterCrop(10): image를 center의 이만큼만 crop해서 사용
- transforms.datasets.datasets이름: 데이터 이름만 써주면 torchvision에서 제공하는 데이터들을 쉽게 가져다 쓸 수 있음
- np.transpose(np_img): ToTensor() - C:0, H:1, W:2을 np.transpose - H:1, W:2, C:0로 바꿔라
4) mnist, cifar-10 이런거 말고 내 데이터를 넣고 싶은데?
👉torchvision.datasets.ImageFoler(rood='./mydataset', transform=trans)
[1~3]
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable
from torch.utils.data import Dataset, DataLoader
import numpy as np
import torchvision
import torchvision.transformers as transforms
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = trochvision.datasets.CIFAR10(root='./data', #어느 directory에 저장
train=True,
download=True,
transform=transform) #가지고 온 데이터를 이런 선처리를 진행한다
testset = trochvision.datasets.CIFAR10(root='./data',
train=False,
download=True,
transform=transform)
#8(batch)*3(RGB)*32*32(image size)
#num_worker: GPU를 몇 개 가져다 쓸거냐, batchsize가 클수록 큰게 좋다
trainloader = DataLoader(trainset, batch_size=8, shuffle=True, num_workers=2)
testloader = DataLoader(testset, batch_size=8, shuffle=False, num_workers=2)
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') #cifar10 dataset의 class는 이런게 있다 써놓은 것
def imshow(img):
img = img / 2 + 0.5 #unnormalize
np_img = img.numpy()
#plt.imshow(np.img)
plt.imshow(np.transpose(np.img, (1,2,0)))
print(np_img.shape)
print((np.transpose(np_img(1,2,0))).shape)
# data iter 코드 1
dataiter = iter(trainloader)
images, labels = dataiter.next()
# data iter 코드 2
for epoch in range(num_of_epoch): 이 전체 학습을 몇 번 돌릴 건지
for n, (img, labels) in enumerate(trainloader): #6250번 iter, torch.Size([8,3,32,32], torch.Size([8])
print(n, img.shape, label.shape)
[4]
trans = transforms.Compose([transforms.Resize((100,100)), #이거 추가
transforms.ToTensor(),
transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5))])
trainset = torchvision.datasets.ImageFoler(rood='./mydataset', transform=trans)
print(len(trainset))
trainloader = DataLoader(trainset, batch_size=8, shuffle=False, num_workers=2)
dataiter = iter(trainloader)
images, labels = dataiter.next()
print(images.shape)
imshow(torchvision.tuils.make_grid(images, nrow=4)
pirnt(images.shape)
print((torchvision.utils.make_grid(images)).shape)
print(''.join('%5s'%labels[j] for j in range(8)) # 8=len(trainset)
1) class 선언으로 사용하고자 하는 Network를 직접 구현할 수 있음
2) class로 선언할 Network에 필수 요소는?
class my_netword(nn.Module): def __init__(self): **super(my_network, self).__init__() #이 부분은 꼭 써줘야함, 외우기!** #(사용할 함수들을 정의할 장소) def forward(self, x): #(함수들을 사용하여 Network의 forward를 정의하는 장소 return answer
super().__init__()
쓰는 이유?= super(my_network, self).__init__()
(파생클래스와 self를 넣어서 현재 클래스가 어떤 클래스인지를 명확하게 표시해주는 용도)
__init__()
(생성자)를 초기화해주면서 불러온다(초기화를 하지 않으면 부모 클래스의 속성을 사용할 수 없음). 즉, 클래스 내 함수와 변수에 접근시켜주는 것.Module.__init__()
call"을 일으키게 된다.[example]
[layer를 하나 하나씩 만들어서 적용]
imgs = 0
for n, (img, labels) in enumerate(trainloader):
print(n, img.shape, labels.shape)
imgs = img
break
net = nn.Conv2d(3,5,5) #in_channels, out_channels(=filter를 몇 개 쓰겠다), kernel_size(filter size = 5*5)
out1 = net(Variable(imgs))
print(out1.shape) #torch.Size([8,5,28,28]) #28?? = 32-5(filter_size)+1
net2 = nn.Cov2d(5,10,5) #in_channels = 이전 out_channels
out2 = net(out1)
print(out2.shape) #torch.Size([8,10,24,24])
[📌network를 통째로 만들어서 사용]
class my_network(nn.Module):
def __init__(self):
super(my_network, self).__init__()
self.net_1 = nn.Conv2d(3,5,5) #내가 쓸 네트워크를 만들어줌
self.net_2 = nn.Conv2d(5,10,5)
def forward(self, x): #내가 쓸 네트워크를 토대로 그것을 어떻게 쓰는 지 정리
x = self.net_1(x)
x = self.net_2(x)
return x #output
imgs = 0
for n, (img, labels) in enumerate(trainloader):
print(n, img.shape, labels.shape)
imgs = img
break
my_net = my_network()
out = my_net(Variable(imgs))
print(out.shape) #torch.Size([8,10,24,24])