Chapter 08 이미지를 위한 인공 신경망 ▶ 패션 럭키백의 정확도를 높입니다!
08-1 합성곱 신경망의 구성 요소 ▶ 합성곱 신경망의 개념과 동작 원리를 배우고 간단한 실습하기
학습 목표
- 합섭공 신경망을 구성하는 기본 개념과 동작 원리를 배우고 간단한 합성곱, 풀링 계산 방법을 익힙니다.
합성곱
- 마치 입력 데이터에 마법의 도장을 찍어서 유용한 특성만 드러나게 하는 것
- 밀집층: 뉴런마다 입력 개수 만큼의 가중치 有
- 인공 신경망
- 모델 훈련:
- 처음에 가중치와 절편을 랜덤하게 초기화
- (에포크를 반복하면서 경사 하강법 알고리즘을 사용하여) 손실이 낮아지도록 최적의 가중치와 절편을 찾아감
- 모델 훈련:
- 합성곱:
- 입력 데이터 전체에 가중치 적용(밀집층)
- 밀집층의 뉴런은 입력 개수 만큼 10개의 가중치를 가지고 1개의 출력
- 입력 데이터 일부에 가중치 적용(합성곱)
- 한 칸씩 아래로 이동하면서 출력을 만듦.
- ex. 뉴런 10개, 가중치가 3개 → 출력 8개
- 합성곱 층의 뉴런은 3개의 가중치를 가지고 8개의 출력
- 한 칸씩 아래로 이동하면서 출력을 만듦.
- 입력 데이터 전체에 가중치 적용(밀집층)
- 합성곱 신경망(convolutional neural network, CNN)
- 완전 신경망과 달리
- 뉴런 = 필터 = 커널
- 커널: 입력에 곱하는 가중치
- 필터: 뉴런 개수를 표현
- 특성 맵(feature map): 합성곱 계산을 통해 얻은 출력
- 완전 신경망과 달리
- 밀집층에 있는 뉴런의 가중치가 모두 다르듯
- 합성곱 층에 있는 필터의 가중치(커널)도 모두 다름
- 밀집층과 합성곱 층의 차이점
- 2차원 형태 유지하는 점
- 입력보다 훨씬 작은 크기의 커널을 사용하고 입력 위를 (왼쪽에서 오른쪽으로, 위에서 아래로) 이동하면서 2차원 특성 맵 만듦.
- 2차원 구조 그대로 사용
- → 이미지 처리 분야에서 뛰어난 성능 발휘
케라스 합성곱 층
- 특성 맵: 활성화 함수를 적용한 후, 통과한 값이다.
- 커널의 크기: 하이퍼파라미터
- keras.layers
- Conv2D 클래스
- 첫 번째 매개변수: 필터(즉 도장!)의 개수 필수
- kernel_size 매개변수: 필터에 사용할 커널의 크기 지정 필수
- activation 매개변수: 활성화 함수 지정
- Conv2D 클래스
패딩과 스트라이드
- 패딩: 입력 배열의 주위를 가상의 원소로 채우는 것
- 실제 입력값이 아니므로 0
- 사용 목적: 모든 원소들이 균일하게 커널과 계산되도록 하기 위해
- padding 매개변수로 설정
- same: 세임 패딩
- valid: 밸리드 패딩
- 세임 패딩(same padding)
- 입력과 특성 맵의 크기를 동일하게 만들기 위해
- 입력 주위에 0으로 패딩하는 것
- 밸리드 패딩(valid padding)
- 패딩없이 순수한 입력 배열에서만 합성곱을 하여 특성 맵을 만드는 경우
- 스트라이드(stride)
- 합성곱 연산의 이동 크기
- default: 1
- strides 매개변수로 지정
- (1,1) 과 같이 튜플로 오른쪽, 아래쪽 이동 크기를 따로 줄 수 있으나, 보통은 정수로 동일하게 지정
- 대부분 기본값을 사용함.
- 합성곱 연산의 이동 크기
폴링(pooling)
- 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄이는 역할
- 하지만, 특성 맵의 개수(차원의 개수)는 줄이지 않음.
- like
- 특성 맵에 커널 없는 필터를 적용하는 것과 비슷
- 최대 풀링(max pooling): 도장을 찍은 영역에서 가장 큰 값을 고름
- keras.layers.MaxPooling2D(2)
- 첫 번째 매개변수: 풀링의 크기 지정
- ex. 풀링의 크기 2: 가로세로 크기를 절반으로 줄임.
- 첫 번째 매개변수: 풀링의 크기 지정
- keras.layers.MaxPooling2D(2)
- 평균 풀링(average pooling): 도장을 찍은 영역에서 평균값을 계산함
- keras.layers.AveragePooling2D
- 풀링에서는 겹치지 않게 이동함.
합성곱 신경망의 전체 구조
- 입력 → ① 합성곱 층 → ② 폴링층 → ③ 밀집층
컬러 이미지를 사용한 합성곱
- 컬러 이미지는 RGB(빨강, 초록, 파랑) 채널로 구성되어 있어 3차원 배열로 표시
- 필터의 차원이 몇 개인지 상관없이 항상 출력은 1개
- 필터의 너비, 높이: 3
- 필터의 커널 크기: (3, 3, 5)
- 입력의 깊이와 필터의 깊이는 같아야 함.
- 필터 개수: 10
- 특성 맵의 크기: (2, 2, 10)
- 즉, 합성곱 신경망은 너비와 높이는 점점 줄어들고 깊이는 점점 깊어진다.
- 그리고 마지막에 출력층 전에 특성 맵을 모두 펼쳐서 밀집층의 입력으로 사용한다.
- 합성곱 신경망의 필터
- 이미지에 있는 어떤 특징을 찾는 것
키워드로 끝내는 핵심 포인트
- 합성곱
- 밀집층과 비슷하게 입력과 가중치를 곱하고 절편을 더하는 선형 계산
- 입력 일부만 사용하여 선형 계산 수행
- 합성곱 층의 필터
- 밀집층의 뉴런과 같음.
- 필터의 가중치와 절편 = 커널
- 커널의 깊이 = 입력의 깊이
- 특성 맵(feature map)
- 합성곱 층 or 풀링 층의 출력 배열
- 필터 하나가 하나의 특성 맵을 만듦.
- 패딩(padding)
- 고르게 연산이 되도록 추가하는 배열
- same padding: 0으로 채워진 패딩
- 합성곱 층의 출력 크기를 입력과 동일하게 만들기 위해 입력에 패딩 추가
- valid padding: 패딩을 사용하지 않는 것
- 스트라이드
- 필터가 입력 위를 이동하는 크기
- 풀링
- 가중치가 없고 특성 맵의 가로세로 크기를 줄이는 역할
- 최대 풀링
- 평균 풀링
확인 문제
- 어떤 합성곱 층이 컬러 이미지에 대해 5개의 필터를 사용해 세임 패딩으로 합성곱을 수행합니다. 그다음 (2, 2) 풀링 층을 통과한 특성 맵의 크기가 (4, 4, 5) 입니다. 이 경우 합성곱 층에 주입된 입력의 크기는 얼마일까요?
- 정답: 4번 / (8, 8, 5)
- 다음과 같은 입력에서 (3, 3) 커널과 밸리드 패딩으로 합성곱을 수행합니다. 필터의 개수는 1개이고 입력의 깊이(채널도) 1개입니다. 절편은 0이라고 가정합니다. 이 합성곱의 결과를 계산해 보세요.
01
3. 다음과 같은 (4, 4, 2) 크기의 특성 맵이 있습니다. (2, 2) 최대 풀링의 결과를 계산해 보세요.
08-2 합성곱 신경망을 사용한 이미지 분류 ▶ 케라스 API로 합성곱 신경망 모델 만들기
학습 목표
- 케라스 API를 사용해 합성곱 신경망 모델을 만들어 패션 MNIST 이미지를 분류하는 방법을 배웁니다.
패션 MNIST 데이터 불러오기
합성곱 신경망 만들기
0123
모델 컴파일과 훈련
01234
핵심 패키지와 함수
- TensorFlow
- Conv2D: 입력의 너비와 높이 방향의 합성곱 연산을 구현한 클래스
- kernel_size 매개변수: 필터의 커널 크기 지정
- 가로세로 크기가 같은 경우 정수 하나로, 다른 경우 정수의 튜플로 지정
- strides 매개변수: 필터의 이동 간격을 지정
- 가로세로 크기가 같은 경우 정수 하나로, 다른 경우 정수의 튜플로 지정
- default: 1
- padding 매개변수: 입력의 패딩 타입 지정
- default: valid
- same: 세임 패딩
- default: valid
- activation 매개변수: 합성곱 층에 적용할 활성화 함수 지정
- kernel_size 매개변수: 필터의 커널 크기 지정
- MaxPooling2D: 입력의 너비와 높이를 줄이는 폴링 연산 구현
- 첫 번째 매개변수: 폴링의 크기 지정
- 가로세로 크기가 같은 경우 정수 하나로, 다른 경우 정수의 튜플로 지정
- strides 매개변수: 필터의 이동 간격을 지정
- default: 폴링의 크기 동일
- padding 매개변수: 입력의 패딩 타입 지정
- default: valid
- same: 세임 패딩
- default: valid
- 첫 번째 매개변수: 폴링의 크기 지정
- plot_model(): 케라스 모델 구조를 주피터 노트북에 그리거나 파일로 저장
- 첫 번째 매개변수: 케라스 모델 객체 전달
- to_file 매개변수: 파일 이름을 지정하면 그림을 파일로 저장
- show_shapes 매개변수
- default: False
- True: 층의, 입력, 출력 크기 표시
- default: False
- show_layers_names 매개변수:
- default: True → 층의 이름 표시
- Conv2D: 입력의 너비와 높이 방향의 합성곱 연산을 구현한 클래스
- matplotlib
- bar(): 막대그래프 출력
- 첫 번째 매개변수: x축의 값을 리스트나 넘파이 배열로 전달
- 두 번째 매개변수: y축의 값을 리스트나 넘파이 배열로 전달
- width 매개변수: 막대의 두게 지정
- default: 0.8
- bar(): 막대그래프 출력
확인 문제
- 합성곱 층의 필터가 입력 위를 이동하는 간격을 조절하는 Conv2D 클래스의 매개변수는 무엇인가요?
- 정답: 2번 / strides
- Conv2D 클래스의 padding 매개변수의 설명이 올바르게 된 것은 무엇인가요?
- 정답: 4번 / ‘same’은 입력과 출력의 가로세로 크기를 동일하게 만들도록 패딩 합니다.
- 다음 중 최대 풀링 층의 풀링 매개변수를 잘못 설정한 것은 무엇인가요?
- 정답: 3번 / MaxPooling(2, 2)
08-3 합성곱 신경망의 시각화 ▶ 신경망이 이미지에서 학습하는 게 무엇인지 이해하기
학습 목표
- 합성곱 층의 가중치와 특성 맵을 시각화하여 신경망이 이미지에서 어떤 것을 학습하는지 이해해 봅시다.
가중치 시각화
- 합성곱 층은 여러 개의 필터를 사용해 이미지에서 특징을 학습함.
- 각 필터는 커널이라 부르는 가중치와 절편을 가지고 있음.
- 일반적으로 절편은 시각적으로 의미가 없음
- 가중치: 입력 이미지의 2차원 영역에 적용되어 어떤 특징을 두드러지게 표현하는 역할
01234
함수형 API
- 입력이 2개, 출력 2개인 경우 등을 해결하는 데 사용
- 2개의 Dense 층 생성
- dense1 = keras.layers.Dense(100, activation=’sigmoid’)
- dense2 = keras.layers.Dense(10, activation=’softmax’)
- 첫 번째 층 함수 호출
- hidden = dense1(inputs)
- 두 번째 층 함수 호출
- outputs = dense2(hidden)
- model 클래스로 연결
- model = keras.Model(inputs, outputs)
- inputlayer 클래스 객체를 만들어 출력 반환
- inputs = keras.Input(shape(784,)
특성 맵 시각화
01234
키워드로 끝내는 핵심 포인트
- 가중치 시각화: 합성곱 층의 가중치를 이미지로 출력하는 것
- 가중치가 시각적인 패턴을 학습하는지 알아볼 수 있음.
- 특성 맵 시각화: 합성곱 층의 활성화 출력을 이미지로 그리는 것
- 가중치 시각화와 함께 비교하여 각 필터가 이미지의 어느 부분을 활성화시키는지 확인 가능.
- 함수형 API: 케라스에서 신경망 모델을 만드는 방법 중 하나
- Model 클래스에 모델의 입력과 출력 지정
- 전형적으로 입력은 Input() 함수를 사용하여 정의하고 출력은 마지막 층의 출력으로 정의
핵심 패키지와 함수
- TensorFlow
- Model: 케라스 모델을 만드는 클래스
- 첫 번째 매개변수: inputs에 모델의 입력 또는 입력의 리스트 지정
- 두 번째 매개변수: outputs에 모델의 출력 또는 출력의 리스트 지정
- name 매개변수: 모델의 이름 지정
- Model: 케라스 모델을 만드는 클래스
확인 문제
- 합성곱 신경망의 첫 번째 합성곱 층에서 다음과 같은 필터가 학습되었습니다. 이 필터를 사용해 가장 높은 값의 특성 맵을 만들 수 있는 입력은 무엇일까요?
- 정답: 2번
- 다음 중 케라스 모델을 만드는 올바른 방법이 아닌 것은 무엇인가요?
- 정답: 4번 / model = Model()(ins, outs)
- 다음 중 Sequential 모델의 입력을 올바르게 참조하지 않는 것은 무엇인가요?
- 정답: 2번 / model.layers[0].output
- 해설
- _layers 첫 번째 항목이 바로 InputLayer 클래스의 객체
- InputLayer 클래스는 신경망의 입력층 역할
- 즉, 모델의 입력을 첫 번째 은닉층에 전달하는 역할 수행
- 따라서 InputLayer 객체의 입력과 출력은 동일
- model._layer[0].input = model._layer[0].output
- 문제에서는 입력의 참조를 묻고 있으므로 출력값에 해당하는 2번이 정답이다.
번외주차 학습 소감
아마도 6주차에서 학습을 끝내는 인원이 많을 것이다. 하지만, 이전에 말한 것처럼 시작을 했으면 끝을 보기 위해 이번 챕터 8에 진입했다. 지난 주에 학습한 딥러닝에 이어 이미지 처리를 위한 합성곱을 학습해보았는데, 딥러닝과 한결 더 친해질 수 있었다. 특히, RGB는 3차원으로 표현이 되며, 고른 연산을 위해 사용되는 패딩과 필터, 스트라이드 등에 개념을 학습하면서 이미지 처리가 어떻게 모델 학습에서 이뤄지는 것인지 이해할 수 있었다. 1장에서는 이론을 주로 학습하면서, 이해하는데 애를 먹었지만, 이후 2장부터 실습을 동반하면서 이론을 내 것으로 만들 수 있었다.
손코딩 학습 결과
반응형
'코딩 | 개념 정리 > Machine Learning & Deep Learning' 카테고리의 다른 글
[혼공머신] 번외주차_텍스트를 위한 인공 신경망 (0) | 2024.02.24 |
---|---|
[혼공머신] 혼공학습단 11기_학습 회고 (0) | 2024.02.18 |
[혼공머신] 6주차_딥러닝을 시작합니다. (0) | 2024.02.11 |
[혼공머신] 5주차_비지도 학습 (0) | 2024.02.03 |
[혼공머신] 4주차_트리 알고리즘 (0) | 2024.01.27 |