일단 지금 vgg-16, alexnet 학습을 성능은 뒤로 하고 성공을 했고 cam도 chat GPT로 어찌저찌 했음
이제 지금 해야하는 것
1) 정확한 학습 코드 이해
2) 성능 향상 비교 일지 구체적으로 남기기 //성능 향상 시켜야함
3) cam 코드 이해하기
4) Confusion matrix 적용하기
-CNN 학습 과정 정확히 이해-
2023.08.20 - [학부연구생/딥러닝 _CNN] - CNN 학습 과정 및 개념 총 정리
-성능 비교 일지-
2) 성능 향상 일지 //일단 기본적으로 global average pooling은 적용해둠
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 |