일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 분할 정복
- 문자열
- 백트래킹
- 2023
- dfs
- 크루스칼
- 자바스크립트
- tensorflow
- back propagation
- BFS
- 플로이드 와샬
- 가끔은 말로
- 알고리즘
- lazy propagation
- 회고록
- object detection
- NEXT
- 조합론
- c++
- 너비 우선 탐색
- 다익스트라
- dropout
- Overfitting
- 가끔은_말로
- pytorch
- 이분 탐색
- 세그먼트 트리
- 미래는_현재와_과거로
- DP
- 우선 순위 큐
- Today
- Total
Doby's Lab
Cat & Dog Binary Classification Project Version 2 본문
Cat & Dog Binary Classification Project Version 2
도비(Doby) 2023. 1. 7. 18:20✔️ Contents
- Intro
- Purpose
- Tool
- Project Structure
- Data Preprocessing
- Modeling (Overfitting)
- Outro
- Postings related Project
- Reference
✔️ Intro
기존의 프로젝트를 끝내고 나서 Version 1은 55.51%라는 성능이 '반은 맞추고, 반은 틀리는 인공지능'이라는 생각이 들었습니다.
이러한 성능에 대해서 훨씬 더 디벨롭시켜야 된다 생각했고, 기존의 Version 1에서 이미지를 Warping 시켜서 resize처리했는데 Center Cropping을 적용해서 이미지를 resize 하면 성능이 올라갈 것을 기대하며 프로젝트를 시작했습니다.
진행하는 과정에서 resize를 발판으로 더 다양한 목적을 위해 여러 가지 이슈들을 만나 왜 발생하는지 이해하고, 이에 따라 처리하였습니다.
그리고, 모델의 Overfitting에 대해 사용하는 기법 및 기술이 다양한 것을 알고, 공부하며 적용해보는 프로젝트 기간을 가지며 목표였던 80%의 Accuracy를 도달하며 프로젝트를 마쳤습니다.
성취감이 컸던 만큼 아쉬운 점도 많았던 프로젝트였는데 어떻게 진행되었는지 알아보겠습니다.
Duration
- 22.12.19 ~ 23.01.07 (19일)
- 프로젝트 기간 + 블로그 정리 기간
Project Github
- Version 1과 같은 Repository에 Version 2를 만들어뒀습니다.
https://github.com/drawcodeboy/Cat_n_Dog_Classification
GitHub - drawcodeboy/Cat_n_Dog_Classification: 고양이와 개를 Binary Classification하는 첫 인공지능 프로젝트입
고양이와 개를 Binary Classification하는 첫 인공지능 프로젝트입니다. Contribute to drawcodeboy/Cat_n_Dog_Classification development by creating an account on GitHub.
github.com
Version Update
https://draw-code-boy.tistory.com/523
Cat & Dog Binary Classification Project Version 2.1 (FINAL)
✔️ Contents Intro Modifications Modeling Outro Postings related Project ✔️ Intro Version 2를 끝내고 난 후, 공부할 것들을 다 정리하여 공부하는 시간을 갖는 Project After Project의 시간을 가졌었습니다. 공부했었
draw-code-boy.tistory.com
✔️ Purpose
목적은 Intro에서 말했다시피 Test set에서 모델의 Accuracy가 80% 이상이 나오는 것이었습니다.
원래 목표는 70% 이상이었는데 모델이 76%가 나왔을 때, 구글에서 임의 이미지 10장을 가져왔었는데 반을 틀려버리는 사례가 있었어서 더 높여야겠다는 생각에 80% 이상으로 잡았습니다.
이와 더불어 목적에 다가감에 있어 배우게 되는 새로운 지식들을 공부하여 제 것으로 만드는 것이 목표였습니다.
그리고, Version 1에서 아쉬웠던 점인 Tensoflow의 Dataset을 사용하면서 어려웠던 점이 있어서 원하는 작업을 못 했었는데 이번엔 Numpy로 직접 Dataset을 다루게 되면서 원하는 작업들을 했었습니다.
또한, 'Version 1에서 알게 된 지식들을 잘 사용하는가?'도 주목할 부분이었습니다.
✔️ Tool
Tool은 Version 1과 마찬가지로 큰 변화는 없습니다.
resize를 위한 cv2, 그리고 train_set, test_set 분리를 위한 sklearn만 추가되었습니다.
IDE: Google Colab
Language: Python
Main Library: Tensorflow, Numpy, cv2, sklearn, PIL, os 등
✔️ Project Structure
이번 프로젝트는 총 3개의 노트북을 활용했습니다. 저번 프로젝트와 달리 직접 데이터셋을 다루어보고 싶었기 때문에 keras에서 제공하는 load_img()를 활용했습니다.
이로 인해 이미지를 가져오는 데에서 시간적인 소요가 많아서 np.save(), np.load()를 통해 다른 노트북에서도 데이터를 다룰 수 있게 하였습니다.
넘파이를 통해 데이터셋을 넘기는 과정에서 RAM 과다 사용으로 인한 런타임 다운, 다음 노트북에서 데이터셋을 확인하지 않아 발생한 모델 학습 중 비이상적인 현상이 있었습니다.
이러한 이슈들에 관해서는 아래 포스팅을 통해 정리해 봤습니다.
📄 Normalization Runtime-Out (Memory Leak)
- Normalization에 의해 일어난 메모리가 터진 현상
https://draw-code-boy.tistory.com/491
Normalization, uint8 -> float64 RAM, 런타임 다운되는 현상
🤔 Problem 이미지 데이터셋을 전처리하는 과정에서 Min Max Scaling 방법을 통해 Normalization을 해주려 했습니다. 이미지 Dataset이기 때문에 min값과 max값이 각각 0, 255이기 때문에 데이터셋에 255.0을 나
draw-code-boy.tistory.com
📄 Dataset을 Shuffle 해야 하는 이유
- 데이터셋을 섞지 않아 발생한 Train_set의 Loss가 확 튀는 비이상적인 현상
https://draw-code-boy.tistory.com/492
Dataset Shuffle을 해야 하는 이유
🤔 Problem 모델을 학습시키는 과정에서 이상한 현상이 나타나 문제점으로 삼았습니다. 문제는 train_set의 Accuracy는 100%로 유지되며 Loss는 변동이 거의 없다가 갑자기 한 두 번 엄청 상승하는 현상
draw-code-boy.tistory.com
np.save() 관련해서는 DACON의 토크를 통해 도움을 받았습니다.
https://dacon.io/forum/407402
✔️ Data Preprocessing
☁ 1. Center Cropping
이번 프로젝트에 발판이 되었던 아이디어입니다. 기존 Version 1에서는 'Warping이 되어 이미지 정보를 왜곡시키는 게 아닐까 라는 생각으로부터 Center Cropping을 적용하면 다를 지도 모르겠다' 싶어서 시작했지만 큰 효과는 없었습니다.
📄 Warping, Padding, Center Cropping의 관한 정리
https://draw-code-boy.tistory.com/494
Warping, Padding, Center Cropping (Image Resize #1)
데이터셋의 이미지를 전처리하는 과정에서 모델에 학습시키기 위해 input_shape를 모델과 같게 맞춰주어야 합니다. 즉, 사이즈를 바꿔주어야 하는데 이 과정에서 어떤 과정을 거칠지는 엔지니어의
draw-code-boy.tistory.com
하지만, 이 과정에서 Center Cropping을 적용하면서 제각각이 된 이미지의 resize는 어떻게 처리할지 공부하다가 cv2에서 제공하는 resize의 Interpolation을 통해 적용하면서 이에 대해 공부할 수 있었습니다.
📄 Interpolation의 관한 정리
https://draw-code-boy.tistory.com/495
Interpolation, cv2.resize() (Image Resize #2)
Center Cropping을 하고 나서 궁금했던 점은 width와 height는 같아졌는데 input_shape와 맞지 않아서 어떻게 처리해야 할지가 의문이었습니다. 예를 들어 아래의 경우처럼 input_shape보다 작게 나와서 이미
draw-code-boy.tistory.com
Center Cropping Code
(Code Reference: https://stackoverflow.com/questions/39382412/crop-center-portion-of-a-numpy-image)
# image_preprocessing: center cropping
def crop_center(img):
y, x, z = img.shape
crop_size = min(y, x)
start_x = x // 2 - (crop_size // 2)
start_y = y // 2 - (crop_size // 2)
img = img[start_y:start_y + crop_size, start_x:start_x + crop_size]
if crop_size < 224: # 확대 할 때, 바이큐빅 보간법
return cv2.resize(img, (224, 224), interpolation=cv2.INTER_CUBIC)
elif crop_size > 224: # 축소할 때, 영역 보간법
return cv2.resize(img, (224, 224), interpolation=cv2.INTER_AREA)
else:
return img
☁ 2. Gray Scaling
조금 더 성능을 높이고자 개와 고양이라는 데이터의 특성에 대해 생각해보는 중에 '털의 색이 곂치는 개랑 고양이도 많다'라는 판단이 들어 형태의 특성에 집중시키고 싶어서 Gray Scaling을 진행했습니다.
별 효과는 없었지만 데이터를 처리하는 데에 있어서 메인 이슈 중 하나가 메모리의 과다 사용이었기 때문에 Gray Scaling을 통해 3 Channel에서 1 Channel로 변경됨에 있어서 메모리를 줄이는 기술로 사용하게 되었습니다.
☁ 3. Normalization
전처리를 하는 과정에 '이미지 데이터는 모두 같은 범위의 Pixel을 사용하는데 Normalization이 왜 필요할까'라는 의문이 들었습니다.
왜냐하면 이전까지 Normalization은 범위가 다른 featrue에 대해서 scale이 넓은 feature가 끼치는 영향을 줄이기 위해 사용했었기 때문입니다.
그래서 이와 관련해서 추가적인 내용들을 공부하여 정리해 보았습니다.
+ 또한, float64를 사용하면 메모리의 양이 너무 커져서 float32로 변환하여 데이터를 사용했습니다.
x_train = np.array(x_train, dtype=np.float32)
📄 Normalization이 필요한 이유
https://draw-code-boy.tistory.com/496
Normalization이 필요한 이유
Normalization Normalization이란 정규화로 특정 feature의 scale을 0에서 1로 새롭게 scaling 하는 기법을 의미합니다. (개념에 대해 정리한 글) https://draw-code-boy.tistory.com/438 Standardization(표준화)와 Normalization(
draw-code-boy.tistory.com
☁ 4. Image Augmentation
Image Augmentation이란 train_set에 변형을 주어 데이터의 양과 다양함을 늘리는 방법으로 Overfitting을 피할 수 있습니다.
약 8,000개의 이미지를 가진 데이터셋에 3가지 변형을 주어 4배 정도 데이터셋을 불렸습니다.
이와 관련해서도 정리한 포스팅을 첨부하겠습니다.
📄 Image Augmentation이란
https://draw-code-boy.tistory.com/497
Image Augmentation이란?
Image Augmentation Image Augmentation(이미지 증강)이란 Overfitting을 막는 방법 중 하나입니다. 더 디테일하게 말하자면 데이터셋의 크기가 작으면 train_set에 대해 모델이 학습할 수 있는 게 적습니다. 그렇
draw-code-boy.tistory.com
☁ 5. Save Dataset
np.save로 데이터셋을 저장하는 과정에서도 런타임이 다운되는 사례가 있었기 때문에 아래와 같이 함수를 하나 만들어 부분적인 사이즈를 지정하여 저장할 수 있도록 했습니다.
def save_np(dataset, batch_size, save_path, file_name):
max_batch_num = dataset.shape[0] // batch_size # 몇 번의 Batch로 나눌 수 있나
max_batch_num = max_batch_num + 1 # 나머지 데이터도 Batch로 나눈다
start = 0
end = batch_size
for file_index in range(1, max_batch_num):
file_path = file_name + str(file_index)
path_ = os.path.join(save_path, file_path)
np.save(path_, dataset[start : end])
start = start + batch_size
end = end + batch_size
last_file_path = file_name + str(max_batch_num)
last_path_ = os.path.join(save_path, last_file_path)
np.save(last_path_, dataset[start:])
✔️ Modeling (Overfitting)
이번 프로젝트에서 모델은 저번 버전과 유사하게 가려했으나 너무 낮은 성능 때문에 모델에 집중을 해야 했습니다.
이로 인해 데이터 관련 이슈를 처리하는 것보다 더 많은 시간이 들었습니다.
'가장 큰 이슈는 Overfitting을 어떻게 처리하는가?'가 제일 컸습니다.
앞서 다룬 Image Augmentation을 포함하여 여러 기술을 공부하여 정리했습니다.
☁ 1. L2 Regularization
모델에 규제를 가하여 가중치의 일반화를 시키는 방법으로 Overfitting을 줄이는 방법입니다.
규제를 적용했을 때의 성능은 50%에서 단숨에 70%까지 왔지만 조금 더 성능을 높여야 했습니다.
더불어 규제를 어느 정도 가할지에 대한 하이퍼파라미터에 따른 결과를 더 디테일하게 공부해야 합니다.
📄 L1, L2 Regularization에 대하여
https://draw-code-boy.tistory.com/502
L1, L2 Regularization에 대하여
Regularization Overfitting 문제를 해결하는 데에 있어서 여러 기법들이 있습니다. 오늘은 L1, L2 Regularization에 대해 알아봅시다. 이 두 기법은 모델이 복잡할 때 일어나는 Overfitting을 해결하기 위한 기법
draw-code-boy.tistory.com
☁ 2. Dropout
Dropout은 뉴런을 Dropout-rate에 의해 껐다 켜졌다 하는 방식으로 일부 feature의 영향이 강하지 않고 균등하게 뉴런들이 학습하며, 뉴런들이 켜지고 꺼짐을 통해 여러 모델이 형성되는 거 같은 앙상블의 효과를 가져오는 기술입니다.
📄 Dropout에 대하여
https://draw-code-boy.tistory.com/503
Dropout에 대하여
Dropout Dropout이란 학습을 하면서 일부 뉴런을 일부러 끄면서 Overfitting을 방지하는 기법입니다. 뉴런들이 꺼지는 기준은 Hyperparameter인 Dropout-rate를 통해 꺼질지 말지 결정합니다. 또한, Dropout은 batch
draw-code-boy.tistory.com
☁ 3. Batch Normalization
데이터가 Layer를 통과함에 따라 분포가 달라지는 이러한 현상을 Covariate Shift라고 합니다.
이러한 현상이 지속될수록 train_set에 대한 분포를 학습하여 Overfitting이 일어날 수 있기 때문에 Normalization을 통해 해결하는 방법입니다.
이와 관련해 기본적인 부분을 다루었지만 원인과 Activation과의 선후 관계에 대해 궁금한 점이 많아서 프로젝트가 끝난 후, 무조건 더 깊이 다루어 보아야 할 부분인 듯합니다.
📄 Batch Normalization이란?
https://draw-code-boy.tistory.com/504
Batch Normalization이란? (Basic)
Batch Normalization Batch Normalization는 모델이 복잡할 때, 정확히는 Layer가 깊어지면서 가지는 복잡도가 높을 때 일어나는 Overfitting을 해결하기 위한 기법입니다. Batch Normalization이 어떻게 작동되는지
draw-code-boy.tistory.com
☁ 4. Callback
이와 더불어 늘 사용하던 Callback에 대해 잘못 알고 있던 점이 있었고, Learning Rate를 에포크동안 줄이는 Callback(ReduceLROnPlateau)에 대해서도 알게 되어 이 또한 정리해 보았습니다.
📄 Tensorflow의 Callback
https://draw-code-boy.tistory.com/505
Tensorflow의 Callback(EarlyStopping, ReduceLROnPlateau)
Callback keras는 Callback이라는 개념이 있습니다. 에포크를 진행하면서 특정한 값을 모니터링하면서 학습에 변동사항을 주는 기능입니다. Callback에는 여러 가지 종류가 많지만 자주 쓰이는 2가지만
draw-code-boy.tistory.com
☁ 5. Modeling
이 기술들을 발판으로 아래와 같은 모델링을 했습니다.
전체적인 모델링에 대한 레퍼런스는 캐글을 참고했습니다.
(Model Reference https://www.kaggle.com/code/uysimty/keras-cnn-dog-or-cat-classification)
# Modeling
# 1st Conv
model = keras.Sequential()
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu',
padding = 'same', input_shape=(224, 224, 1),
kernel_regularizer=keras.regularizers.l2(0.002)))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.Dropout(0.2))
# 2nd Conv
model.add(keras.layers.Conv2D(64, kernel_size=3, activation='relu',
padding = 'same',
kernel_regularizer=keras.regularizers.l2(0.002)))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.Dropout(0.2))
# 3rd Conv
model.add(keras.layers.Conv2D(128, kernel_size=3, activation='relu',
padding = 'same',
kernel_regularizer=keras.regularizers.l2(0.002)))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.Dropout(0.2))
# Dense
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(512, activation='relu',
kernel_regularizer=keras.regularizers.l2(0.002)))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dropout(0.2))
model.add(keras.layers.Dense(1, activation='sigmoid'))
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_3 (Conv2D) (None, 224, 224, 32) 320
batch_normalization_4 (Batc (None, 224, 224, 32) 128
hNormalization)
max_pooling2d_3 (MaxPooling (None, 112, 112, 32) 0
2D)
dropout_4 (Dropout) (None, 112, 112, 32) 0
conv2d_4 (Conv2D) (None, 112, 112, 64) 18496
batch_normalization_5 (Batc (None, 112, 112, 64) 256
hNormalization)
max_pooling2d_4 (MaxPooling (None, 56, 56, 64) 0
2D)
dropout_5 (Dropout) (None, 56, 56, 64) 0
conv2d_5 (Conv2D) (None, 56, 56, 128) 73856
batch_normalization_6 (Batc (None, 56, 56, 128) 512
hNormalization)
max_pooling2d_5 (MaxPooling (None, 28, 28, 128) 0
2D)
dropout_6 (Dropout) (None, 28, 28, 128) 0
flatten_1 (Flatten) (None, 100352) 0
dense_2 (Dense) (None, 512) 51380736
batch_normalization_7 (Batc (None, 512) 2048
hNormalization)
dropout_7 (Dropout) (None, 512) 0
dense_3 (Dense) (None, 1) 513
=================================================================
Total params: 51,476,865
Trainable params: 51,475,393
Non-trainable params: 1,472
_________________________________________________________________
model.compile(optimizer='adam', loss='binary_crossentropy', metrics='accuracy')
early_stopping_cb = keras.callbacks.EarlyStopping(patience=6, verbose=1,
restore_best_weights=True)
learning_rate_reduction_cb = keras.callbacks.ReduceLROnPlateau(
monitor='val_accuracy', patience = 4, verbose=1, factor=0.5, min_lr=0.00001
)
☁ 6. Process
🤔 Process 1
처음 Version1의 모델에서 Dense Layer에만 Dropout을 가하였을 때는 큰 변화가 없었습니다.
처음과 똑같이 Overfitting이었지만 test_set에 대한 Accuracy만 변동이 없었고, train_set의 Accuracy가 많이 내려갔었습니다.
train_set Accuracy: 92.21% -> 64.46%
test_set Accuracy: 50.27% -> 49.13%
Dropout의 효과로 train_set에 대해 영향을 줄이기는 했으나 적합한 weight를 찾지 못하고 있다고 생각했습니다.
resnet50과도 비교했을 때, 큰 차이가 없는 걸 보아 Regularization이 필요하다 판단했습니다.
🤔 Process 2
Dropout을 각 Conv, Dense Layer에 추가하며 Dropout-rate(0.5 -> 0.2)를 줄이고, L2-Regularization(0.1)을 각 Conv, Dense Layer에 추가했습니다.
이때의 규제가 좀 강하게 가해졌던 거 같습니다.
test_set Accuracy: 49.13% -> 65.65%
🤔 Process 3
Image Augmentation을 통해 2가지 이미지(시계방향 90, 180 전환)를 추가했을 때의 결과입니다.
test_set Accuracy: 65.65% -> 약 74%
🤔 Process 4
이미지의 특성을 고려하여 좌우반전, 왼쪽 45도, 오른쪽 45도를 기울인 Image Augmentation을 적용하고,
Batch Normalization을 적용하고, L2 Regularization의 규제를 살짝 풀었습니다.
에포크를 늘리고, Early Stopping의 patience를 늘리면서 아래와 같은 결과를 가져왔습니다.
test_set Accuracy 약 74% -> 86.51%
🤔 Process 5 (Final)
데이터의 Normalization이 적용 안 되어있었음을 확인했습니다 😥
추가적으로 에포크 30에서 50으로 더 늘리면서 val_loss 튐 현상에 대해 규제를 0.001에서 0.002로 더 가했습니다.
+ EarlyStopping의 patience가 조금 더 높았다면 학습을 진행했을 거 같기도 합니다.
test_set Accuracy 86.51% -> 87.89%
✔️ Outro
📄 Result
Test set Accuracy | Test set Loss | |
Version1 | 50.27% | 0.6954 |
Version2 Process 1 | 49.13% | - |
Version2 Process 2 | 65.65% | - |
Version2 Process 3 | 74.XX% | - |
Version2 Process 4 | 86.51% | 0.4662 |
Version2 Process 5 (Final) | 87.89% | 0.4305 |
📈 좋았던 점
이번 프로젝트가 꽤 컸던 만큼 많은 것을 얻어가는 시간이었습니다.
😊 높아진 성능
기술을 적용함에 따라 계속 성능이 올라가고 최종적인 성능에 도달함에 따라 많은 뿌듯함을 느꼈습니다.
적용한 기술에 대해 100% 알고 적용한 것은 아니라 2023년에는 원론적인 부분들에 대해 많은 접근이 필요함을 느낍니다.
(ex: L1 Regularization 절댓값 함수 미분, Batch Normalization, Activation 선후관계 등)
그리고, 텐서플로우에서 제공하는 여러 클래스와 메서드에 관한 공부도 필요합니다.
(ex: ImageDataGenerator, tf.data.Dataset)
제공하는 데에는 다 이유가 있고, 더 효율적인 작업이 이루어질 수 있기 때문입니다.
😊 10번의 포스팅
2개의 이슈와 8개의 개념 정리를 통해 많이 공부했습니다.
총정리인 지금 이 포스팅을 정리하며 10개 모두 링크를 걸면서 하나로 연결되니 이런 곳에서도 성취감을 느끼네요.
😊 모델 사용
Version 1에 큰 아쉬운 점은 내가 만든 내 모델인데 사용해보지를 못 했다는 것입니다.
이번엔 직접 다루어보면서 구글에서 임의로 가져온 이미지 10장도 맞추었을 때 성취감을 많이 느꼈습니다.
😊 커뮤니티 활용
Stackoverflow, DACON, Kaggle 등 여러 커뮤니티에서 많은 도움을 받아 프로젝트를 진행할 수 있었습니다.
특히나 DACON에서는 직접 질문을 올려 많은 도움을 받았었습니다.
📉 아쉬웠던 점
큰 프로젝트였던만큼 많은 것을 공부하고, 사용했지만 그만큼 아쉬웠던 부분들도 많았던 거 같습니다.
😅 체계적인 로그 및 기록 시스템 관리
모델에 대해 변동사항이 있으면 기록해두는 것이 좋다고 생각해서 나름대로 잘 기록했었다 생각하지만
정리할 때가 되니 찾고 있던 로그가 보이지 않고, 언제 했는지도 모를 로그들이 발견되며
'내가 왜 이렇게 했더라'라는 일들이 빈번하게 있었습니다.
모델링 변경사항, 아이디어, 이슈, 변경사항에 따른 시각화 자료를 시간별로 담을 노트가 필요합니다.
또한, 공책, 티스토리 임시저장, 깃허브 등 여러 군데에 써두다 보니 꽤 혼란을 가져오기도 해서 통합적인 정리가 필요합니다.
앞으로 노션이나 옵시디언을 통해 더 체계적인 프로젝트 로그 통합 시스템을 구성할 예정입니다.
+ colab으로 하다보니 git bash를 통해 commit 하지 않고, 사본으로 바로 저장해서 버전 구별을 위한 파일 정리도 못 했습니다😥
😅 선 공부, 후 적용
알게 되었던 기술마다 바로 적용하고, 후에 공부를 했었는데 이도 좋지 못한 거 같습니다.
공부를 해야 적절한 하이퍼파라미터에 대한 접근도 가능하고,
프로젝트에서 Batch Normalization과 Activation의 선후관계도 끝나고 알았었기 때문에
조금 느리더라도 공부를 먼저 하고 나서 적용하는 게 앞으로에 있어서 좋을 거 같습니다.
😅 RAM, 데이터셋 가져오기
Version 2에서 데이터셋을 옮기고 가져오는 것에 대해 RAM 관련 이슈가 많았던 만큼
어떻게 하면 효율적으로 가져올지도 많이 알아봐야 합니다.
image_dataset_from_directory 같은 메서드는 RAM을 잡아먹는 기억이 없었는데 이와 관련해서 알아보겠습니다.
추가적으로 하드웨어 가속기에 따라 데이터를 가져오는 데에 있어 RAM 사용량이 다른 거 같습니다.
TPU를 사용했을 때는 잘 가져오는데 CPU는 런타임이 다운되는 것을 확인했습니다.
이와 관련해서도 알아봐야 할 거 같습니다.
😅 Colab Pro GPU
런타임 다운 현상에 있어서 RAM이 부족한 것 때문일까 싶어서 Colab Pro를 신청하여 RAM을 늘렸었습니다. (물론 런타임이 다운되는 건 그 이유가 아니었습니다.)
+ RAM 때문에 Image Augmentation이 우려되어 많이 못 했는데 이것도 아쉬운 부분으로 남습니다.
그리고, GPU도 혜택 받아서 사용하였는데 '컴퓨팅 단위'라는 게 있는지 모르고, 조금이라도 변동사항이 있으면 바로 학습하여 모두 다 써버렸었습니다.
또한, 세션 관리도 다 쓴 노트북은 꺼버리지 않고 두어서 낭비도 했습니다.
다음 프로젝트는 효율적인 런타임 운영을 위해 Colab에 대해서도 좀 공부할 필요도 있습니다.
전역하면 무조건 GPU 살 거 같습니다😢
👏 END! 👏
추후에 Version 3로 돌아와서 더 좋은 성능의 모델을 만들어보고 싶습니다.
구글에서 임의로 긁어온 24장 중 13장만 맞춰서 또 아쉬운 맘이 듭니다. 다음엔 93% 이상의 모델을 만들어보고 싶네요.
이상으로 19일 간의 프로젝트를 마칩니다.
끝!
✔️ Postings related Project
https://draw-code-boy.tistory.com/491
Normalization, uint8 -> float64 RAM, 런타임 다운되는 현상
🤔 Problem 이미지 데이터셋을 전처리하는 과정에서 Min Max Scaling 방법을 통해 Normalization을 해주려 했습니다. 이미지 Dataset이기 때문에 min값과 max값이 각각 0, 255이기 때문에 데이터셋에 255.0을 나
draw-code-boy.tistory.com
https://draw-code-boy.tistory.com/492
Dataset Shuffle을 해야 하는 이유
🤔 Problem 모델을 학습시키는 과정에서 이상한 현상이 나타나 문제점으로 삼았습니다. 문제는 train_set의 Accuracy는 100%로 유지되며 Loss는 변동이 거의 없다가 갑자기 한 두 번 엄청 상승하는 현상
draw-code-boy.tistory.com
https://draw-code-boy.tistory.com/494
Warping, Padding, Center Cropping (Image Resize #1)
데이터셋의 이미지를 전처리하는 과정에서 모델에 학습시키기 위해 input_shape를 모델과 같게 맞춰주어야 합니다. 즉, 사이즈를 바꿔주어야 하는데 이 과정에서 어떤 과정을 거칠지는 엔지니어의
draw-code-boy.tistory.com
https://draw-code-boy.tistory.com/495
Interpolation, cv2.resize() (Image Resize #2)
Center Cropping을 하고 나서 궁금했던 점은 width와 height는 같아졌는데 input_shape와 맞지 않아서 어떻게 처리해야 할지가 의문이었습니다. 예를 들어 아래의 경우처럼 input_shape보다 작게 나와서 이미
draw-code-boy.tistory.com
https://draw-code-boy.tistory.com/496
Normalization이 필요한 이유
Normalization Normalization이란 정규화로 특정 feature의 scale을 0에서 1로 새롭게 scaling 하는 기법을 의미합니다. (개념에 대해 정리한 글) https://draw-code-boy.tistory.com/438 Standardization(표준화)와 Normalization(
draw-code-boy.tistory.com
https://draw-code-boy.tistory.com/497
Image Augmentation이란?
Image Augmentation Image Augmentation(이미지 증강)이란 Overfitting을 막는 방법 중 하나입니다. 더 디테일하게 말하자면 데이터셋의 크기가 작으면 train_set에 대해 모델이 학습할 수 있는 게 적습니다. 그렇
draw-code-boy.tistory.com
https://draw-code-boy.tistory.com/502
L1, L2 Regularization에 대하여
Regularization Overfitting 문제를 해결하는 데에 있어서 여러 기법들이 있습니다. 오늘은 L1, L2 Regularization에 대해 알아봅시다. 이 두 기법은 모델이 복잡할 때 일어나는 Overfitting을 해결하기 위한 기법
draw-code-boy.tistory.com
https://draw-code-boy.tistory.com/503
Dropout에 대하여
Dropout Dropout이란 학습을 하면서 일부 뉴런을 일부러 끄면서 Overfitting을 방지하는 기법입니다. 뉴런들이 꺼지는 기준은 Hyperparameter인 Dropout-rate를 통해 꺼질지 말지 결정합니다. 또한, Dropout은 batch
draw-code-boy.tistory.com
https://draw-code-boy.tistory.com/504
Batch Normalization이란? (Basic)
Batch Normalization Batch Normalization는 모델이 복잡할 때, 정확히는 Layer가 깊어지면서 가지는 복잡도가 높을 때 일어나는 Overfitting을 해결하기 위한 기법입니다. Batch Normalization이 어떻게 작동되는지
draw-code-boy.tistory.com
https://draw-code-boy.tistory.com/505
Tensorflow의 Callback(EarlyStopping, ReduceLROnPlateau)
Callback keras는 Callback이라는 개념이 있습니다. 에포크를 진행하면서 특정한 값을 모니터링하면서 학습에 변동사항을 주는 기능입니다. Callback에는 여러 가지 종류가 많지만 자주 쓰이는 2가지만
draw-code-boy.tistory.com
✔️ Reference
https://eehoeskrap.tistory.com/430
[Deep Learning] Batch Normalization (배치 정규화)
사람은 역시 기본에 충실해야 하므로 ... 딥러닝의 기본중 기본인 배치 정규화(Batch Normalization)에 대해서 정리하고자 한다. 배치 정규화 (Batch Normalization) 란? 배치 정규화는 2015년 arXiv에 발표된 후
eehoeskrap.tistory.com
https://junstar92.tistory.com/102
Regularization 적용에 따른 학습 비교
(tensorflow v2.3.0 - Colab) 이번에는 Courser Deep Learning 특화과정 2번째 강의 1주차 실습 중에 하나인 Regularization에 대해서 텐서플로우로 다시 살펴보도록 하겠습니다. 2020/09/26 - [Coursera 강의/Deep Learning] -
junstar92.tistory.com
https://www.kaggle.com/general/226433
How to implement ℓ1 and ℓ2 Regularization in TensorFlow. | Data Science and Machine Learning
How to implement ℓ1 and ℓ2 Regularization in TensorFlow..
www.kaggle.com
[python] 파이썬에서 ndarray에서 특정 항목의 발생을 계산하는 방법은 무엇입니까? - 리뷰나라
파이썬에서는 다음 y 과 같이 인쇄 된 ndarray 가 있습니다.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) 이 배열에 0몇 1개와 몇 개가 있는지 계산하려고합니다 . 그러나 나는 입력 할 때 y.count(0)또는 y.count(1)그
daplus.net
https://github.com/keras-team/keras/blob/master/keras/callbacks.py
GitHub - keras-team/keras: Deep Learning for humans
Deep Learning for humans. Contribute to keras-team/keras development by creating an account on GitHub.
github.com
https://chealin93.tistory.com/69
CNN으로 개와 고양이 분류하기
1. Data Set Kaggle의 개와 고양이 컬러 이미지를 아래 경로로 다운로드 받는다. https://www.kaggle.com/tongpython/cat-and-dog 2. Data Argumentation 데이터 학습량을 늘려서 데이터가 변조되었을 때 모델이 이를 잘
chealin93.tistory.com
How to fix 'Object arrays cannot be loaded when allow_pickle=False' for imdb.load_data() function?
I'm trying to implement the binary classification example using the IMDb dataset in Google Colab. I have implemented this model before. But when I tried to do it again after a few days, it returned a
stackoverflow.com
https://stackoverflow.com/questions/39382412/crop-center-portion-of-a-numpy-image
crop center portion of a numpy image
Let's say I have a numpy image of some width x and height y. I have to crop the center portion of the image to width cropx and height cropy. Let's assume that cropx and cropy are positive non zero
stackoverflow.com
https://www.kaggle.com/code/ichigoku/image-augmentation-using-numpy
Image Augmentation using Numpy
Explore and run machine learning code with Kaggle Notebooks | Using data from [Private Datasource]
www.kaggle.com
https://yunwoong.tistory.com/125
[ OpenCV ] Basic 4 - 이미지 회전 (Rotate)
Image Rotate 이미지를 특정 각도로 회전하는 방법에 대해 알아보겠습니다. 이미지를 회전할 때에는 회전할 지점을 지정해야 합니다. 대부분의 경우는 이미지의 중심을 기준으로 회전을 하지만 임
yunwoong.tistory.com
https://jybaek.tistory.com/781
[python] 사용자 데이터셋 셔플
이미 잘 구현되어 있는 소스코드와 데이터를 사용한 머신러닝의 경우에는 모델 내에 shuffle 자체가 구축되어 있는 반면에 데이터 수집과 정제, 모델 구축까지 밑바닥에서부터 쌓아 올리다보면
jybaek.tistory.com
'AI Projects > Project Description' 카테고리의 다른 글
SRL-AE: ECG 데이터 이상치 탐지에 강인한 오토인코더 알고리즘 (1) | 2024.12.22 |
---|---|
U-Net 기반 아키텍처를 활용한 울혈성 심부전 환자 폐부종 진단 방법론 연구 (3) | 2024.04.07 |
머신 러닝을 활용한 당뇨병 환자의 관상 동맥 질환 모델 개발 (0) | 2023.11.05 |
Cat & Dog Binary Classification Project Version 2.1 (FINAL) (0) | 2023.01.23 |
Cat & Dog Binary Classification Project (0) | 2022.12.12 |