본문 바로가기
IT/머신러닝

[Keras] ANN 기본 예제

by 빨강자몽 2018. 8. 31.

 츨처 : <"코딩셰프의 3분 딥러닝 케라스맛" 김성진 저>를 공부하면서 작성하였습니다.


코드

- 함수형 모델 구성과 객체지향형 모델 구성 두 가지 모델이 구현되어 있지만 어느걸로 써도 동일한 결과를 얻을 수 있다.

# basic ANN(shallow neural network으로도 불림 snn)
# mnist 분류를 ANN을 이용하여 구성

# 패키지 임포트
from keras import layers, models

# 연쇄 방식 모델링 함수형 구현 방법
# model을 초기화 하고 add를 이용한 구현 방식을 사용한다.
# 함수형, 객체지향형 둘다 같은 결과를 가진다.

# ann 함수형 모델 구성
def ANN_func(Nin,Nh,Nout):
	# 모델 초기화
	model = models.Sequential()
	# 활성 함수 relu
	model.add(layers.Dense(Nh,activation='relu',input_shape=(Nin,)))
	# 활성 함수 softmax
	model.add(layers.Dense(Nout),activation='softmax')
	# 손실 함수 교차 엔트로피
	model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
	return model

# ann 객체지향형 모델 구성
# models.Sequential로 부터 상속 받는다.
class ANN_class(models.Sequential):
	def __init__(self,Nin,Nh,Nout):
		# 부모 클래스 초기화
		super().__init__()
		self.add(layers.Dense(Nh,activation='relu',input_shape=(Nin,)))
		self.add(layers.Dense(Nout, activation='softmax'))
		self.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])

# 데이터 불러오기
import numpy as np
# mnist() 함수 사용하기 위해
from keras import datasets
# to_categorical() 함수 사용하기 위해
from keras.utils import np_utils

def Data_func():
	# mnist를 읽어옵니다.
	(x_train,y_train),(x_test,y_test) = datasets.mnist.load_data()
	# 0~9까지의 숫자를 0과 1로 표현되는 벡터로 변환
	y_train = np_utils.to_categorical(y_train)
	y_test = np_utils.to_categorical(y_test)
	# 기존의 l*w*h형식의 데이터를 l*(w*h)로 변환한다.
	l,w,h = x_train.shape
	x_train = x_train.reshape(-1,w * h)
	x_test = x_test.reshape(-1,w * h)
	# 0~255의 값을 0~1사이의 값으로 변환(정규화라고 한다)
	x_train = x_train/255.0
	y_train = y_train/255.0
	return (x_train,y_train),(x_test,y_test)

import matplotlib.pyplot as plt
# 손실 그래프
def plot_loss(history):
	# 선 그리기
	plt.plot(history.history['loss'])
	plt.plot(history.history['val_loss'])
	# 그래프 제목
	plt.title('Model Loss')
	# x,y축 이름 표시
	plt.ylabel('Loss')
	plt.xlabel('Epoch')
	# 각 라인 표식 표시
	plt.legend(['Train','Test'],loc=0)

# 정확도 그래프
def plot_acc(history):
	plt.plot(history.history['acc'])
	plt.plot(history.history['val_acc'])
	plt.title('Model accuracy')
	plt.ylabel('Accuracy')
	plt.xlabel('Epoch')
	plt.legend(['Train', 'Test'], loc=0)

# 메인 함수
def main():
	Nin=784
	Nh=100
	number_of_class=10
	Nout=number_of_class

	model= ANN_class(Nin,Nh,Nout)
	(x_train,y_train),(x_test,y_test)=Data_func()

	# epochs 회수만큼 반복한다, batch_size 개수만큼 나눠서 넣느다
	history=model.fit(x_train,y_train,epochs=15,batch_size=100,validation_split=0.2)
	performace_Test=model.evaluate(x_test,y_test,batch_size=100)
	print('Test Lost and Accuracy ->',performace_Test)

	plot_loss(history)
	plt.show()
	plot_acc(history)
	plt.show()

# 실행
if __name__ == '__main__':
	main()


실행 결과

- 15/15 : epoch 15번의 반복횟수중 15번이 끝났을때의 결과를 의미한다.

- 100/48000 : 48000개의 데이터 중에서 100개 학습하였다.

- 1s or 0s : 학습하는데 걸린 시간.

- loss : 손실값

- acc : 정확도

- val_loss, val_acc : 검증 데이터 이용한 손실,정확도



- 트레이닝 셋에 대한 정확도는 점점 높아진다.

- 테스트 셋에 대한 정확도는 어느정도 상승한 이후에 오히려 떨어지기도 한다.

- 같은 데이터를 이용해서 반복학습 하기 때문에 다음과 같은 이유들이 발생하는 것 같다.(과적합(오버피팅)이라고 표현한다.)