0819-pre-trained-save-model
트렌드
-
백본 모델을 가지고 와서 우리 데이터에 맞춰서 다시 학습하는 알고리즘이 대세.
- 이미지는 cnn, resnet에 파인튜닝
-
nlp는 transformer 기반의 bert에 파인튜닝
-
모델의 구조를 알고서 파인튜닝을 해라!
-
파인튜닝만 하면 어느 정도 괜찮은 성능을 낸다. 이미지 classification은 이제 정복했다고 여겨짐
-
학습 결과를 공유하고 싶을 때. 모델을 동료한테 교수님한테 다른 연구자한테 주고 싶을 때.
- 저장 먼저 해야 한다. 토치에서는 뭘 제공할까?
- model.save() 함수
-
2가지 방법
-
모델 형태 아키텍처를 저장
-
파라미터를 저장. 위 보다는 용량이 적다. 이거만 넣으면 다시 돌릴 수 있다.
-
중간 과정의 저장을 통해 최선의 결과를 선택도 가능(early stoping or hyper parameter choice)
-
save 자체는 쉽다. state_dict: 파라미터 상태 표시.
-
이것을 torch.save에 arg으로 넣어서 저장.
-
파이토치에서 모델 저장할 떄는 pt확장자. 파이썬의 기본 확장자.
-
state_dict을 ㅓ장했을 때 불러오기 load_state_dict.으로 불러옴.
-
아키텍처랑 함께 ㅓ장(torch load model path). 잘 안씀. 파이썬 pickle 방식으로 저장. 주로 파라미터만 저장.
- checkpoints
- 중간 결과 도중에 계속 저장
-
ealry stoping 때 사용
-
epoch, loss, metric함꼐 저장
- transfer learning
- 다른 데이터로 만든 모델을 현재 데이터에 적용
- 대용량일수록 성능이 좋다. 그래서 백본 모델 사용.
- 이미지넷
- 버트, gpt
- 이미 만들었다고 pre training 모델
-
남이 잘 만든것을 내 데이터에 추가 학습
- torchvision은 cv 모델
-
hugging face는 nlp 표준
- freezing: 특정 부분은 파라미터를 학습시키지 않는다.
-
요즘은… k fold 처럼 레이어 하나 하나… freeze 풀고 학습… 반복…
- 모니토링 도구
-
텐서플로우에서 텐서보드 제공하면서 학습 중에 acc와 loss 트래킹 가능.
-
학습하면 시간이 길다. 학습 시키고 자고 일어남. 시간 동안 기록이 필요. print와 log을 쓰거나 csv을 기록 함. 텐서보드와 weight&biases을 사용함. 텐서보드는 유명.
- 간단한 사용법
- 텐서플로우의 시각화도구
- 학습 그래프, metric, 학습 결과 시각화
-
토치도 연결 가능
- 텐서보드 값
- scalar: metric, epoch… precision, recall…
- graph: 보기 좋게 표시
- histogram: weight의 분포를 표현. 적절히 값이 분포 중인가
-
image: 예측 값과 실제 값 비교 표시
- 코드
- log 디렉토리 설정
-
torch summaryWriter import 기록 객체
- witer instance
- 씀 각 지표들
- loss 카테고리 안에 train 값/ test 값.
-
slash가 카테고리이다
- 과제 custom model
-
torch.gather
-
직관: 1개를 가져올 때 1개의 index가 필요하다. 가져올 개수 만큼의 index 개수가 있어야 함.
-
dim = ?을 기준으로 1개 씩 가져온다고 생각해야 한다.
- input차원가 indices 의 차원이 같아야 한다.
- dimension을 맞춰줘야 한다.
-
(2,2,2)가 입력이라면… ()
-
3d
- 예제 주어진 것. RNN에서… 8개의 batch. 각 sequence 길이. 각 hidden state.
뽑고자 하는 것
3차원
import torch
A = torch.Tensor([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
# torch.gather 함수를 써서 해보세요!
output = torch.gather(A,2,torch.tensor([[[0],[1]],[[0],[1]]])).view((2,2))
# print(output)
"""
A: 2,2,2
[[[0],[1]],[[0],[1]]]
target sahpe: 2,2
0
1
0
1
"""
# 아래 코드는 수정하실 필요가 없습니다!
if torch.all(output == torch.Tensor([[1, 4], [5, 8]])):
print("🎉🎉🎉 성공!!! 🎉🎉🎉")
else:
print("🦆 다시 도전해봐요!")
임의의 3차원
원하는 결과
A = torch.tensor([[[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15]],
[[16, 17, 18],
[19, 20, 21],
[22, 23, 24],
[25, 26, 27],
[28, 29, 30]],
[[31, 32, 33],
[34, 35, 36],
[37, 38, 39],
[40, 41, 42],
[43, 44, 45]]])
if torch.all(get_diag_element_3D(A) == torch.Tensor([[ 1, 5, 9],
[16, 20, 24],
[31, 35, 39]])):
dim = 1에서부터 정방행렬의 크기까지만 반환.
indices을 어떻게 구할까?
a,b,c =
[[[0]] [[1]]]
Q 과제 param.data으로 변경할 때 data keyword가 어디에서 나옴?
https://pytorch.org/docs/stable/_modules/torch/nn/parameter.html#Parameter
parameter instance을 생성할 떄 data property에 attribute으로 저장.
Comments