1003 실습과 1004 실습 소개
1003 => 전이학습(trasfer learning) => 기존 유명한 논문의 CNN 모델이 이미 TF, keras, PyTorch 등에 구현이 되어있습니다. 그래서 해당 모델을 직접 구현하지 않고 가져다 쓸 수 있는게 전이학습입니다. 여기에서 미세조정 등을 해주게 되면 직접 모델을 구현했을 때에 비해 거인의 어깨 위에 올라가서 사용하기 때문에 조금 더 나은 성능을 내기도 합니다.
1004 => 날씨이미지 분류(TF, keras 의 이미지 전처리 기능을 사용하지 않고 넘파이로 직접 이미지 array를 만들어 봅니다. 다차원 배열을 만들어 CNN에 적용하는 실습이 목적입니다.)
CNN 복습
Q. 스트라이드(몇 칸씩 이동하는지)를 크게 설정하면?
A. 용량은 줄어들고 학습 속도는 빠르지만 자세히 학습하지 못하기 때문에 언더피팅이 될 수 있다.
Q. 이미지 증강을 할 때 주의해야 할 사항이 있다면?
1) 크롭이나 확대 => 노이즈를 확대하거나 크롭하면 더 문제가 될 수 있겠죠!
2) 회전, 반전 => 6을 180도 돌리면 완전히 다른 의미인 9가 되기 때문에 이런 숫자 이미지는 돌리지 않습니다.
3) 색상 변경 => 만약 장미꽃이라면 다양한 색상이 있기 때문에 색상을 변경해도 상관이 없지만, 신호등이라면 안전과 직결되기 때문에 변경하면 안 됩니다.
3) 데이터셋 => 증강할 때 train 에만 해줍니다. test에는 해주지 않습니다. 왜냐하면 현실세계 문제를 푼다고 가정했을 때 현실세계 이미지가 들어왔을 때 증강해주지는 않고 들어온 이미지로 판단하기 때문에 train에만 사용합니다.
4) 결론 => 증강을 할 때는 현실세계 문제와 연관해서 고민해 봐야 합니다.
Q. CNN 모델을 학습시키는데 내 컴퓨터로 돌렸더니 메모리 오류가 났어요!
일단 성능(정확도가 낮게 나와도 오류 없이 돌리고 싶을 때)과 관계 없이 돌리고 싶어요! 어떻게 해결하면 좋을까요? 돈을 쓰지 않고 해결하는 방법에 대해 얘기해 보겠습니다!
이미지 사이즈를 줄인다.
레이어를 줄인다. 필터수를 줄인다.
배치(한번에 다 불러오지 않고 나눠서 불러오게) 사이즈를 줄인다.
ILSVRC 우승 알고리즘
2010 - NEC-UIUC (Lin et al.)
2011 - XRCE (Florent Perronnin, Jorge Sanchez)
2012 - AlexNet
2013 - ZFNet
2014 - GoogLeNet
(준우승 VGGNet: 구조의 간결함과 사용의 편이성으로 인해 GoogLeNet보다 더 각광)
2015 - ResNet
2016 - GoogLeNet-v4
2017 - SENet

1003 파일 실습 : 전이학습
VGG16
TF Keras 예제 코드
- 이미지넷 데이터셋 기준 => 1000 개의 분류를 하는 예제
- classes=1000 예측할 이미지의 종류가 1000개다.
- classifier_activation='softmax' 출력층의 output
- 1000 개 종류의 확률값을 반환
- 이미지넷의 가중치만 사용할 것이지 그대로 분류할게 아니기 때문에 해당 옵션이 필요 없습니다.
- 미리 구현된 pre-trained model 을 사용해서 혈액도말이미지로 말라리아 감염여부를 예측할 것이기 때문에 클래스 수도 다르고, 출력층 activation 도 따로 구현해 줄 것이기 때문에 include_top=False 로 나머지도 별도의 레이어로 구성해 주었습니다.
# 예제코드 tf.keras.applications.vgg16.VGG16( include_top=True, weights='imagenet', input_tensor=None, input_shape=None, pooling=None, classes=1000, classifier_activation='softmax' )
1004 파일 실습
이미지 데이터셋 만들기
이미지 크기 조절 함수
def img_read_resize(img_path):
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (120, 120))
return img
전체 이미지 파일을 읽어서 list 에 담아주는 함수
1) 특정 날씨 폴더의 전체 이미지를 읽어옵니다.
2) 반복문을 통해서 이미지를 하나씩 순회하며 img_read 로 배열 형태로 변경된 이미지를 읽어옵니다.
3) img_files 리스트에 읽어온 이미지를 append 로 하나씩 추가합니다.
4) 반복문 순회가 끝나면 img_files 리스트를 반환합니다.
def img_folder_read(img_label):
"""
목적 : 폴더별 이미지 읽어오는 함수
특정 폴더에 있는 이미지를
array 형태로 읽어와서 리스트에 담아주는 함수
형식에 맞지 않는 이미지는 제외하고 가져오도록 try, except 를 사용
"""
img_files = []
labels = []
wfiles = glob.glob(f"{root_dir}/{img_label}/*")
wfiles = sorted(wfiles)
for w_img in wfiles:
try:
img_files.append(img_read_resize(w_img))
labels.append(img_label)
except:
continue
return img_files, labels
img_label = "shine"
img_files, labels = img_folder_read(img_label)
len(img_files), len(labels), img_files[0].shape, labels[0]
RGB와 정규화
Q. 왜 정규화를 할 때 255로 나눠주나요?
A. 현대의 대부분 모니터의 최대 지원 색 심도는 24비트입니다. (물론 더 많이 지원하는 모니터 들도 많이 나왔습니다)
즉 각 픽셀은 2^24(~16.7M)의 색상을 표시할 수 있게 되어있고 24비트 값을 각각 R G B 세개의 색상으로 나누자면 24비트 / 3이므로 각 채널의 폭은 8비트를 가지게 되게 되었습니다. 채널당 8비트라는것을 고려할때 0 ~ 255 (256개)의 숫자 값만 인코딩 할 수 있게 되는 것이 이치에 맞습니다.
참고로 픽셀은 이렇게 이루어져 있고, 0 ~ 255라는 값은 각 색상을 나타내게 되는 서브 픽셀의 밝기라고 생각해주시면 됩니다.

'멋쟁이사자처럼 AIS7 > 오늘코드' 카테고리의 다른 글
[1214] KoNLPy와 RNN(1) (1) | 2022.12.14 |
---|---|
[1212] CNN 마무리와 NLP 입문 (0) | 2022.12.12 |
[1206]합성곱 신경망 (Convolutional Neural Network, CNN) 실습 (1) | 2022.12.06 |
[1205] 합성곱 신경망 (Convolutional Neural Network, CNN) (0) | 2022.12.05 |
[1130] DNN (0) | 2022.11.30 |
댓글