4. DataLoader & make NN

ingsol·2023년 1월 7일
0

PyTorch

목록 보기
4/8
post-custom-banner

1. DataLoader

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)

2. Define the Neural Network(신경망의 정의)

1) class 선언으로 사용하고자 하는 Network를 직접 구현할 수 있음
2) class로 선언할 Network에 필수 요소는?

  • 이걸 채워 넣기 위한 함수는 어디에 있을까? (Conv, Pool, Relu, dropout, Norm)
  • 3에서 배운 torch.nn 또는 torch.nn.functional
    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를 넣어서 현재 클래스가 어떤 클래스인지를 명확하게 표시해주는 용도)

  • 우리는 pytorch에서 각자 레이어 혹은 모델을 구성할 때, nn.Module을 상속받아 사용한다.
  • torch.nn의 모듈을 사용하기 위해서는 반드시 써줘야한다.
  • super()라는 것은 상속받은 부모클래스를 의미한다. 부모클래스(=nn.Module)의 __init__()(생성자)를 초기화해주면서 불러온다(초기화를 하지 않으면 부모 클래스의 속성을 사용할 수 없음). 즉, 클래스 내 함수와 변수에 접근시켜주는 것.
  • 이를 작성하지 않는다면, "AttributeError:cannot assign module before Module.__init__() call"을 일으키게 된다.

[example]

  • cifar10 dataset: 8x3x32x32

[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])

3. Forward propagation(순방향 전파)


  1. Loss(손실 계산)
  2. Back propagation(역전파)
  3. Update(신경망을 구성하는 parameter<weight, bias 등>의 업데이트)
post-custom-banner

0개의 댓글