심층신경망
2개 이상의 층을 포함한 신경망, 2개 이상의 층을 가지고 있는 Multi-Layer Perceptron이라고 말합니다.
다층 인공신경망, 심층신경망, 딥러닝과 같은 의미로 부르기도 합니다.
은닉층(Hidden Layer)
입력층(Input Layer)과 출력층(Output Layer) 사이에 밀집층이 추가된 것으로 입력층과 출력층 사이에 있는 모든층을 은닉층이라고 부릅니다.
활성화 함수(Activation Function)
신경망의 은닉층에 Activation Function을 사용하는 이유는 은닉층에서 선형(linear) 산술 계산만 수행하지 않고 비선형적인 계산을 위해 activation Function으로 sigmoid, Relu, tanh 등 여러 activation 함수를 이용하여 비선형이 되도록 바꿔줍니다.
# 1. 데이터 가져오기
from tensorflow import keras
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
# 1-1. 데이터 훈련셋 나누기
from sklearn.model_selection import train_test_split
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled, train_target, test_size=0.2, random_state=42)
패션 MNIST
머신러닝/딥러닝을 배울 때 많이 사용되는 데이터 셋으로 보통 0~9로 숫자로 이루어진 MNIST가 가장 유명한데요. 패션 MNIST는 MNIST와 개수가 동일하지만 패션아이템으로 이루어진 데이터가 패션 MNIST입니다.
먼저 앞서서 활용했던 패션 MNIST 데이터를 불러와 TRAIN_TEST_SPLIT 이용해서 8:2 비율로 TRAINSET, TESTSET으로 나누어줍니다.
# 2. 심층신경망 만들기
# 층 추가 방법 1(층 추가 편리, add method)
model = keras.Sequential()
model.add(keras.layers.Dense(100, activation='sigmoid', input_shape=(784,)))
model.add(keras.layers.Dense(10, activation='softmax'))
model.summary()
# 층 추가 방법2
model = keras.Sequential([
keras.layers.Dense(100, activation='sigmoid', input_shape=(784,), name='hidden'),
keras.layers.Dense(10, activation='softmax', name='output')], name='fashion model')
model.summary()
# 층 추가 방법3
dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))
dense2 = keras.layers.Dense(10, activation='softmax')
model= keras.Sequential([dense1, dense2])
model.summary()
심층신경망 MLP(Multi-Layers Perceptron)을 쌓는 3가지 방법을 제시하고 있습니다.
3가지 방법 모두 같은 MLP를 쌓는 방법이며 편한 방법이라고 생각되는 걸 사용하시면 됩니다.
MODEL의 신경망을 쌓기 위해 keras.Sequential() 함수를 이용해서 모델을 쌓을 준비를합니다.
모델에 들어가기 위한 INPUT_SHAPE = (784,)로 INPUT 되는 데이터의 SHAPE가 784인 이유는 train_scaled = train_scaled.reshape(-1, 28*28), train_scaled를 reshape한 값을 말한다.
keras 함수형 api MLP 쌓기
tensorflow의 sequentials 함수를 이용하여 MLP를 쌓을 수도 있지만 KERAS의 함수형 API(Funtional API)를 이용하여 MLP층을 쌓을 수도 있다. MLP를 어떤 방식으로 쌓느냐는 자유롭지만, KERAS Functional API를 이용하여 주로 MLP층과 MODEL을 만드는 편이다
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
a_input = Input(shape=(10,), name="a_input")
# Neural network
hidden1 = Dense(128, activation = 'relu')(a_input)
hidden2 = Dense(128, activation = 'relu')(hidden1)
output = Dense(1, activation = 'sigmoid')(hidden2)
model = Model(inputs=[a_input, b_input], outputs=output)
Activation Function - Sigmoid & Relu
활성화 함수(Activation Function)
신경망의 은닉층에 Activation Function을 사용하는 이유는 은닉층에서 선형(linear) 산술 계산만 수행하지 않고 비선형적인 계산을 위해 activation Function으로 sigmoid, Relu, tanh 등 여러 activation 함수를 이용하여 비선형이 되도록 바꿔줍니다.
sigmoid
# sigmoid - softmax
# MLP Activation function relu-softmax
model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(100, activation='sigmoid'))
model.add(keras.layers.Dense(10, activation='softmax'))
model.summary()
# 시그모이드 정확도 0.8067 ~ 0.8982
# 신경층이 많을수록 올바른 출력을 위한 신속한 대응 불가
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=10)
model.evaluate(val_scaled, val_target)
은닉층의 activation function 를 sigmoid - softmax를 이용하면 sigmoid 정확도가 0.8067 ~ 0. 8982가 나와요
ReLU
# 렐루함수 정확도 0.8124 ~ 0.9012 향상
# MLP Activation function relu-softmax
model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))
model.summary()
# 모델 훈련
(train_input, train_target), (test_input, test_target) =\
keras.datasets.fashion_mnist.load_data()
train_scaled = train_input / 255.0
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled, train_target, test_size=0.2, random_state=42)
model.compile(loss = 'sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=10)
model.evaluate(val_scaled, val_target)
은닉층의 activation function 를 Relu - softmax를 이용하면 sigmoid 정확도가 0.8124 ~ 0.9012가 나와요
옵티마이저 - Optimizer
옵티마이저 Optimizer 는 신경망의 가중치와 절편을 학습하기 위한 알고리즘을 말합니다. keras는 여러 grident desecnt 알고리즘을 구현되어 있는데 SGD, Momentum, RMSprop, Adam 등이 있습니다.
옵티마이저 경사 하강법 |
개요 | 효과 | keras 사용법 |
확률적 경사 하강법(SGD) | 랜덤추출데이터 이용한 더빠르고 자주 업데이트 |
속도 개선 | keras.optimizers.SGD(lr=0.1) |
모멘텀(Momentum) | 관성 방향을 고려한 진동, 폭을 줄임 | 정확도 개선 | keras.optimizers.SGD(lr=0.1, momentum =0.9) |
네스테로프 모멘텀(NAG) | 모멘텀 이동 방향으로 미리 이동해 그레이디언트를 계산, 불필요한 이동을 줄임 | 정확도 개선 | keras.optimizers.SGD(lr=0.1, momentum =0.9, nesterov =True) |
Adagrad | 변수 업데이트가 잦으면 학습률을 적게하여 이동보폭을 조절 | 보폭 크기 개선 | keras.optimizers.Adagrad(lr=0.01, epsilon = 1e-6) |
RMSProp | 아다그리드의 보폭 민감도 보완 | 보폭 크기 개선 | keras.optimizers.RMSProp(lr=0.001, rho =0.9, epsilon = 1e-08, decay = 0.0) |
Adam | 모멘텀/RMSProp 합친 방법 | 정확도/보폭크기 개선 | keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_0.2=0.999, epsilon = 1e - 08, decay =0.0) |
'머신러닝딥러닝 > 딥러닝' 카테고리의 다른 글
h5파일 TFlite 변환하기, h5파일 keras 파일로 변환하기 (0) | 2023.05.16 |
---|---|
mediapipe pose classification skeleton angle calculator(관절 각도 계산) (1) | 2023.05.02 |
[딥러닝] 인공신경망 패션아이템 분류 - 혼자공부하는 딥러닝 (0) | 2022.11.30 |
코사인 유사도(Cosine Similarity)vs 유클라디안 유사도(Euclidean Similarity)vs 자카드 유사도(Jaccard Similarity) (0) | 2022.11.28 |
t-SNE vs UMAP 차원 축소 알고리즘 알아보기 (0) | 2022.06.27 |
댓글