본문 바로가기

머신러닝/딥러닝

인공신경망(훈련모델생성)(2)

 

인공신경망

인공신경망, 혼공머 교재

출력층(output layer) : z1 ~ z10 을 계산하고 이를 바탕으로 클래스를 예측하기 때문에 신경망의 최종 값을 만든다는 의미

뉴런(neuron) : z 값을 계산하는 단위 (=unit)

입력층(input layer) : 픽셀값 자체이고 특별한 계산을 수행하지는 않음

 

z1을 만들기 위해 픽셀1인 x1에 곱해지는 가중치는 W1,1이라고 쓰고

z2를 만들기 위해 픽셀1인 x1에 곱해지는 가중치는 W1,2라고 씁니다.

 

절편은 뉴런마다 하나씩이므로 순서대로 b1, b2와 같이 나타냅니다.

 

인공신경망은 정말 우리의 뇌에 있는 뉴런과 같지 않습니다.

인공신경망은 기존의 머신러닝 알고리즘이 잘 해결하지 못했던 문제에서 높은 성능을 발휘하는 새로운 종류의 머신러닝 알고리즘일 뿐입니다.

 

딥러닝

딥러닝은 인공신경망과 거의 동의어로 사용되는 경우가 많습니다.

심층 신경망(deep neural network, DNN)을 딥러닝이라고 부릅니다.

심층 신경망은 여러개의 층을 가진 인공신경망입니다.

 


텐서플로 케라스

텐서플로는 구글이 오픈소스로 공개한 딥러닝 라이브러리입니다.

from tensorflow import keras

 

딥러닝 라이브러리가 다른 머신러닝 라이브러리와 다른 점 중 하나는 그래픽 처리 장치인 GPU를 사용하여 인공 신경망을 훈련한다는 것입니다.

 

GPU

벡터와 행렬 연산에 매우 최적화되어 있기 때문에 곱셈과 덧셈이 많이 수행되는 인공 신경망에 큰 도움이 됩니다.

 


인공신경망으로 모델 만들기

인공 신경망에서는 교차 검증을 잘 사용하지 않고 검증 세트를 별도로 덜어내어 사용합니다.

   이유 1. 딥러닝 분야의 데이터셋은 충분히 크기 때문에 검증 점수가 안정적

   이유 2. 교차 검증을 수행하기에는 훈련 시간이 너무 오래 걸림

 

### 훈련 및 검증데이터로 분류하기
from sklearn.model_selection import train_test_split

train_scaled, val_scaled, train_target, val_target = \
    train_test_split(train_scaled, train_target, 
                     test_size=0.2, random_state=42)
print(train_scaled.shape, train_target.shape)
print(val_scaled.shape, val_target.shape)
(48000, 784) (48000,)
(12000, 784) (12000,)

훈련 세트에서 20%를 검증 세트로 덜어 냈습니다

60,000개 중에 12,000개가 검증 세트로 분리되었습니다.

 

훈련 세트(train_scaled, train_targeet)로 모델을 만듭니다.

그 다음, 검증 세트(val_scaled, val_target)로 훈련한 모델을 평가합니다.

 

먼저 인공 신경망 그림의 오른쪽에 놓인 층을 만듭니다.

이 층은 다음 그림처럼 10개의 패션 아이템을 분류하기 위해 10개의 뉴런으로 구성됩니다.

 

밀집층

keras.layers패키지 안에는 다양한 층이 준비되어 있습니다.

왼쪽에 있는 784개 픽셀과 오른쪽에 있는 10개의 뉴런이 모두 연결

784*10 = 7,840개의 연결된 선

 

이런 층을 양쪽의 뉴런이 모두 연결하고 있기 때문에 완전연결층이라고도 부름

 

### 2. 딥러닝은 계층(layer) 구조로 되어있음
# 계층구조 : 입력층 > 은닉층...(전처리층) > 출력층
# - 첫번째 10 : 출력갯수 , 뉴런 개수 (정답 갯수)
# - kernel_initializer : 커널 초기화 함수(가중치 초기화 설정) 
#     --> uniform : 균등분포로 초기화
# - activation(활성화 함수) : 출력알고리즘 정의
#     --> sigmoid : 이진분류시 사용(0 or 1로 분류)
#     --> softmax : 다중분류시 사용(0, 1, 2...분류)
# - input_shape : 입력데이터의 갯수(1차원)
dense = keras.layers.Dense(10, kernel_initializer="uniform",
                          activation="softmax", input_shape=(784,))
dense
### 1. 인공신경망 클래스(모델) 생성하기
model = keras.Sequential(dense)
model

 

one-hot encoding(원 핫 인코딩)

타깃값을 해당 클래스만 1이고 나머지는 모두 0인 배열로 만드는 것

 

### 모델 설정단계(complile)를 거쳐야함
# - loss(손실함수) : 분류의 성격에 따라 손실알고리즘 결정
#   * 이진분류 : binary_crossentropy 함수 사용
#   * 다중분류(원핫데이터) : categorical_crossentropy 사용
#       -> 종속변수의 형태 [[0, 0, 1], [1, 1, 0]]
#   * 다중분류(숫자) : sparse_categorical_crossentropy
#       -> 종속변수의 형태 [0, 1, 2, 3, 4,....]
#   * 주로 이진분류와 다중분류(숫자) 함수가 사용됨
# - metrics : 훈련 할 때 반복(epoch)에 따른 
#              손실값과 정확도 출력해 주기
model.compile(loss="sparse_categorical_crossentropy",
              metrics="accuracy")
print(train_target[:10])

 

패션 MNIST데이터의 타깃값

[7 3 5 8 6 9 3 3 9 9]

 

모두 정수.

텐서플로에서는 정수로 된 타깃값을 원-핫 인코딩으로 바꾸지 않고 그냥 사용 가능합니다.

정수로된 타깃값을 사용해 크로스 엔트로피 손실을 계산하는 것이 바로 'sparse_cateorical_crossentropy'입니다.

타깃값을 원-핫 인코딩으로 준비했다면 compile()메서드에서 loss='categorical_crossentropy'로 지정

 

### 4. 훈련시키기
# epoch : 반복횟수
model.fit(train_scaled, train_target, epochs=5)

## - loss : 손실계수는 작아야 좋음

 

검증세트에서 모델의 성능 확인

### 검증데이터를 이용해서 검증결과 확인하기
score = model.evaluate(val_scaled, val_target)
score

평가결과는 훈련 세트의 점수보다 조금 낮은 83% 정도의 정확도를 보입니다.


 

'머신러닝 > 딥러닝' 카테고리의 다른 글

인공신경망(훈련모델생성)(1)  (0) 2024.03.19
가상환경설치  (0) 2024.03.18