6장 합성곱 신경망Ⅱ(1) - 이미지 분류를 위한 신경망(LeNet-5) + 실습...

6장 합성곱 신경망Ⅱ(1) - 이미지 분류를 위한 신경망(LeNet-5) + 실습...

6.1 이미지 분류를 위한 신경망

입력 데이터로 '이미지'를 사용한 분류 : 특정 대상이 영상 내에 존재하는지 판단

- 이미지 분류에서 주로 사용되는 합성곱 신경망 유형

: LeNet-5, AlexNet, VGGNet, GoogLeNet, ResNet

6.1.1 LeNet-5

합성곱과 풀링(다운 샘플링)을 반복적으로 거치며 마지막 완전연결층에서 분류 수행

C1 : 5×5 합성곱 연산 → 28×28 크기의 특성맵 6개 생성

S2 : 다운샘플링 → 특성 맵 크기를 14×14로 줄임

C3 : 5×5 합성곱 연산 → 10×10 크기의 특성맵 16개 생성

S4: 다운 샘플링 → 특성 맵 크기를 5×5로 줄임

C5 : 5×5 합성곱 연산 → 1×1 크기의 특성맵 120개 생성

F6 : 완전연결층. C5의 결과를 unit(또는 노드)에 연결시킴

LeNet-5 예제

구현할 신경망

LeNet-5 예제 신경망

1. LeNet-5 클래스 생성

num_classes = 2

class LeNet (Sequential):

def __init__ (self, input_shape, nb_classes):

super ().__init__()

self.add(Conv2D(6, kernel_size=(5,5), strides=(1,1), activation='relu', input_shape=input_shape, padding = "same" )) //필터개수, 커널 크기, 필터 적용 간격, 활성화 함수, 입력 이미지 형태, 패딩 -- ⓐ

self.add(AveragePooling2D(pool_size=(2,2), strides =(2,2), padding= 'valid' )) //연산범위, 필터 이동 크기 - ⓑ

self.add(Conv2D(16, kernel_size=(5,5), strides=(1,1), activation='relu', padding='valid'))

self.add(AveragePooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

self.add(Flatten())

self.add(Dense(120, activation='relu'))

self.add(Dense(84, activation='relu'))

self.add(Dense( nb_classes , activation='softmax')) //완전연결층의 출력을 2개로 설정(고양이, 개)

self.compile(optimizer='adam',

loss=categorical_crossentropy,

metrics=['accuracy'])

ⓐ padding : 출력 이미지를 입력 이미지 크기와 동일하게 유지할지 결정

same : 출력 이미지 크기와 입력 이미지 크기가 동일

: valid : 비활성화(동일X)

ⓑ strides : 필터가 계산 과정에서 한 스텝마다 이동하는 크기(설정X : pool_size와 동일하게 설정됨)

2. LeNet 클래스를 이용하여 LeNet-5 모델 생성

model = LeNet(( 100 , 100 , 3 ), num_classes)

model.summary()

3. 파라미터 초기화 및 데이터 호출, ImageDataGenerator를 이용해 전처리하여 이미지 데이터 증가

4. 파라미터 훈련시키기

log_dir = "../Desktop/딥러닝 텐서플로/chap6/img/log6-1/"

tensorboard_callback = tf.keras.callbacks.TensorBoard( log_dir =log_dir, histogram_freq =1, profile_batch =0) --①

model.fit(train_generator,

epochs=EPOCHS,

steps_per_epoch =train_num // BATCH_SIZE,

validation_data=valid_generator,

validation_steps =valid_num // BATCH_SIZE,

callbacks =[ tensorboard_callback ],

verbose=1) --- ②

① callback

케라스에서 제공하는 callback은 에포크의 시작, 끝처럼 이벤트가 발생할 때 호출됨

사용 목적 : 정확도가 특정 임계치를 초과할 때 저장, 이메일을 보내거나 학습을 종료할 때 알림 보내기

[텐서보드(callback.TensorBoard)를 활용하기 위한 파라미터]

ⓐ log_dir : 로그 파일이 기록될 위치

ⓑ histogram_freq : 매 에포크마다 출력을 히스토그램으로 기록(기본값 : 0(히스토그램 기록안됨))

ⓒ profile_batch : 훈련이 진행되는 시간 · 시스템 자원(CPU, 메모리 등)에 대한 사용을 관리

(비활성화 : profile_batch=0)

② fit() 메서드 파라미터

ⓐ steps_per_epoch : 한 에포크에서 사용한 스텝 개수(= 한 번 에포크를 돌 때 데이터를 몇 번 볼건지 정함)

//스텝 : 모델이 가진 가중치(파라미터)를 1회 업데이트하는 것

+ // 연산자 : 나누기 연산 후 소수점 이하의 수를 버리고, 정수 부분의 수만 구함

ⓑ validation_steps: 한 에포크가 종료될 때 사용되는, 검증 스텝 개수를 지정

ⓒ callbacks : 텐서보드라는 콜백함수를 생성해, fit() 메서드의 파라미터로 넣음

4.5 웹 브라우저에서 텐서보드 확인하기

아나콘다 프롬프트

tensorboard --logdir=../chap6/img/log6-1/ //logdir 위치는 4단계의 log_dir위치와 동일해야함

>> TensorBoard 2.3.0 at http://localhost:6006/ (Press CTRL+C to quit)

모델의 정확도(train: 주황색, valid : 파란색)

검증 데이터에 대한 정확도가 매우 낮음

모델의 오차(train: 주황색, valid : 파란색)

검증데이터의 오차는 시간이 흐를 수록 증가

5. 이미지 데이터셋 분류에 대한 예측

→ 텐서보드로 확인했던 것처럼 예측력이 좋지못함

def _init_ : 초기화 메서드 - 어떤 클래스의 객체가 만들어질 때 자동으로 호출되어서 그 객체가 갖게 될 여러 가지 성질을 정해줌 https://wikidocs.net/89

super() : 자식클래스에서 부모클래스의 내용을 사용하고 싶은 경우

- super().부모클래스내용 https://programmers.co.kr/learn/courses/2/lessons/330

self : 파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. 객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self를 사용한 것이다. 물론 self말고 다른 이름을 사용해도 상관없다.

※ 메서드의 첫 번째 매개변수 self를 명시적으로 구현하는 것은 파이썬만의 독특한 특징이다. 예를 들어 자바 같은 언어는 첫 번째 매개변수 self가 필요없다.

https://wikidocs.net/89

히스토그램(histogram) : 표로 되어 있는 도수 분포를 정보 그림으로 나타낸 것

콜백함수(callback) : 내가 함수를 호출하는 것이 아니라 다른 함수에서 호출하는 것

https://m.blog.naver.com/lai4/221775340153

from http://markme-inur.tistory.com/39 by ccl(A) rewrite - 2021-08-09 16:00:39