본문 바로가기

DL 학습일지

ham 10000 학습일지

일단 지금 vgg-16, alexnet 학습을 성능은 뒤로 하고 성공을 했고 cam도 chat GPT로 어찌저찌 했음

 

이제 지금 해야하는 것

1) 정확한 학습 코드 이해

2) 성능 향상 비교 일지 구체적으로 남기기 //성능 향상 시켜야함

3) cam 코드 이해하기

4) Confusion matrix 적용하기

 

 

-CNN 학습 과정 정확히 이해-

2023.08.20 - [학부연구생/딥러닝 _CNN] - CNN 학습 과정 및 개념 총 정리

 

CNN 학습 과정 및 개념 총 정리

개요 : 머신러닝 기존 컴퓨터 학습과 다르게 머신러닝은 input과 output으로 중간 과정의 함수를 찾아낸다 데이터 기반 통계적 신뢰도 강화, 예측 오류 최소화를 위한 다양한 수학적 기법을 적용하

dayofday.tistory.com

 

 

-성능 비교 일지-

2) 성능 향상 일지 //일단 기본적으로 global average pooling은 적용해둠

classification의 overfitting을 줄일 수 있음

 

1. dense layer 늘리기

1개 => 3개

dense를 층을 늘리는 대신 256 => 128로 적용해서 그런가 아님 과적합이 발생해서 그런건가 성능이 더 안좋아졌네,, 반토막 남 


=> 그래서 GAP 적용 후 Dropout(0.5)(x) 적용해봄 대기 중,,,

오호,,, 학습 데이터 정확도는 조금 줄었는데 test 데이터 정확도는 2배 덜 되게 늘었네,,?

파라미터가 너무 많은 과적합이었을까,, //이거는 좀 물어보고 싶음요 왜 성능이 좋아진 건지,, 원인이 dropout 인건지랄까

 

결론 : 과적합 맞았음


=> 전에 강의 들을 때 가중치 초기화도 batch normalization 적용하면 해줄 필요 없다 성능이 많이 향상된다고 들었음

그래서 BN 적용해보려고함 = 근데 BN 적용하려면 pretrained된 기존 VGG16모델을 사용 못함

일단 그래서 강의에서 들은 거랑 gpt 가 알려준 거랑 합쳐서 코드 짰고 적용해봄 //이 과정에서 캐글 GPU도 부족하다고 해서 몇개 좀 줄이고 적용함

-batch size 1/2씩 적용

-block은 강의에 vgg 모델 만든 거 그대로 사용하면서 BN만 추가 적용함

그래서 이거 성능 잘 나오면 vgg 모델 강의랑 pretrained 모델 강의 다시 들어야함

//일단 대기중 ,, 역시 돌리는 데 시간은 오래 걸리네

 

음 아직 돌아가는 중이긴 한데 이거도 성능이 그렇게 좋을 거 같진 않음 

input_layer = Input(shape=(224, 224, 3))

# 첫 번째 Conv 블록
x = Conv2D(64, (3, 3), padding='same', activation='relu')(input_layer)
x = BatchNormalization()(x)
x = Conv2D(64, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

# 여기서 추가 Conv 블록을 계속 구성하고 마지막에 Fully Connected 레이어를 추가합니다.
x = Conv2D(128, (3, 3), padding='same', activation='relu')(input_layer)
x = BatchNormalization()(x)
x = Conv2D(128, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

x = Conv2D(256, (3, 3), padding='same', activation='relu')(input_layer)
x = BatchNormalization()(x)
x = Conv2D(256, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

x = Conv2D(512, (3, 3), padding='same', activation='relu')(input_layer)
x = BatchNormalization()(x)
x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

x = Conv2D(512, (3, 3), padding='same', activation='relu')(input_layer)
x = BatchNormalization()(x)
x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

# 출력 레이어
x = GlobalAveragePooling2D()(x)
x = Dropout(0.5)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.5)(x)
output = Dense(7, activation='softmax')(x)

# 모델 생성
model= Model(inputs=input_layer, outputs=output)
model.summary()
# 컴파일
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

결과가 이해가 안되는데,,, loss 함수도 엄청 줄었는데,, 정확도도 같이 겁내 줄어들었음;;; 

원래 정확도는 올라가면서 수정되지않나?

미쳤네,, 얘는 0.99에서 시작해서 하주 그냥 loss 함수랑 같이 쭉쭉 줄어드네 ㅋ

왜 이래.. 습 test도 다시 돌리면 성능 더 좋아지나? 아닐 거 같은데,,,

다시 test만 돌려보자

ㅋ 이유 왜 그런지 찾음

모델 층을 입력 층 복붙해서 학습이 각 층마다 계속 input_layer로만 되고 있잖아;;;

고쳐서 다시 돌리는 중 40분 또 기다려야함.. 기다렸다 오겠음

x 제대로 넣으니까 학습 시간 빨랐음 흐히ㅡ

test 성능은 여전히 그렇게 좋진 않지만,, 정확도는 그나마 pretrained vgg 모델이랑 동일해졌다,,,


=>음 학습률 조정하는 옵션을 넣어보자,,,

자동 조절 옵션 넣기 전에 학습률을 디폴티 0.001에서 0.0001로 바꾸고 한 번 더 돌려보는 중//일단 얘가 지금 best,,,

 두세개만 더 조절해보고 교수님 코드 공부해서 월욜에 가자

성능이 괜찮아지긴 했는데 이제야 pretrained랑 비등비등한데?ㅋㅋㅋ

흠,,, 그래서 다시 pretrained에 학습률을 0.0001로 적용해봄

성능 더 안좋아짐,,ㅋ 

음 교수님 코드 살펴보고나서 기본 모델 코드로 다시 한 번 더 돌려봐야겠다 


교수님이랑 나랑 크게 다른게 그 input_size이기에 이거 조절해서 다시 해봐야겠다 

(224,224,3) => (32,32,3)으로 하면서 이제 callback함수도 추가했음

+더불어서 무엇보다 큰 문제가 train,test,valid 중에 train+valid랑 test 데이터셋 비율이 반반이엇음

애초에 학습할것이 너무 적었던 거 같음

이 전에 다른 파일로 할때인지 그땐 images_part1파일이랑 images_part2파일이 딱 7:3정도라고 생각해서 그대로 train,test로 넣었는데 아니였네,,,, 제바라라라라랄 이게 문제였길.,,,

이 정도 문제점들을 발견했으면 이제는 성능이 좋아질만 한거 같은데 젭알,,,

 

여기까지 해서 일단 confusion metrix 적용해보았음

 

그 결과 데이터가 많은 label 같은 경우에는 학습이 잘 된 것을 확인할 수 있었음



교수님 면담하면서 보니 확실히 데이터가 적은 부분은 잘 학습이 안된 것을 알 수 있었음

이 부분은 imbalance classification  이쪽을 더 공부해서 데이터를 편향적으로 가중치를 적용하는 방향으로 학습을 진행해보아야할 듯

 

앞으로 imbalance 데이터 다루는 방법을 좀 더 배우자

 

+ 앞으로는 교수님 입에서 나한테 바로 들어오는 정보들은 다 정리해서 확실하게 알아두어야겠다.

 대충 넘어간 부분들 나중에 다 물어보시네,,,

+영어 공부도 빨리 시작해야겠음


base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224,224,3)) # load VGG16 model, exclude top layers, adjust input shape
 
for layer in base_model.layers:
    layer.trainable = False

x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dropout(0.5)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.5)(x)
output = Dense(7, activation='softmax')(x) # final layer with softmax activation for 7 classes

model = Model(inputs=base_model.input, outputs=output) #define the model
model.summary()
optimizer=Adam(lr=0.0001)
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, BatchNormalization
from tensorflow.keras.models import Model

'''input_layer = Input(shape=(224, 224, 3))

# 첫 번째 Conv 블록
x = Conv2D(64, (3, 3), padding='same', activation='relu')(input_layer)
x = BatchNormalization()(x)
x = Conv2D(64, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

# 여기서 추가 Conv 블록을 계속 구성하고 마지막에 Fully Connected 레이어를 추가합니다.
x = Conv2D(128, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = Conv2D(128, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

x = Conv2D(256, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = Conv2D(256, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

# 출력 레이어
x = GlobalAveragePooling2D()(x)
x = Dropout(0.5)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.5)(x)
output = Dense(7, activation='softmax')(x)

# 모델 생성
model= Model(inputs=input_layer, outputs=output)
model.summary()
# 컴파일
optimizer=Adam(lr=0.0001)
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])'''

보면 학습이 안되는 부분들은 아예 안되고 있는 것 같음

이게 데이터가 label 4는 풍족한 부분이고 나머지는 lmbalance임

이 부분 처리하는 방법을 배워야함

다음에 정리해보겠음

'DL 학습일지' 카테고리의 다른 글

Overfitting 학습일지  (0) 2023.09.11
Imbalanced Problem  (1) 2023.09.06