Deep Learning/혼공 머신 러닝 - 딥러닝

[DL] 인공 신경망 / 정의

KimTory 2022. 1. 4. 23:44

[용어 정리]

 

① 인공 신경망 : 생물학적 뉴런에서 영감을 받아 만든 머신러닝 알고리즘이며, 이미지, 음성, 텍스트 분야에서 주로 사용됩니다. 인공 신경망 알고리즘은 현재 딥러닝이라는 용어로도 불리고 있습니다.

<추가 설명>

⒜ 딥러닝에서 가장 기본이 되는 개념은 신경망 (Neural Network)

⒝ 뇌 구조의 특성 중 뉴런의 연결 구조를 본떠 만든 네트워크 구조를 인공 신경망이라 칭함

http://www.tcpschool.com/deep2018/deep2018_deeplearning_intro / 참고

 

 

② 밀집층 : 가장 간단한 인공 신경망의 층, 밀집층에서는 뉴런들이 모두 연결되어 있기 때문에 완전 연결 층이라고도

불리며, 출력층에 밀집층을 사용할 때는 분류하려는 클래스와 동일한 개수의 뉴런을 사용 해야 합니다.

 

[TensorFlow 함수]

 

① Dense : 신경망에서 가장 기본 층인 밀집층을 만드는 클래스

② Sequential : 케라스에서 신경망 모델을 만드는 클래스

③ compile : 모델 객체를 만든 후, 훈련하기 전에 사용할 손실 함수와 측정 지표 등을 지정하는 메서드

④ fit : 모델을 훈련하는 메서드 (1,2번 매개변수는 입력과 타깃 데이터를 입력, 3번 매개 변수는 epochs 입력)

⑤ evaluate : 모델 성능을 평가하는 메서드

 

[Data Set]

 

패션 MNIST → 28 X 28, 6만개 GrayScale Image

 

[Data Set 분할] 

from tensorflow import keras

((train_input, train_target), (test_input, test_target) = 
\ keras.datasets.fashion_mnist.load_data()

# .load_data() function을 통해 train, test Data를 Return 받음


print(train_input.shape, train_target.shape)
# (60000, 28, 28) (60000,)

 

[Train Image Check]

import matplotlib.pyplot as plt

fig, axs = plt.subplots(1, 10, figsize=(10,10))
for i in range(10):
    axs[i].imshow(train_input[i], cmap='gray_r')
    axs[i].axis('off')
plt.show()

[Train Target Image Check]

print([train_target[i] for i in range(10)])

# [9, 0, 0, 3, 0, 2, 7, 2, 5, 5]
# 앵글 부츠, 티셔츠, 티셔츠, 드레스 ...

[로지스틱 회귀로 패션 아이템 분류]

# MNIST의 경우 각 픽셀값을 0 ~ 255 사이의 정숫값을 가지므로
# train_input Data를 255로 나누어 0~1 사이로 정규화 진행
train_scaled = train_input / 255.0

# 1번째 매개변수 -1 지정 시, 자동으로 남은 차원을 할당 
# MNIST는 28 * 28 Data, SGDClassifier는 2차원 입력을 다루지 못함
train_scaled = train_scaled.reshape(-1, 28*28)

# 2차원 → 1차원 shape 변환


from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
# loss 손실 함수, 반복 횟수, 랜덤 고정
# log 일 때, 10개의 이진 분류 작업을 수행
# ex) 1개를 target으로 설정하고 나머지 9개는 ignore
sc = SGDClassifier(loss='log', max_iter=5, random_state=42)
# cross_validate 함수 이용하여 데이터의 교차 검증 성능 확인
scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
print(np.mean(scores['test_score']))

# 0.8195666666666668

[인공 신경망 이용 패션 아이템 분류]

 

import tensorflow as tf # tensorflow import
from tensorflow import keras # keras

# 인공 신경망 모델 생성
from sklearn.model_selection import train_test_split

# Data 분할 (학습, 검증 ) → 이전 data 분할 시, 학습과 test data set이였음 
train_scaled, val_scaled, train_target, val_target = train_test_split(
    train_scaled, train_target, test_size=0.2, random_state=42)

# shapre check
print(train_scaled.shape, train_target.shape)
# (48000, 784) (48000, )

# 밀집층 생성
# 10 - 뉴런 개수, sofrmat - 뉴런 출력에 적용할 함수, 입력 크기
dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))

# 신경망 모델 생성 (매개변수로 밀집층 변수를 받음)
model = keras.Sequential(dense)

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
print(train_target[:10]) # traget data

# model 학습, epochs = 5 → 반복 횟수
model.fit(train_scaled, train_target, epochs=5)

# ----------------------
Epoch 1/5
1500/1500 [==============================] - 6s 2ms/step - loss: 0.6105 - accuracy: 0.7958
Epoch 2/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4796 - accuracy: 0.8396
Epoch 3/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4565 - accuracy: 0.8476
Epoch 4/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4444 - accuracy: 0.8522
Epoch 5/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4363 - accuracy: 0.8544
<keras.callbacks.History at 0x7f27704743d0>
# ----------------------


# 성능 평가
model.evaluate(val_scaled, val_target)

# ----------------------
375/375 [==============================] - 1s 2ms/step - loss: 0.4462 - accuracy: 0.8494
[0.44616803526878357, 0.8494166731834412]
# ----------------------

▶ 검증 세트의 결과치가 훈련 세트 결과치보다 낮은 것은 일반적이며, 위 결과처럼 검증 결과치(0.8494) 보다

훈련 학습에서의 마지막 epoch 결과치(0.8544)가 더 높게 출력된 것을 확인 할 수 있다.