(광주인공지능학원) CNN 딥러닝 기초다지기
MLP 이미지 분석
MLP은 층이 깊어지고 뉴런의 수가 많아지면 가중치 수가 급격히 늘어 난다.
MLP 신경망을 이미지 처리에 사용한다면 이미지의 어떤 특정 패턴이 존재하는 위치에 민감하게 동작하며 패턴의 위치에 종속적인 결과를 얻는다.
MLP는 아래 세 개의 5는 패턴이 다르다고 판단한다.
MLP로 이러한 숫자 인식을 하려면 숫자의 크기를 비슷하게 맞추어야 한다. (광주인공지능학원)
CNN (Convolution Neural Network)
광주인공지능학원 이명훈연구원님 설명에 의하면 1998년 Yann Lecun 교수에 의해 1950년 대 수행했던 고양이의 뇌 파 실험에 영감을 얻어 이미지 인식을 획기적으로 개선 할 수 있는 CNN 제안
이미지를 가까운 거리에서 본다면
조금 더 떨어져서 보면
더 떨어져서 보면
CNN (Convolution Neural Network)
광주인공지능학원 이명훈연구원님 설명에 의하면 CNN(합성곱)은 입력된 이미지에서 특징을 추출하기 위해 마스크(필 터)를 도입하는 방법
이미지 전체 영역에 대해 서로 동일한 연관성(중요도)로 처리하는 대 신 특정 범위에 한정해 처리한다면 훨씬 효과적일 것 이 라는 아 이 디어 제시 (광주인공지능학원)
CNN (Convolution Neural Network)
광주인공지능학원 이명훈연구원님 설명에 의하면 합성곱 계층의 입출력 데이터를 특성맵(feature map) 이라고 한다.
특성맵은 평면을 구성하는 2차원로 구성된다(채널 이라고도 부른다).
흑백으로 코딩된 경우 (MNIST처럼) 흑백의 그레이 스케일만 나타내 면 되므로 깊이는 1이 된다.
입력신호가 RGB 신호로 코딩된 경우, 깊이 축의 차원은 세가지 색을
각각 나타내는 3이 된다. (데이터의 형상 정보를 유지 할 수 있다.) (광주인공지능학원)
패딩(Padding)
광주인공지능학원 이명훈연구원님 설명에 의하면 필터의 크기는 5x5나 7x7 등 임의의 크기로 정할 수 있다.
필터의 크기로 인해 가장자리 부분의 데이터가 부족해서 입력과 출력 의 크기가 달라지게 되는데
이를 보정하기 위해서 입력신호의 가장자리 부분에 0을 미리 채워넣 는 것을 패딩(padding) 이라고 한다.
Conv2D 계층에서는 padding 인자를 사용하여 패딩을 지정할 수 있 다. valid로 설정하면 패딩을 사용하지 말라는 뜻이다.
same을 지정하면 출력의 차원이 입력과 같아지도록 적절한 수의 패딩을 자동 으로 입력하라는 것이다. (광주인공지능학원)
축소샘플링
광주인공지능학원 이명훈연구원님 설명에 의하면 합성곱을 수행한 결과 신호를 다음 계층으로 전달할 때, 모든 정보를 전달하지 않고 일부만 샘플링하여 넘겨주는 작업을 축소 샘플링 (subsampling)이라고 한다.
축소 샘플링을 하는 이유는 좀 더 가치 있는 정보만을 다음 단계로 넘
겨주기 위해서이다.
커널 수를 늘리면 특성맵의 숫자가 점차 커지게 된다. 머신러닝의 최 종 목적은 정보를 결국 줄여나가야 하며 따라서 핵심 정보만 다음 계 층으로 전달하는 장치가 필요하다.(광주인공지능학원)
풀링(Pooling)
광주인공지능학원 이명훈연구원님 설명에 의하면 풀링이란 CNN에서 합성곱 수행 결과를 다음 계층으로 모두 넘기지 않고, 일정 범위내에서 (예를 들면 2x2 픽셀 범위) 가장 큰 값을 하나 만 선택하여 넘기는 방법을 사용한다.
이렇게 지역내 최대 값만 선택하는 풀링을 최대풀링(max pooling)
이라고 한다.
최대 풀링을 하면 작은 지역 공간의 대표 정보만 남기고 나머지 신호들을 제거하는 효과를 얻는다.(광주인공지능학원)
import os
train_dir = './dogs_vs_cats_small/train'
test_dir = './dogs_vs_cats_small/test'
train_dogs_dir = './dogs_vs_cats_small/train/dogs'
train_cats_dir = './dogs_vs_cats_small/train/cats'
test_dogs_dir = './dogs_vs_cats_small/test/dogs'
test_cats_dir = './dogs_vs_cats_small/test/cats'
validation_dogs_dir = './dogs_vs_cats_small/validation/dogs'
validation_cats_dir = './dogs_vs_cats_small/validation/cats'
# listdir() : 해당 폴더에 있는 파일을 가져온다
print("훈련 개 데이터 수 : {}".format(len(os.listdir(train_dogs_dir))))
print("훈련 고양이 데이터 수 : {}".format(len(os.listdir(train_cats_dir))))
print("테스트 개 데이터 수 : {}".format(len(os.listdir(test_dogs_dir))))
print("테스트 고양이 데이터 수 : {}".format(len(os.listdir(test_cats_dir))))
print("검증 개 데이터 수 : {}".format(len(os.listdir(validation_dogs_dir))))
print("검증 고양이 데이터 수 : {}".format(len(os.listdir(validation_cats_dir))))
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_gen = ImageDataGenerator(rescale=1./255)
test_gen= ImageDataGenerator(rescale=1./255)
# flow_from_directory() : 폴더에서 이미지 가져오기
train_generator = train_gen.flow_from_directory(train_dir, target_size=(150,150), batch_size=50, class_mode='binary'
# 이진분류 : binary
# 다중분류 : categorical
# 라벨번호는 0부터시작
# 폴더는 알파벡 순으로 읽음
)
test_generator = test_gen.flow_from_directory(test_dir, target_size=(150,150), batch_size=50, class_mode='binary'
# 이진분류 : binary
# 다중분류 : categorical
# 라벨번호는 0부터시작
# 폴더는 알파벡 순으로 읽음
)
import numpy as np
import tensorflow as tf
seed = 0
np.random.seed(seed)
tf.random.set_seed(seed)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten
#Conv2D : 특징 찾기
#MaxPooling2D : 불필요한 부분을 삭제
#Flatten : 데이터 펴줌(2차원의 데이터> 1차원 데이터)
model1 = Sequential()
#입력층(CNN)
model1.add(Conv2D(filters = 32,
kernel_size= (3,3)
,input_shape = (150,150,3)
,padding='same',
activation='relu'))
model1.add(MaxPooling2D(pool_size=(2,2)))
model1.add(Flatten())
model1.add(Dense(units=512, activation='relu'))
model1.add(Dense(units=1, activation='sigmoid'))
model1.summary()
model1.compile(loss = 'binary_crossentropy',
optimizer = 'adam',
metrics = ['accuracy'])
history1 = model1.fit_generator(generator=train_generator
#batch_size = 50으로 지정해뒀음
#전체데이터(2000)개를 다 읽어오려면 몇번
#돌려야 하는지 입력
, steps_per_epoch= 40,
epochs= 2,
validation_data = test_generator,
validation_steps= 1)
import matplotlib.pyplot as plt
acc = history1.history['accuracy']
val_acc = history1.history['val_accuracy']
epoch = range(1,len(acc)+1)
plt.plot(epoch, acc, c= 'red', label = 'Train acc')
plt.plot(epoch, val_acc, c = 'blue', label = 'Test acc')
plt.legend()
plt.plot()
train_deatGen = ImageDataGenerator(rescale=1./255,
rotation_range=20,
width_shift_range=0.1,
height_shift_range=9.1,
shear_range=0.1,
zoom_range=0.1,
horizontal_flip=True,
fill_mode='nearest'
)
test_dataGen = ImageDataGenerator(rescale=1./255)
model2 = Sequential()
#입력층(CNN)
model2.add(Conv2D(filters = 32,
kernel_size= (3,3)
,input_shape = (150,150,3)
,padding='same',
activation='relu'))
model2.add(MaxPooling2D(pool_size=(2,2)))
model2.add(Flatten())
model2.add(Dense(units=512, activation='relu'))
model2.add(Dense(units=1, activation='sigmoid'))
model2.summary()
model2.compile(loss = 'binary_crossentropy',
optimizer = 'adam',
metrics = ['accuracy'])
history2= model2.fit_generator(generator=train_generator
#batch_size = 50으로 지정해뒀음
#전체데이터(2000)개를 다 읽어오려면 몇번
#돌려야 하는지 입력
, steps_per_epoch= 10,
epochs= 2,
validation_data = test_generator,
validation_steps= 1)
import matplotlib.pyplot as plt
acc = history2.history['accuracy']
val_acc = history2.history['val_accuracy']
epoch = range(1,len(acc)+1)
plt.plot(epoch, acc, c= 'red', label = 'Train acc')
plt.plot(epoch, val_acc, c = 'blue', label = 'Test acc')
plt.legend()
plt.plot()
from tensorflow.keras.applications import VGG16
conv_base = VGG16(weights= 'imagenet',
include_top = False,
input_shape=(150,150,3))
conv_base.summary()
import os
import numpy as np
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_dir = './dogs_vs_cats_small/train/'
test_dir = './dogs_vs_cats_small/test'
validation_dir = './dogs_vs_cats_small/validation/'
dataGen = ImageDataGenerator(rescale=1./255)
batch_size = 20
# VGG16 특성추출기로 데이터를 보내서 특성을 추출하는 함수
# (데이터 폴더의 경로, 데이터의 개수)
def extract_features(directory, sample_count) :
# VGG16에 데이터를 보내서 받은 특성과 라벨을 저장하기 위한 변수 설정
features = np.zeros(shape=(sample_count, 4, 4, 512))
# 제너레이터에서 생성된 라벨값을 저장
labels = np.zeros(shape=(sample_count))
# VGG16으로 넘기기 위한 데이터를 제너레이터로 생성
generator = dataGen.flow_from_directory(directory,
target_size=(150, 150),
batch_size=20,
class_mode="binary")
i = 0 # VGG16를 호출한 횟수
# 제너레이터로부터 bath_size 개수만큼 데이터와 라벨을 가져온다
for inputs_bacth, labels_batch in generator :
# VGG16으로 데이터를 보내서 특성맵을 받아온다
features_batch = conv_base.predict(inputs_bacth)
# features 리스트에 batch_size 개수만큼씩 VGG16에서 넘어온 특성을 추가
features[i * batch_size : (i + 1) * batch_size] = features_batch
# labels에 batch_size 개수만큼씩 제너레이터에서 넘어온 라벨을 추가
labels[i * batch_size : (i + 1) * batch_size] = labels_batch
i = i + 1
# 처리한 데이터 갯수가 전체 데이터 갯수(sample_count)보다 크면
if i * batch_size >= sample_count :
break
return features, labels
train_feature, train_labels = extract_features(train_dir, 2000)
test_feature, test_labels = extract_features(test_dir, 22)
validation_feature, validation_labels = extract_features(validation_dir, 1000)
train_feature = np.reshape(train_feature,(2000, 4*4*512))
test_feature = np.reshape(test_feature, (22, 4*4*512))
validation_feature = np.reshape(validation_feature,(1000, 4*4*512))
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
model3 = Sequential()
model3.add(Dense(units = 256,
input_dim = 4*4*512,
activation = 'relu'))
model3.add(Dropout(0.5))
model3.add(Dense(units=1, activation='sigmoid'))
model3.summary()
from tensorflow.keras.optimizers import Adam
Adam()
model3.compile(loss = 'binary_crossentropy',
optimizer = Adam(learning_rate=0.02,
metrics = ['accuracy'])
h3 = model3.fit(train_feature, train_labels,
batch_size = 20,
epochs = 30,
validation_data = (validation_feature, validation_labels))
import matplotlib.pyplot as plt
acc = h3.history['accuracy']
val_acc = h3.history['val_accuracy']
epoch = range(1,len(acc)+1)
plt.plot(epoch, acc, c= 'red', label = 'Train acc')
plt.plot(epoch, val_acc, c = 'blue', label = 'Test acc')
plt.legend()
plt.plot()
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
model4 = Sequential()
#우리가 설계할 모델에 VGG16 끼워넣기
model4.add(conv_base)
model4.add(Flatten())
model4.add(Dense(units = 256, activation ='relu'))
model4.add(Dense(units = 1, activation ='sigmoid'))
model4.summary()
conv_base.trainable = False
print(len(modl4.trainable_weights))
"스마트인재개발원에서 진행된 수업내용입니다"
스마트인재개발원
4차산업혁명시대를 선도하는 빅데이터, 인공지능, 사물인터넷 전문 '0원' 취업연계교육기관
www.smhrd.or.kr