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 예제
구현할 신경망
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가 필요없다.
히스토그램(histogram) : 표로 되어 있는 도수 분포를 정보 그림으로 나타낸 것
콜백함수(callback) : 내가 함수를 호출하는 것이 아니라 다른 함수에서 호출하는 것
https://m.blog.naver.com/lai4/221775340153
'Etc > Deep Learning' 카테고리의 다른 글
6장 합성곱 신경망Ⅱ(3) - 이미지 분류를 위한 신경망(VGGNet, GoogLeNet, ResNet) (0) | 2021.08.11 |
---|---|
6장 합성곱 신경망Ⅱ(2) - 이미지 분류를 위한 신경망(AlexNet) (0) | 2021.08.10 |
5장 합성곱 신경망Ⅰ(4) - 그래프 합성곱 네트워크 (0) | 2021.08.09 |
5장 합성곱 신경망Ⅰ(+) - 이미지를 255로 나누는 이유(ELLIPSIS 객체, np.newaxis, 다차원 배열 슬라이싱, 255) (0) | 2021.08.08 |
5장 합성곱 신경망Ⅰ(3) 실습 - 특성맵 시각화 (0) | 2021.08.08 |