0616 개발일지

이나겸·2022년 6월 16일
0

1. 학습내용

configer.py

import os
import torch
import torch.nn as nn

# 모델 가중치를 저장할 폴더 생성
os.makedirs("./weights", exist_ok=True)

# device
device = "cuda" if torch.cuda.is_available() else "cpu"

# hyper parameters - 공통적인 것만 만들어준다
batch_size  = 36
num_epochs  = 10
val_every   = 10    # 학습 돌고 평가보는 값 설정
nc          = 5
lr          = 0.025

save_weights_dir    = "./weights"
data_path           = "./dataset"

criterion = nn.CrossEntropyLoss

utils.py

import torchvision.transforms as transforms
import torch
import os
import time
import copy
import configer
import dataset

"""
1. augmentation
2. train loop
3. valid loop
4. save model
5. eval test code
"""

def data_augmentation() : # 데이터 증가
    # data augmentation 함수
    data_transforms = {
        'train': transforms.Compose([
            transforms.Resize((224, 224)),
            transforms.RandomHorizontalFlip(),
            transforms.RandomVerticalFlip(),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ]),
        'test': transforms.Compose([
            transforms.Resize((224, 224)),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ])
    }

    return data_transforms

dataset.py

import glob
import os
from PIL import Image
from torch.utils.data import Dataset

# 데이터 경로, mode, transform 인자 필요
class CustomDataset(Dataset):

    def __init__(self, path, mode, transform=None):
        # 초기값 설정, 데이터 가져오기, 경로 불러오기
        # ../14_pretrained/dataset/YogaPoses\Downdog\00000000.jpg
        self.all_data = sorted(glob.glob(os.path.join(path, mode, "*", "*.jpg")))
        self.mode = mode
        self.transform = transform


    def __getitem__(self, index):
        data_path = self.all_data[index]
        # print("data_path info >>", data_path)

        data_label = data_path.split('\\')[-2]

        # 라벨만들기

        label = 0
        if "Downdog" == data_label:
            label = 0
        elif "Goddess" == data_label:
            label = 1
        elif "Plank" == data_label:
            label = 2
        elif "Tree" == data_label:
            label = 3
        elif "Warrior2" == data_label:
            label = 4
        # print(data_label, label)

        images = Image.open(data_path).convert("RGB")
        if self.transform is not None:
            images = self.transform(images)
        # print(images, label)
        return images, label


    def __len__(self):
        return len(self.all_data)

models.py

import torch.nn as nn
import torchvision.models as models
import torch
import configer

device = configer.device

# https://tutorials.pytorch.kr/beginner/finetuning_torchvision_models_tutorial.html

def initialize_model(model_name, num_classes, use_pretrained=True):
    # Initialize these variables which will be set in this if statement. Each of these
    #   variables is model specific.
    model_ft = None
    input_size = 0

    if model_name == "resnet":
        """ Resnet18
        """
        model_ft = models.resnet18(pretrained=use_pretrained)
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "alexnet":
        """ Alexnet
        """
        model_ft = models.alexnet(pretrained=use_pretrained)
        num_ftrs = model_ft.classifier[6].in_features
        model_ft.classifier[6] = nn.Linear(num_ftrs,num_classes)
        input_size = 224

    elif model_name == "vgg":
        """ VGG11_bn
        """
        model_ft = models.vgg11_bn(pretrained=use_pretrained)
        num_ftrs = model_ft.classifier[6].in_features
        model_ft.classifier[6] = nn.Linear(num_ftrs,num_classes)
        input_size = 224

    elif model_name == "squeezenet":
        """ Squeezenet
        """
        model_ft = models.squeezenet1_0(pretrained=use_pretrained)
        model_ft.classifier[1] = nn.Conv2d(512, num_classes, kernel_size=(1,1), stride=(1,1))
        model_ft.num_classes = num_classes
        input_size = 224

    elif model_name == "densenet":
        """ Densenet
        """
        model_ft = models.densenet121(pretrained=use_pretrained)
        num_ftrs = model_ft.classifier.in_features
        model_ft.classifier = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "inception":
        """ Inception v3
        Be careful, expects (299,299) sized images and has auxiliary output
        """
        model_ft = models.inception_v3(pretrained=use_pretrained)
        # Handle the auxilary net
        num_ftrs = model_ft.AuxLogits.fc.in_features
        model_ft.AuxLogits.fc = nn.Linear(num_ftrs, num_classes)
        # Handle the primary net
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs,num_classes)
        input_size = 299

    else:
        print("Invalid model name, exiting...")
        exit()

    return model_ft, input_size

train_pant.py

import torch.cuda
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
import torch.nn as nn
import torch.optim as optim

import utils_file, dataset, configer, models_build

"""
models_build.py 학습할 모델 build 파일
utils_file.py   여러 잡동사니 (Image Show 필요한 함수 구현)
dataset.py      학습 데이터를 가져오기 위한 데이터셋 구성 (CIFAR, json 등)
configer.py     Hyper Parameter 값 셋팅 (epoch, lr, momentum, gamma 등)
"""

device = configer.device

### 1. augmentation setting
data_transform = utils_file.data_augmentation()


### 2. dataset setting
# 데이터 경로, mode, transform 인자 필요
train_data = dataset.CustomDataset(path = configer.data_path, mode ="train", transform=data_transform['train'])
test_data = dataset.CustomDataset(path = configer.data_path, mode ="val", transform=data_transform['test'])


### 3. dataloader setting
train_loader = DataLoader(train_data, batch_size=configer.batch_size, shuffle=True, drop_last=True)
test_loader = DataLoader(test_data, batch_size=configer.batch_size, shuffle=True, drop_last=True)
# for data, target in test_loader:
#     print(data, target)
# exit()


### 4. model call
net, image_size = models_build.initialize_model("resnet", num_classes=configer.nc)
# print(net, image_size)
# exit()


### 5. hyper parameter call - loss function call, optimizer, learning schedule
criterion = configer.criterion
optimizer = optim.SGD(net.parameters(), lr=configer.lr, momentum=0.9)
lr_schedule = torch.optim.lr_scheduler.StepLR(optimizer, step_size=4, gamma = 0.1)


# 과제 : train loop 구성해서 학습돌리고 학습 결과를 프린트
### 6. train loop function call


### 7. test loop function call

2. 학습소감

train loop 코드를 조금 수정해서 돌렸더니 위와 같은 결과가 나왔다.
조금씩 코드를 이해하고, 돌릴 수 있게 되는 것 같다.

0개의 댓글