이미지 분류(Classification)

박용민·2022년 3월 22일
0

쉬운 딥러닝

목록 보기
5/8
post-thumbnail

AI는 손글씨를 인식할 수 있을까?

신경망 구조

  • 3층 짜리 FNN
  • MNIST 0~9까지의 손글씨 숫자
  • 가로세로 28픽셀의 이미지 크기, 배경값은 0이며 숫자로 기재된 구역의 값은 255
  • 배경값은 0으로, 숫자가 기대된 구역은 1로 노멀라이즈 하여 학습을 진행
층수종류크기활성화 함수
1층Flatten28*28없음
2층FNN256ReLu
3층FNN10Softmax

Flatten 레이어

  • FNN에 입력한 데이터는 2차원 데이터가 아니라 1차원의 데이터이다.
  • 2차원 이미지 데이터를 FNN에 입력할때 2차원을 1차원의 데이터로 만들어주는 과정

딥러닝 모델 코딩

"""
Author : Byunghyun Ban
"""
from tensorflow import keras
import data_reader

# 몇 에포크 만큼 학습을 시킬 것인지 결정합니다.
EPOCHS = 20  # 예제 기본값은 20입니다.

# 데이터를 읽어옵니다.
dr = data_reader.DataReader()

# 인공신경망을 제작합니다.
# Flatten함수의 input_shape를 이지디 데이터 크기로 설정
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

# 인공신경망을 컴파일합니다.
model.compile(optimizer='adam', metrics=['accuracy'],
              loss='sparse_categorical_crossentropy')

# 인공신경망을 학습시킵니다.
print("\n\n************ TRAINING START ************ ")
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
history = model.fit(dr.train_X, dr.train_Y, epochs=EPOCHS,
                    validation_data=(dr.test_X, dr.test_Y),
                    callbacks=[early_stop])

# 학습 결과를 그래프로 출력합니다.
data_reader.draw_graph(history)

사물을 구분할 수 있는가?

신경망 구조

  • 앞의 예제와 동일한 구조
층수종류크기활성화 함수
1층Flatten32*32없음
2층FNN256ReLu
3층FNN10Softmax

딥러닝 모델 코딩

"""
Author : Byunghyun Ban
"""
from tensorflow import keras
import data_reader

# 몇 에포크 만큼 학습을 시킬 것인지 결정합니다.
EPOCHS = 20  # 예제 기본값은 20입니다.

# 데이터를 읽어옵니다.
dr = data_reader.DataReader()

# 인공신경망을 제작합니다.
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(32, 32)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

# 인공신경망을 컴파일합니다.
model.compile(optimizer='adam', metrics=['accuracy'],
              loss='sparse_categorical_crossentropy')

# 인공신경망을 학습시킵니다.
print("\n\n************ TRAINING START ************ ")
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
history = model.fit(dr.train_X, dr.train_Y, epochs=EPOCHS,
                    validation_data=(dr.test_X, dr.test_Y),
                    callbacks=[early_stop])

# 학습 결과를 그래프로 출력합니다.
data_reader.draw_graph(history)

시각적 정보

인간의 뇌가 시각 정보를 처리하는 방법

시각 정보가 흘러가는 경로

  • 안구로부터 흘러온 정보가 아래관자피질까지 전달된다.
  • 시각 피질은 V1,V2,V3,V4,V5,V6등 영역으로 나뉜다.

시각 피질인식형태
v1선,모서리
v2원근감
v4기하학적 도형
IT최종 시각 정보

CNN(Convolutional Neural Networks)

  • '합성곱 신경망'이라고 부른다.
  • CNN의 주된 재료는 필터(filter)이다.
  • 이미지에 필터를 씌워 원본 데이터를 변경하고, 변형된 데이터를 다음 층으로 출력하는 것이 주된 작동원리

CNN의 계산방법

필터의 적용 및 이미지 크기의 감소

제로 패딩

  • 필터를 적용하면서 이미지의 크리글 축소하지 않는 기법
  • 가장자리 숫자에 0을 두르는 기법
  • 원본사이즈와 동일하다.

CNN 사물 구별

  • 원본 이미지는 0부터 255 사이의 숫자로 표현된 데이터를 255.0으로 나누어 0부터 1사이의 숫자로 변환
  • 'BatchNorm'은 드롭아웃처럼 인공지능의 성능 향상을 위해 사용하는 연산이다.
  • 'CNN - 배치 노멀라이즈- 활성화 함수 - 폴링'의 순서로 적용한다.
  • 'MaxPool'은 '폴링 레이어(pooling layer)'라고 부르는 도구이며, 이미지 사이즈를 줄인다.
  • CNN은 필터가 적용된 2차원 이미지를 출력하는데 이를 Flatten 레이어로 1차원 데이터로 변환시켜 FNN으로 입력시킬 수 있다.
층수종류크기활성화 함수
1층CNN32,(3,3)-
-BatchNorm-ReLu
-MaxPool(2,2)-
2층CNN64,(3,3)-
-BatchNorm-ReLu
-MaxPool(2,2)-
3층CNN64,(3,3)-
-BatchNorm-ReLu
-MaxPool(2,2)-
4층Flatten--
5층FNN128ReLu
-DropOutrate=0.5-
6층FNN10SoftMax

배치 노멀라이즈

  • 신경망을 깊게 쌓으면 쌓을수록 '내부 공변량 변화'라는 문제가 발생 즉 학습 과정에서 각 층의 신경망 분포가 다르게 학습되기에, 이전 층의 왜곡이 다음 층에도 영향을 끼친다.
  • 배치 노멀라이즈로 이를 해결하여 성능이 향상된다.

풀링 레이어

  • 이미지의 크기를 감소시키이 위해 사용된다.
  • 에버리지 풀링(average pooling)도 사용된다.

딥러닝 모델 코딩

"""
Author : Byunghyun Ban
"""
from tensorflow import keras
import data_reader

# 몇 에포크 만큼 학습을 시킬 것인지 결정합니다.
EPOCHS = 20  # 예제 기본값은 20입니다.

# 데이터를 읽어옵니다.
dr = data_reader.DataReader()

# 인공신경망을 제작합니다.
model = keras.Sequential([
    keras.layers.Conv2D(32, (3, 3)),
    keras.layers.BatchNormalization(),
    keras.layers.ReLU(),
    keras.layers.MaxPooling2D((2, 2)),
    keras.layers.Conv2D(64, (3, 3)),
    keras.layers.BatchNormalization(),
    keras.layers.ReLU(),
    keras.layers.MaxPooling2D((2, 2)),
    keras.layers.Conv2D(64, (3, 3)),
    keras.layers.BatchNormalization(),
    keras.layers.ReLU(),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(rate=0.5),
    keras.layers.Dense(10, activation='softmax')
])

# 인공신경망을 컴파일합니다.
model.compile(optimizer='adam', metrics=['accuracy'],
              loss='sparse_categorical_crossentropy')

# 인공신경망을 학습시킵니다.
print("\n\n************ TRAINING START ************ ")
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
history = model.fit(dr.train_X, dr.train_Y, epochs=EPOCHS,
                    validation_data=(dr.test_X, dr.test_Y),
                    callbacks=[early_stop])

# 학습 결과를 그래프로 출력합니다.
data_reader.draw_graph(history)

0개의 댓글

관련 채용 정보