깃허브에 있는 데이터를 다운로드 받아주고 압축을 해제 해줍니다
!mkdir dataset
!wget "https://github.com/alstjrdld1/KHU_AIproject/archive/refs/heads/main.zip"
!unzip "/content/main.zip"다운로드 받은 데이터들을 가지고 DataLoader에 담아줍니다.
사용할 모델을 정의해줍니다. 만약 기본 라이브러리나 파이썬 파일을 import해온다면 조금 다르겠지만 그것들은 비교적 쉬우므로 여기서 정의한 모델 PyramidNet을 한번 사용해 보았습니다.
출력이라던지, 정확도 계산하는 코드를 작성하는건 굉장히 번거롭습니다. 그래서 작성해두었습니다!!!
이 부분은 굳이 변경하는걸 추천드리지 않습니다!
class AverageMeter(object):
r"""Computes and stores the average and current value
"""
def __init__(self, name, fmt=':f'):
self.name = name
self.fmt = fmt
self.reset()
def reset(self):
self.val = 0
self.avg = 0
self.sum = 0
self.count = 0
def update(self, val, n=1):
self.val = val
self.sum += val * n
self.count += n
self.avg = self.sum / self.count
def __str__(self):
fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})'
return fmtstr.format(**self.__dict__)
class ProgressMeter(object):
def __init__(self, num_batches, *meters, prefix=""):
self.batch_fmtstr = self._get_batch_fmtstr(num_batches)
self.meters = meters
self.prefix = prefix
def print(self, batch):
entries = [self.prefix + self.batch_fmtstr.format(batch)]
entries += [str(meter) for meter in self.meters]
print('\t'.join(entries))
def _get_batch_fmtstr(self, num_batches):
num_digits = len(str(num_batches // 1))
fmt = '{:' + str(num_digits) + 'd}'
return '[' + fmt + '/' + fmt.format(num_batches) + ']'
def accuracy(output, target, topk=(1,)):
r"""Computes the accuracy over the $k$ top predictions for the specified values of k
"""
with torch.no_grad():
maxk = max(topk)
batch_size = target.size(0)
# _, pred = output.topk(maxk, 1, True, True)
# pred = pred.t()
# correct = pred.eq(target.view(1, -1).expand_as(pred))
# faster topk (ref: https://github.com/pytorch/pytorch/issues/22812)
_, idx = output.sort(descending=True)
pred = idx[:,:maxk]
pred = pred.t()
correct = pred.eq(target.view(1, -1).expand_as(pred))
res = []
for k in topk:
correct_k = correct[:k].reshape(-1).float().sum(0, keepdim=True)
res.append(correct_k.mul_(100.0 / batch_size))
return res학습을 진행할 때 필요한 다양한 하이퍼파라미터들입니다. 각자 수정해서 좋은 결과를 만들어 보아요!
WEIGHTDECAY = 1e-4
MOMENTUM = 0.9
BATCHSIZE = 256
LR = 0.1
EPOCHS = 150
PRINTFREQ = 20학습을 진행시키면 됩니다. normalize는 이미지의 평균값과 분산값을 이용해서 평균화를 진행하였고,
normalize = transforms.Normalize(mean=[0.4686, 0.4408, 0.4006],
std=[0.2474, 0.2393, 0.2425])데이터셋이 적으므로 학습 시에 데이터양을 늘리기 위한 augmentation으로 transform함수가 들어가 있습니다
train_transform = transforms.Compose([
# transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.RandAugment(),
transforms.ToTensor(),
normalize,
transforms.RandomErasing(),
])