AI Tech 01/26

djh0211·2022년 1월 27일
0

Week2

목록 보기
2/2
post-thumbnail

Custom model 만들기

model은 작은 단위인 block의 집합이다.
block을 조합하여 model을 만들고, model을 조합해 더 큰 model을 만든다

nn.Module을 상속하자.

model및 block 구성에 관한 인터페이스를 제공한다.
class로 model또는 block을 만들고, nn.Module을 상속받고, init, forward를 작성한다.

기본 구조

class Model(nn.Module):
  def __init__(self):
    super().__init__()
    sub1 = subModule_1() # module 내에 submodule을 포함하여, Tree같은 
    sub2 = subModule_2() # 구조를 만들 수 있다.
  def forward(self, #...):
  	# model에서 제공하는 기능
    output = sub1(x)
    output = sub2(output)
    return output
    
model = Model()
result = model(...) 

nn.Sequential에 만든 block이나 model을 여럿 넣어 Sequential한 더 큰 model을 만들 수 있음.

nn.ModuleList, nn.MoudleDict

module(block)들을 list또는 dict로 저장한다.
일반 list와 dict을 쓸 때랑 차이점 : nn.Module의 subModule로 자동 등록돼서 graph처럼 관리할 수 있다
apply 등 사용가능

module_list = nn.ModuleList([module1, module2, ...])
module_dict = nn.ModuleDict('module1':module1(),
			    'module2':module2(),
                	      ...)

nn.Parameter(...) : 받은 인자를 Parameter로 만들어 반환한다.
생성된 Parameter는 require_grad를 통해 gradient를 구하도록 설정할 수 있고, Model을 저장할 때 같이 저장되며, state_dict()로 볼 수 있다.

self.W = nn.Parameter(tensor.zeros((odim, idim)))
self.b = nn.Parameter(tensor.zeros(odim))

register_buffer() : 받은 인자를 Buffer로 반환한다.
Parameter와 다르게 gradient update가 없어서 변하진 않지만, model을 저장할 때 저장하고 싶은 값을 buffer로 지정한다.
self.register_buffer('buffer1', torch.Tensor(..), persistent=True)

model = Model()
buf = model.get_buffer('buffer1') # 이름을 저장해 이름으로 호출한다
...

nn.Module로 만든 모델 분석하기

model.named_modules(), model.named_children(), named_buffer(), model.parameters()

namedmodules()는 자신을 포함한 모든 submodule을 반환
named_children()은 자신 바로 아래의 자식만 반환
named_buffer()는 자신을 포함한 모든 submodule의 buffer를 반환
이처럼 module, children, buffer, parameters를 볼 수 있고, 이름을 보고싶을 땐 앞에 named
를 붙이면 된다.
model 구조를 보며, 전체 forward 구조를 이해하고, 수정할 부분은 수정할 수 있도록 하자.

repr

module을 출력할 때, 원하는 출력이 나오도록 만들어주는 기능
반드시 'extra_repr()' 함수를 재정의 해줘야한다.
def extra_repr(self):
return {원하는 출력 str}

hook

forward나 backward 전후로, 사용자가 원하는 custom function을 삽입하는 기능
module은 forward, backward hook 전부 가능
tensor는 backward hook만 가능
tensor.register_hook(custom function)
model.register_forward_pre_hook(...) # forward 실행 전에 삽입
model.register_forward_hook(...) # forward 실행 후에 삽입
model.register_full_backward_hook(...) # module input에 대한 gradient가 계산될 때마다 호출

Apply

model 전체에 custom function을 적용하고 싶을 때 사용
ret = model.apply(custom function) # custom function을 model 전체에 적용. apply가 적용된 model을 return

데이터셋

torch.utils.data 내의 Dataset, DataLoader 등을 활용한다.
Dataset을 통해 Dataset 선언, DataLoader를 통해 Batch만큼 분할 및 Transform 수행

Dataset

Dataset class를 상속받음
init, len, getitem 메서드 포함(map-style dataset에서만)

Dataset init

일반적으로 X, y 포함(len, getitem 등 활용)
이외에 Dataset에 넣고 싶은 기능을 자유롭게 넣어 class로서 제공하면 됨.

DataLoader

Dataset instance를 받아, Generator를 반환
batch_size : 한 번에 batch_size 크기 만큼 반환
shuffle : Dataset을 섞음
num_worker : 프로세스의 개수, GPU라고 생각하면 될듯
collate_fn : batch의 구조를 원하는 대로 수정하기 위한 함수. 직접 정의해서 넣을 수 있음. resize하거나 data와 label을 따로 뗀다던가 하는 작업 수행 가능
pin_memory : True면 Tensor를 CUDA에 할당해 더 빠른 전송이 가능하게 함
drop_last : 마지막 batch가 다른 batch들과 사이즈가 다를 경우, 이를 drop한다.

Transform

torchvision.transforms.
Resize, Crop, Rotation, Flip등의 Data Augmentation 가능
ToTensor로 다른 타입의 image를 tensor로 변환 가능
transforms.compose()로 한꺼번에 처리 가능

전이 학습 및 전체 학습 시나리오

모델 불러오기

모델의 구조 확인 -> input shape 확인

확인한 input shape에 맞게 내 data의 shape를 맞춰줌(grayscale, totensor 등)

모델에 들어갈 loss function, Optimizer 지정

epoch마다, train을 돌림

마지막에 evaluation하는 부분

0개의 댓글