Skip to content

Commit 9433630

Browse files
authored
Merge pull request #8 from dIronmanb/develop
일단 Chapter03만 연습삼아서
2 parents 31000d7 + 345b439 commit 9433630

File tree

26 files changed

+1316
-0
lines changed

26 files changed

+1316
-0
lines changed

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Chapter03/cifar10/
2+
Chapter03/save/
3+
Chapter03/runs/
4+
5+
Chapter04/__pycache__/
6+
Chapter04/dataset/
7+
Chapter04/final_result/
8+
Chapter04/runs/
9+
Chapter04/save/
10+
*.pyc

Chapter03/config.yaml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# config 파일에 대하여
2+
# config 파일에는
3+
# 딥러닝 모델
4+
# 손실 함수
5+
# 옵티마이저
6+
# 하이퍼파라미터
7+
# 에폭
8+
# 등 모든 것들이 담겨져 있다.
9+
# 뭔가 모델을 바꾸거나 에폭을 바꾸고 싶을 때는 여기서 해당 이름에 대응하는
10+
# 값만 조정하면 된다.
11+
12+
# 단, 모델, 손실 함수, 옵티마이저의 경우
13+
# 내가 원하는 것의 이름으로 변경 해당 모델, 손실함수, 옵티마이저 파일에
14+
# 정의되어 있어야 한다.
15+
16+
---
17+
file_name: "scheduler"
18+
19+
use_cuda: true
20+
epoch: 100
21+
train_batch_size: 64
22+
test_batch_size: 64
23+
learning_rate: 0.001
24+
dataset_name: "CIFAR10"
25+
26+
# train_dataset
27+
# test_dataset
28+
# 은 CIFAR10 Dataloader에서만 작업할 것이므로 pass
29+
30+
num_workers: 2
31+
train_dataset_shuffle: True
32+
test_dataset_shuffle: False
33+
data_loader_name: 'data_load_normalizing_and_agumentation'
34+
35+
model: "VGG11"
36+
model_layer: 3 # [3, 5, 9, 12]
37+
loss_function: "CrossEntropyLoss"
38+
optimizer: "Adam"
39+
scheduler_name: 'ExponentialLR'
40+
momentum: 0.9
41+
weight_decay : 0.01
42+
metrics: "accuracy_score"
43+
44+
VGG_types: {
45+
'VGG11' : [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
46+
'VGG13' : [64,64, 'M', 128, 128, 'M', 256, 256, 'M', 512,512, 'M', 512,512,'M'],
47+
'VGG16' : [64,64, 'M', 128, 128, 'M', 256, 256,256, 'M', 512,512,512, 'M',512,512,512,'M'],
48+
'VGG19' : [64,64, 'M', 128, 128, 'M', 256, 256,256,256, 'M', 512,512,512,512, 'M',512,512,512,512,'M']
49+
}
50+
51+
52+
53+
# momentum이랑 weight_decay 정의하기
54+
2.36 KB
Binary file not shown.
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
'''
2+
이미지 데이터는 촬영된 환경에 따라 명도나 채도 등이 서로 모두 다르기 때문에
3+
영상 기반 딥러닝 모델을 학습시키기 전에 모든 이미지들을 동일한 환경으로 맞춰주는 게 중요!
4+
>> 전체 이미지에 대한 화소 값의 mean과 standard deviation을 구하여 일괄 적용해야 함.
5+
>> Imagenet 데이터 세트에서 계산된 평균과 표준 편차 사용
6+
7+
8+
torch.Tensor(): T = torch.Tensor() 문장 입력시 T는 tensor자료구조 클래스 생성
9+
torch.tensor(): 어떤 data를 tensor로 copy, 괄호 안에 값이 없다면 에러남
10+
11+
train_set과 test_set모두에 preparation을 진행하는 이유:
12+
The training and testing data should undergo the same data preparation steps
13+
or the predictive model will not make sense.
14+
This means that the number of features for both the training and test set
15+
should be the same and represent the same thing.
16+
'''
17+
18+
from torch.utils.data import DataLoader
19+
from torchvision import transforms, datasets
20+
import numpy as np
21+
22+
23+
def data_load(config):
24+
name = config['data_loader_name']
25+
if name == 'data_load_only_normalizing':
26+
data_transform = transforms.Compose([
27+
transforms.ToTensor(),
28+
transforms.Normalize(mean = [0.4913, 0.4821, 0.4465],
29+
std = [0.2470, 0.2434, 0.2615])
30+
])
31+
elif name == 'data_load_normalizing_and_agumentation':
32+
33+
data_transform = transforms.Compose([
34+
transforms.RandomHorizontalFlip(p=0.5), # 이미지를 좌우반전
35+
# transforms.RandomVerticalFlip(p=0.5), # 이미지를 상하반전
36+
transforms.RandomRotation(10), # 이미지를 -90 ~ 90에서 랜덤하게 rotate
37+
# transforms.RandomResizedCrop(size = (32,32)) # 이미지의 임의의 부분을 확대하여 Resize
38+
# transforms.ToPILImage(mode = None): # PILImage로 변환
39+
40+
transforms.ToTensor(), # 이미지를 tensor_type로 변환
41+
# transforms.RandomApply(transforms = data_transform, p = 1.0), # agumentation을 전체 데이터에서 임의적으로 골라서 취함.
42+
# 왜 0.5, 0.5, 0.5를 넣어야 하는가?
43+
# >> 직접 mean과 std를 구하면 mean = [0.49139968 0.48215841 0.44653091], std = [0.24703223 0.24348513 0.26158784]
44+
# channel은 3개
45+
transforms.Normalize(mean = [0.4913, 0.4821, 0.4465], std = [0.2470, 0.2434, 0.2615]) # tensor의 데이터 수치를 정규화한다.
46+
# transforms.Normalize((0.5), (0.5))) -> -1 ~ 1 사이의 값으로 normalized # output[channel] = (input[channel] - mean[channel]) / std[channel]
47+
])
48+
elif name == 'data_load_rainbow':
49+
data_transform = transforms.Compose([
50+
transforms.RandomHorizontalFlip(p=0.5), # 이미지를 좌우반전
51+
transforms.RandomRotation(10), # 이미지를 -90 ~ 90에서 랜덤하게 rotate
52+
53+
transforms.ToTensor(), # 이미지를 tensor_type로 변환
54+
# transforms.RandomApply(transforms = data_transform, p = 1.0), # agumentation을 전체 데이터에서 임의적으로 골라서 취함.
55+
# 왜 0.5, 0.5, 0.5를 넣어야 하는가?
56+
# >> 직접 mean과 std를 구하면 mean = [0.49139968 0.48215841 0.44653091], std = [0.24703223 0.24348513 0.26158784]
57+
# channel은 3개
58+
transforms.Normalize(mean = [0.4913, 0.4821, 0.4465], std = [0.2470, 0.2434, 0.2615]) # tensor의 데이터 수치를 정규화한다.
59+
# transforms.Normalize((0.5), (0.5))) -> -1 ~ 1 사이의 값으로 normalized # output[channel] = (input[channel] - mean[channel]) / std[channel]
60+
])
61+
62+
else:
63+
print("There was no name in DataLoader_Name")
64+
65+
66+
train_set = datasets.CIFAR10(root = '/data/Github_Management/StartDeepLearningWithPytorch/Chapter03/cifar10',
67+
train = True,
68+
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.
69+
transform = data_transform)
70+
71+
test_set = datasets.CIFAR10(root = '/data/Github_Management/StartDeepLearningWithPytorch/Chapter03/cifar10',
72+
train = False,
73+
download = True,
74+
transform = data_transform
75+
)
76+
77+
# print(train_set.data.mean(axis = (0,1,2)) / 255)
78+
# print(train_set.data.std(axis = (0,1,2)) / 255)
79+
80+
# print(test_set.data.mean(axis = (0,1,2)) / 255)
81+
# print(test_set.data.std(axis = (0,1,2)) / 255)
82+
83+
train_loader = DataLoader(train_set,
84+
batch_size= 64, #['train_batch_size'],
85+
num_workers = config['num_workers'],
86+
shuffle = True)#config['train_dataset_shuffle'])
87+
88+
test_loader = DataLoader(test_set,
89+
batch_size = 64, #config['test_batch_size'],
90+
num_workers = config['num_workers'],
91+
shuffle = False) #config['test_dataset_shuffle'])
92+
93+
94+
classes = ('plane', 'car', 'bird', 'cat', 'deer',
95+
'dog', 'frog', 'horse', 'ship', 'truck')
96+
97+
return train_loader, test_loader, classes # train
98+
99+
100+

Chapter03/metric.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score
2+
3+
4+
def get_metrics(test, predicted, config):
5+
name = config['metrics']
6+
if name == "accuracy_score":
7+
return accuracy_score(test, predicted)
8+
elif name == "recall_score":
9+
return recall_score(test, predicted)
10+
elif name == "precision_score":
11+
return precision_score(test, predicted)
12+
elif name == "f1_score":
13+
return f1_score(test, predicted)
14+
else:
15+
print("There is no metrics in metrics_name")
7.04 KB
Binary file not shown.

0 commit comments

Comments
 (0)