fastai & pytorch 정리글

2022. 8. 30. 13:20AI/라이브러리

fastai & pytorch 정리글

 

참고 도서

 

Ch2.

Deep learning 활용 분야

Computer vision - object reconition, detection, segmentation

NLP, Text&Image, Tabular Data, Recommendation System(collaborative filtering)

Protein chain, spectrogram ...

원동력 접근법(Driven approach)

목표를 정의하고 레버를 고려한후에 레버와 연관성이 높은 데이터를 이용해서 모델을 만드는것.

 

Ch 4. 숫자 분류, 기본 사용 단계

item_tfms : CPU에서 image size 확대

batch_tfms  : aug 연산을 통합하여 batch 단위로 일괄 처리, GPU에서 진행

# PATH object 활용
path = '/root'
path = untar_data(URLs.MNIST_SAMLE)
(path/"images").ls()	

# DataLoaders, ImageDataLoaders 활용
dataloaders = DataLoader(dataset, batch_size = 256)
image_dataloaders = ImageDataLoaders.from_folder(path)

#DataBlock 활용
datablock = DataBlock(blocks = (ImageBlock, CategoryBlock),
                 get_items = get_image_files,
                 splitter = RandomSplitter(seed = 42),
                 get_y = using_attr(RegexLabeller(r'(.+)_\d+.jpg$'), 'name'),
                 item_tfms = Resize(460),		# image를 일정하게 확대 CPU 처리 
                 batch_tfms = aug_transforms(size = 224, min_scale = 0.75))	# GPU에서 aug 일괄처리
dls = datablock.dataloaders(path/'images')

#Lerner, cnn_learner 활용
learn = cnn_learner(dataloaders, resnet18, prerained=Fasle,
                    loss_func=F.cross_entropy, metrics=accuracy)
                    
learn = Learner(dataloaders, nn.Sequential(
                                            nn.Linear(28 * 28, 30),
                                            nn.ReLU(),
                                            nn.Linear(30, 1)),
                opt_func=SGD, loss_func=mnist_loss, metrics=batch_accuracy)

#fit 
learn.fit_one_cycle(cyc_len=1, max_lr=0.1)
learn.fit(40, lr = 0.1)

Ch 5. 이미지 분류

lr_find(), lr slicing, mixed precision

# learn 설정
learn = cnn_learner(dls, resnet34, metrics=error_rate)
# lr_find() 사용
lr_min, lr_steep = learn.lr_find()
learn = fit_one_cycle(epoch=3, lr=3e-3)

#freezing
learn.unfreeze()

# lr slicing
learn.fit_one_cycle(epoch=12, lr_max=slice(lr_min=1e-6, lr_max=1e-4))

# mixed precision -> to_fp16()
learn = cnn_learner(dls, resnet34, metrics=error_rate).to_fp16()

#freezing epoch 설정
learn.fine_tune(epoch = 6, freeze_epoch = 3)

multi label classification

multi label의 경우 probability의 합이 1이 되지 않는경우가 있으므로, softmax를 사용할수 없다.

binary_crossentropy 함수를 사용해서 classification을 수행한다

 

  사용 미사용
Sigmoid nn.BCELoss
F.binary_cross_entropy
nn.BCELossWithLogitsLoss
F.binary_cross_entropy_with_logits
Softmax nn.NLLLoss
F.nll_loss
nn.CrossEntropyLoss
F.cross_entropy

Regression (PointBlock)

BIWI_HEAD_POSE (human head pose dataset) 을 사용하는 regression problem 활용

 

path = untar_data(URLs.BIWI_HEAD_POSE)

def get_ctr(f):	# x,y 좌표 생성함수
    ctr = np.genfromtxt(img2pose(f), skip_header = 3)
    c1 = ctr[0]*cal[0][0]/ctr[2] + cal[0][2]
    c2 = ctr[1]*cal[1][1]/ctr[2] + cal[1][2]
    return tensor([c1,c2])
    
biwi = DataBlock(
    blocks =(ImageBlock, PointBlock), # x는 image, y 는 point (x,y 좌표)로 설정
    get_items = get_image_files, # image는 get_items, text는 get_x로 함수 설정
    							 # img_files = get_image_files(path) // path를 전달해서 사용
    get_y = get_ctr,
    splitter = FuncSplitter(lambda o : o.parent.name =='13'),	# 한사람의 사진들을 valid로 분리
    batch_tfms = [*aug_transforms(size = (240,320)),
                  Normalize.from_stats(*imagenet_stats)]
)

dls = biwi.dataloaders(path)	# img_files = get_image_files(path) // path를 dataloaders에 전달해서 사용
learn = cnn_learner(dls, resnet18, y_range=(-1,1))	
dls.loss_func # default로 MESLoss() 설정

learn.lr_find(start_lr=1e-2, end_lr=1e-1, show_plot=True)	#learning finder
learn.fine_tune(3,1e-1)		#lr_find 로 찾은 값 적용
learn.show_results(ds_idx = 1, max_n = 3, figsize = (6,8))

 

Ch 7. 최신 모델 학습 기법

dataset 축소: 이미지넷의 축소버전으로 Imagenette 사용, 프로토타입 코드 확인이 쉽다

                       (1000개 class 130만장 -> 10개 class, 13000여장)

Normalize : pre-trained model 사용시 학습에 사용된 dataset의 mean과 std으로 학습할 dataset을 normalize 해야한다.

                    (fastai의 model은 자동으로 normalize 값이 적용됨)

batch_tfms = [*aug_transforms(size = (240,320)),Normalize.from_stats(*imagenet_stats)]

점진적 크기조절 : image의 크기를 작게하여 학습을 시작하고, 학습을 일부 진행한 후에 image의 크기를 크게 만들어 학습하면 일반화가 되어 accuracy가 향상된다 (transfer learning의 finetune 과정과 유사한 관계)

dls = get_dls(batch = 128,size = 128)	# batch와 size 변경
learn = Learner(dls, model, loss_func = CrossEntropyLossFlat(), metrics = accuracy)
learn.fit_one_cycle(4,3e-3)
learn.dls  = get_dls(batch = 64,size = 224)	# batch와 size 변경
learn.fine_tune(5, 1e-3)

테스트시 증강(Test Time Augmentation) : inference 단계에서 test data를 여러 정사각형으로 crop하여 예측한후에 결과값의 max 또는 mean값을 구하는 방법, inference time이 늘어나게 된다 (fastai는 자동으로 inference 단계에서 중앙의 정사각형을 crop하여 예측하므로 이를 변경해주어야함)

preds, targs = learn.tta()

Mixup: 여러 image의 투명도를 달리하여 섞어 한장의 image로 만드는 방식으로 classification시 n1, n2, ... class들을 동시에 예측하게 된다. (y = [0, 0, 0.3, 0, 0, 0.5, 0.2] )

learn = Learner(dls, model, loss_func = CrossEntropyLossFlat(), metrics = accuracy, cbs = MixUp())

labeling smoothing: 원핫 인코딩에서 0과 1이 아닌값으로 변경하여 보다 강건한 모델로 만든다 (y = [0.1, 0.1, 0.1, 0.9])

learn = Learner(dls, model, loss_func = LabelSmoothingCrossEntropy(), metrics = accuracy)

 

'AI > 라이브러리' 카테고리의 다른 글

Albumentation, Image trasnform  (0) 2022.09.22
Numba  (0) 2022.08.11
Moviepy  (0) 2022.08.01
Git 정리  (0) 2022.07.29
torch 정리  (0) 2022.07.25