Etc/Deep Learning

6장 합성곱 신경망Ⅱ(1) - 이미지 분류를 위한 신경망(LeNet-5) + 실습 : 🔜파이썬 개념 추가 정리하기

z.zzz 2021. 8. 9. 15:51

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