Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Chapter03/cifar10/
Chapter03/save/
Chapter03/runs/

Chapter04/__pycache__/
Chapter04/dataset/
Chapter04/final_result/
Chapter04/runs/
Chapter04/save/
*.pyc
54 changes: 54 additions & 0 deletions Chapter03/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# config 파일에 대하여
# config 파일에는
# 딥러닝 모델
# 손실 함수
# 옵티마이저
# 하이퍼파라미터
# 에폭
# 등 모든 것들이 담겨져 있다.
# 뭔가 모델을 바꾸거나 에폭을 바꾸고 싶을 때는 여기서 해당 이름에 대응하는
# 값만 조정하면 된다.

# 단, 모델, 손실 함수, 옵티마이저의 경우
# 내가 원하는 것의 이름으로 변경 해당 모델, 손실함수, 옵티마이저 파일에
# 정의되어 있어야 한다.

---
file_name: "scheduler"

use_cuda: true
epoch: 100
train_batch_size: 64
test_batch_size: 64
learning_rate: 0.001
dataset_name: "CIFAR10"

# train_dataset
# test_dataset
# 은 CIFAR10 Dataloader에서만 작업할 것이므로 pass

num_workers: 2
train_dataset_shuffle: True
test_dataset_shuffle: False
data_loader_name: 'data_load_normalizing_and_agumentation'

model: "VGG11"
model_layer: 3 # [3, 5, 9, 12]
loss_function: "CrossEntropyLoss"
optimizer: "Adam"
scheduler_name: 'ExponentialLR'
momentum: 0.9
weight_decay : 0.01
metrics: "accuracy_score"

VGG_types: {
'VGG11' : [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
'VGG13' : [64,64, 'M', 128, 128, 'M', 256, 256, 'M', 512,512, 'M', 512,512,'M'],
'VGG16' : [64,64, 'M', 128, 128, 'M', 256, 256,256, 'M', 512,512,512, 'M',512,512,512,'M'],
'VGG19' : [64,64, 'M', 128, 128, 'M', 256, 256,256,256, 'M', 512,512,512,512, 'M',512,512,512,512,'M']
}



# momentum이랑 weight_decay 정의하기

Binary file not shown.
100 changes: 100 additions & 0 deletions Chapter03/data_loaders/data_loaders.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
'''
이미지 데이터는 촬영된 환경에 따라 명도나 채도 등이 서로 모두 다르기 때문에
영상 기반 딥러닝 모델을 학습시키기 전에 모든 이미지들을 동일한 환경으로 맞춰주는 게 중요!
>> 전체 이미지에 대한 화소 값의 mean과 standard deviation을 구하여 일괄 적용해야 함.
>> Imagenet 데이터 세트에서 계산된 평균과 표준 편차 사용


torch.Tensor(): T = torch.Tensor() 문장 입력시 T는 tensor자료구조 클래스 생성
torch.tensor(): 어떤 data를 tensor로 copy, 괄호 안에 값이 없다면 에러남

train_set과 test_set모두에 preparation을 진행하는 이유:
The training and testing data should undergo the same data preparation steps
or the predictive model will not make sense.
This means that the number of features for both the training and test set
should be the same and represent the same thing.
'''

from torch.utils.data import DataLoader
from torchvision import transforms, datasets
import numpy as np


def data_load(config):
name = config['data_loader_name']
if name == 'data_load_only_normalizing':
data_transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean = [0.4913, 0.4821, 0.4465],
std = [0.2470, 0.2434, 0.2615])
])
elif name == 'data_load_normalizing_and_agumentation':

data_transform = transforms.Compose([
transforms.RandomHorizontalFlip(p=0.5), # 이미지를 좌우반전
# transforms.RandomVerticalFlip(p=0.5), # 이미지를 상하반전
transforms.RandomRotation(10), # 이미지를 -90 ~ 90에서 랜덤하게 rotate
# transforms.RandomResizedCrop(size = (32,32)) # 이미지의 임의의 부분을 확대하여 Resize
# transforms.ToPILImage(mode = None): # PILImage로 변환

transforms.ToTensor(), # 이미지를 tensor_type로 변환
# transforms.RandomApply(transforms = data_transform, p = 1.0), # agumentation을 전체 데이터에서 임의적으로 골라서 취함.
# 왜 0.5, 0.5, 0.5를 넣어야 하는가?
# >> 직접 mean과 std를 구하면 mean = [0.49139968 0.48215841 0.44653091], std = [0.24703223 0.24348513 0.26158784]
# channel은 3개
transforms.Normalize(mean = [0.4913, 0.4821, 0.4465], std = [0.2470, 0.2434, 0.2615]) # tensor의 데이터 수치를 정규화한다.
# transforms.Normalize((0.5), (0.5))) -> -1 ~ 1 사이의 값으로 normalized # output[channel] = (input[channel] - mean[channel]) / std[channel]
])
elif name == 'data_load_rainbow':
data_transform = transforms.Compose([
transforms.RandomHorizontalFlip(p=0.5), # 이미지를 좌우반전
transforms.RandomRotation(10), # 이미지를 -90 ~ 90에서 랜덤하게 rotate

transforms.ToTensor(), # 이미지를 tensor_type로 변환
# transforms.RandomApply(transforms = data_transform, p = 1.0), # agumentation을 전체 데이터에서 임의적으로 골라서 취함.
# 왜 0.5, 0.5, 0.5를 넣어야 하는가?
# >> 직접 mean과 std를 구하면 mean = [0.49139968 0.48215841 0.44653091], std = [0.24703223 0.24348513 0.26158784]
# channel은 3개
transforms.Normalize(mean = [0.4913, 0.4821, 0.4465], std = [0.2470, 0.2434, 0.2615]) # tensor의 데이터 수치를 정규화한다.
# transforms.Normalize((0.5), (0.5))) -> -1 ~ 1 사이의 값으로 normalized # output[channel] = (input[channel] - mean[channel]) / std[channel]
])

else:
print("There was no name in DataLoader_Name")


train_set = datasets.CIFAR10(root = '/data/Github_Management/StartDeepLearningWithPytorch/Chapter03/cifar10',
train = True,
download = True, # If true, downloads the dataset from the internet and puts it in root directory. If dataset is already downloaded, it is not downloaded again.
transform = data_transform)

test_set = datasets.CIFAR10(root = '/data/Github_Management/StartDeepLearningWithPytorch/Chapter03/cifar10',
train = False,
download = True,
transform = data_transform
)

# print(train_set.data.mean(axis = (0,1,2)) / 255)
# print(train_set.data.std(axis = (0,1,2)) / 255)

# print(test_set.data.mean(axis = (0,1,2)) / 255)
# print(test_set.data.std(axis = (0,1,2)) / 255)

train_loader = DataLoader(train_set,
batch_size= 64, #['train_batch_size'],
num_workers = config['num_workers'],
shuffle = True)#config['train_dataset_shuffle'])

test_loader = DataLoader(test_set,
batch_size = 64, #config['test_batch_size'],
num_workers = config['num_workers'],
shuffle = False) #config['test_dataset_shuffle'])


classes = ('plane', 'car', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck')

return train_loader, test_loader, classes # train



15 changes: 15 additions & 0 deletions Chapter03/metric.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score


def get_metrics(test, predicted, config):
name = config['metrics']
if name == "accuracy_score":
return accuracy_score(test, predicted)
elif name == "recall_score":
return recall_score(test, predicted)
elif name == "precision_score":
return precision_score(test, predicted)
elif name == "f1_score":
return f1_score(test, predicted)
else:
print("There is no metrics in metrics_name")
Binary file added Chapter03/model/__pycache__/models.cpython-36.pyc
Binary file not shown.
Loading