파이토치
1. 이것저것
- torch.add / sub / mul / div
C = torch.add(A,B) / A.연산(B) 브로드캐스팅 되는것도 생각하기 - torch.gather
이거는 배열 차원이 높아질 때 이해가 잘 안가서 따로 공부해보기...
인덱스 shape이랑 출력 shape이랑 동일
input 차원에 따라서 index 차원 맞춰주기 - torch.view / chunk
원하는 텐서 모양으로 만들기 / 텐서 개수로 분리하기 - import torch.nn as nn -> nn.linear
y = wX + b - hook
hook에 등록된 함수 있으면 실행해서 어떤게 쓰였는지
forward / backward 사용 - apply
custom 함수를 모델에 사용
model.apply(function)
2. Model 만들기
- Class -> Layer -> Module
파이토치 문서에 있는 내용
class Function_A(nn.Module):
def __init__(self):
super().__init__()
print(f" Function A Initialized")
def forward(self, x):
print(f" Function A started")
print(f" Function A done")
class Function_B(nn.Module):
def __init__(self):
super().__init__()
print(f" Function B Initialized")
def forward(self, x):
print(f" Function B started")
print(f" Function B done")
class Function_C(nn.Module):
def __init__(self):
super().__init__()
print(f" Function C Initialized")
def forward(self, x):
print(f" Function C started")
print(f" Function C done")
class Function_D(nn.Module):
def __init__(self):
super().__init__()
print(f" Function D Initialized")
def forward(self, x):
print(f" Function D started")
print(f" Function D done")
# Layer
class Layer_AB(nn.Module):
def __init__(self):
super().__init__()
self.a = Function_A()
self.b = Function_B()
print(f" Layer AB Initialized")
def forward(self, x):
print(f" Layer AB started")
self.a(x)
self.b(x)
print(f" Layer AB done")
class Layer_CD(nn.Module):
def __init__(self):
super().__init__()
self.c = Function_C()
self.d = Function_D()
print(f" Layer CD Initialized")
def forward(self, x):
print(f" Layer CD started")
self.c(x)
self.d(x)
print(f" Layer CD done")
# Model
class Model(nn.Module):
def __init__(self):
super().__init__()
self.ab = Layer_AB()
self.cd = Layer_CD()
print(f"Model ABCD Initialized\n")
def forward(self, x):
print(f"Model ABCD started")
self.ab(x)
self.cd(x)
print(f"Model ABCD done\n")
요런거처럼 class끼리 묶어서 Layer 로 만들어주고, Layer를 묶어서 Model 만들기
중간에 module name 가져올 때, Class name으로 가져오기 때문에 모델구조 파악할 때 Class name따라 split() 잘 써서 나눠줘야함.
for name, module in model.named_modules():
print(f"[ Name ] : {name}\n[ Module ]\n{module}")
print("-" * 30)
for name, child in model.named_children():
print(f"[ Name ] : {name}\n[ Children ]\n{child}")
print("-" * 30)
for name, parameter in model.named_parameters():
print(f"[ Name ] : {name}\n[ Parameter ]\n{parameter}")
print("-" * 30)
- 이런거처럼 model.name_modules()를 쓰면 모델의 구조가 나온다.
model - layer - 세부요소 순서대로 - model.name_children() 이거를 쓰면 바로 하위의 구조만 나온다.
model에서 어떤 layer가 있는지 궁금할 때 사용하면 좋을듯? - 구조를 알고있으면 model.ab.a 이런식으로 submodule을 불러올 수 있다.
layer ab의 submodule a를 불러올 수 있다. - parameter가 몇개 생성됐는지도 model.named_parameters()로 확인가능.
마찬가지로 model.ab.b.W1 이런식으로 parameter 불러올 수 있다. - Tensor / Parameter / Buffer
grad 계산 유무 / 값 업데이트 / 모델 저장시 값 저장 유무로 분류된다.
Tensor는 모두 X, Parameter는 모두 O, Buffer는 XXO
3. 매직 메서드
- __init__
초기화 시킬 때, 들어온 정보 바탕으로 이것저것.
데이터셋을 불러올 때 init사용하면서 전처리도 하는 경우가 있는데, 이 때 데이터 특성을 다 아는 상태로 변수를 설정해주는데 굳이 이럴필요가 있나? 싶다.
이전에는 dataset에서 전처리를 먼저 한 후에 학습시켜서 왜 이렇게 쓰는지는 잘 모르겠음
generator나 iterator 사용하려고 한다는듯.... - __len__
데이터셋의 총 갯수 반환
sequntial data의 경우에는 항상 len이 아님.. window size같은게 있어서 달라질 수 있음
batch size가 5일 때 1000개 넣으면 len이 996개라든지... - __getitem__
인덱스가 주어질 때 data와 그에 맞은 label 주어짐
tuple, dict 등 여러 형식으로 반환가능
segmentation, class 정보 등 이것저것 추가할 수 있음 - __repr__
모델 구조 표현할 때 사용하는듯?
4. data load
- sampler
인덱스 단위로 data 관리할 때 사용. pos, neg 등 비율을 맞춰서 batch에 학습시키거나 그런 용도. - collate_fn
data feeding시에 어떤 형식으로 줄건지. 데이터 사이즈 맞추기
map style 데이터셋에서 sample을 batch 단위로 바꾸면서 사용
CNN에서 이미지 사이즈 맞추거나, 시계열 데이터에서 padding 하면서 사이즈 맞춰주는 느낌
여러가지 있는데 너무많음....... 해보면서 익히기
5. Torchvision
- PIL로 불러옴. opencv나 matplotlib같은거는 중간과정이 필요해서 학습 시 콜이 많이 발생하면 bottle neck 발생.
웬만하면 PIL로 한 번에 처리하기
코테준비
[파이썬] 백준 2206 : 벽 부수고 이동하기 (골드3) (tistory.com)
[파이썬] 백준 1261 : 알고스팟 (골드4) (tistory.com)
[파이썬] 백준 6087 : 레이저 통신 (골드3) (tistory.com)
[파이썬] 프로그래머스 : 경주로 건설 (Lv.3) (tistory.com)
[파이썬] 백준 2151 : 거울설치 (골드3) (tistory.com)
graph에서 cost와 state를 집중적으로 풀었음.
다익스트라 / 플로이드워셜을 사용해서 최소 cost를 구하는건 자주 나오기도 하고, state를 나누어서 생각하는 발상은 DP에서도 자주 사용되기 때문에 빠르게 푸는 것이 중요.
이후에는 2차원 격자 말고 직접 간선 정보가 주어졌을 때, 간선의 cost가 다를 때 등 여러가지 문제를 풀어볼 예정
코멘트
어렵다 / 바쁘다
'etc > 공부방' 카테고리의 다른 글
리트코드 문제풀이 진행 상황 (0) | 2024.09.01 |
---|---|
[네부캠] 5주차 정리 (0) | 2023.12.04 |
[네부캠] 4주차 정리 (0) | 2023.11.27 |
[네부캠] 3주차 정리 (0) | 2023.11.20 |
[네부캠] 1주차 정리 (0) | 2023.11.10 |
댓글