728x90
반응형
In [1]:
### 딥러닝은 분류의 성격을 많이 띠고 있다.
# ax+bx+cx+dx+…+yx+z
# 가중치 a b c d ……
라이브러리¶
In [2]:
import tensorflow as tf
from tensorflow import keras
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
In [3]:
### tensorflow는 프레임워크라고 함.
# 텐서플로우 안에 keras가 딥러닝
In [4]:
### 실행 결과를 동일하게 하기 위한 처리(완전 동일하지 않을 수도 있음)
tf.keras.utils.set_random_seed(42)
### 연산 고정
tf.config.experimental.enable_op_determinism()
데이터 수집¶
In [5]:
### keras에서 제공해주는 이미지 데이터셋 사용
# - MNIST 패션 이미지
# - 이미지 데이터는 픽셀 데이터로 이루어져 있습니다.
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
print(train_input.shape, train_target.shape)
print(test_input.shape, test_target.shape)
(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
In [ ]:
In [53]:
### 이미지 1개에 대한 데이터 추출
# - 각 데이터는 픽셀값(색상값)
# - 픽셀값(색상값)은 0~255 (총 256개의 값들로 구성되어 있음)
train_input[0]
Out[53]:
array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1,
1, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0,
0, 3],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12,
10, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130,
72, 15],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88,
172, 66],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196,
229, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245,
173, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243,
202, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12,
219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197,
209, 52],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99,
244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119,
167, 56],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55,
236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209,
92, 0],
[ 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237,
226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255,
77, 0],
[ 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228,
207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244,
159, 0],
[ 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217,
226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238,
215, 0],
[ 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200,
159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232,
246, 0],
[ 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240,
80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228,
225, 0],
[ 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217,
241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224,
229, 29],
[ 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198,
213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221,
230, 67],
[ 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219,
221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205,
206, 115],
[ 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211,
210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177,
210, 92],
[ 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189,
188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216,
170, 0],
[ 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244,
221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0]], dtype=uint8)
훈련데이터 10개만 이용해서 데이터를 이미지로 시각화하기¶
In [63]:
### 서브플롯 사용 : 이미지 10개를 하나로 시각화
fig, axs = plt.subplots(1, 10, figsize=(10,10))
### 훈련데이터 10개에 대한 처리
for i in range(10) :
### 픽셀데이터를 이미지로 시각화 : imshow()
axs[i].imshow(train_input[i], cmap="gray_r")
### x,y 좌표계 숨기기
axs[i].axis("off")
plt.show()
In [8]:
### 종속변수 10개 추출해서 매핑된 값 확인해 보기
train_target[:10]
Out[8]:
array([9, 0, 0, 3, 0, 2, 7, 2, 5, 5], dtype=uint8)
In [9]:
### 종속변수의 범주값 확인하기
np.unique(train_target, return_counts=True)
Out[9]:
(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8),
array([6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000],
dtype=int64))
데이터 스케일링 : 정규화¶
In [10]:
### 사용되는 데이터의 특성상 0부터 255까지의 값을 가지고 있음.
# - 값의 폭이 크기 때문에 일반화(데이터스케일링 : 정규화)하여 사용.
# - 데이터 스케일링을 수행하는 방법으로 라이브러리를 사용해도 되며, 값의 최대값을 이용해서 산술연산을 이용해서 정규화해도 됨.
train_input[0]
Out[10]:
array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1,
1, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0,
0, 3],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12,
10, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130,
72, 15],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88,
172, 66],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196,
229, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245,
173, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243,
202, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12,
219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197,
209, 52],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99,
244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119,
167, 56],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55,
236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209,
92, 0],
[ 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237,
226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255,
77, 0],
[ 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228,
207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244,
159, 0],
[ 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217,
226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238,
215, 0],
[ 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200,
159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232,
246, 0],
[ 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240,
80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228,
225, 0],
[ 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217,
241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224,
229, 29],
[ 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198,
213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221,
230, 67],
[ 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219,
221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205,
206, 115],
[ 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211,
210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177,
210, 92],
[ 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189,
188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216,
170, 0],
[ 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244,
221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0]], dtype=uint8)
In [11]:
### 데이터 스케일링 수행하기
train_scaled_255 = train_input / 255.0
test_scaled_255 = test_input / 255.0
train_scaled_255[0], test_scaled_255[0]
### shape는 차원 확인.
train_scaled_255.shape, test_scaled_255.shape
Out[11]:
((60000, 28, 28), (10000, 28, 28))
In [12]:
### 모델 훈련에 사용하기 위해서는 2차원으로 변환
# - reshape는 차원을 변경하는 함수
train_scaled_2d = train_scaled_255.reshape(-1,28*28)
train_scaled_2d.shape
Out[12]:
(60000, 784)
훈련 : 검증 데이터로 분리 (8:2)¶
In [13]:
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled_2d,
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,)
인공신경망 모델 훈련시키기 위한 단계¶
In [14]:
### 딥러닝은 계층 구조의 모델로 구성됨.
In [15]:
# 순서 : 1. 2. 두가지중 아무거나 먼저 하면됨.(모델 생성하기, 인공신경망 계측(layer) 생성)
# : 3. 모델 설정 단계
# : 4. 모델 훈련시키기
In [16]:
"""2. 인공신경망 계측(layer) 생성하기
- Dense() : 딥러닝에서 가장 기본적인 계층
: 모델에 넣어서 훈련을 수행하게 됨
- 딥러닝에서 사용하는 용어
→ 특성 : '뉴런' 이라고 칭합니다.
→ 크기 : 개수를 의미합니다.
- 딥러닝에서 사용되는 숫자들의 범위
→ 일반적으로 딥러닝에서는 숫자의 범위를 2^4 ~ 2^9 또는 2^5~ 2^9로 사용함.
→ 높이와 너비를 나타내는 숫자가 있는 경우에는 3x3 또는 5x5 를 주로 사용합니다.
- 모델에는 여러개의 계층(layer)이 사용될 수 있음.
→ 첫번째 계층 : 입력 계층(Inputlayer)이라고 칭합니다. 입력계층에는 input_shape()가 정의됩니다.
input_shape()에는 독립변수의 열의 개수를 정의합니다.
모델에서 한개의 계층만 사용되는 경우에는 입력 계층이 곧, 출력 계층의 역할까지 수행합니다.
→ 이 경우 출력 크기는 종속변수의 범주 개수를 정의합니다.
→ 중간 계층 : 은닉 계층(Hidden layer)이라고 칭합니다. 은닉 계층은 여러개 사용 됨.
은닉 계층의 출력 크기(개수)는 일정하지 않음. 출력크기는 사람이 정함.
출력크기는 다음 은닉계층이 입력 크기로 받아서 훈련을 이어가는 방식
→ 마지막 계층 : 출력 계층(Output layer)이라고 칭합니다. 출력 계층에 사용되는 출력 크기는 종속변수의 범주의 개수를 정의합니다.
- units = 특정 계층에서의 출력의 크기(개수), 결과 개수
→ 딥러닝 모델에는 계층이 여러개 사용될 수 있으며,
마지막 계층의 units 개수는 종속변수 범주의 개수를 사용합니다.
→ 중간에 사용되는 계층을 은닉계층(hidden layer)라고 칭하며, 계층 간에는 출력 크기를 넘겨받아서 사용됩니다.
→ 중간 계층의 출력 크기에 따라서 성능에 영향을 미칠 수 있기 때문에, 하이퍼파라메터 튜닝을 진행해야는 경우도 있습니다.
→ 하이퍼파라메터 튜닝은 값을 바꾸면서 여러번 시도하는 방식을 사용합니다.
- kernel_initializer : 가중치를 초기화하는 방법을 지정.
→ 가중치 : 손실을 최소화 하도록 하기위해서 모델이 훈련을 반복하는 과정에서 스스로 조정하는 값을 의미함.
→ 가중치 초기화 방법 : uniform, normal 방법이 있음.
* uniform : 균일 분포 방법
* normal : 가우시안 분포(정규 분포) 방법
분류를 할때 0아니면 1이였는데 (값으로 나왔는데)딥러닝에서는 알아서 해주는게 아니라 확률로 보여준다.
이때 분류값을 뽑아줘 라고하면 범주의 개수만큼 뽑아준다. 결과값이 확률로 나옴. 몇개 알려줘라고 정해줘야 정해진 개수만큼 나옴.
"""
"""
- 딥러닝에서는 어떻게 처리할지의 계층을 만들어줘야된다.(보통 레이어계층이라고 이야기한다)
- 계층이만들어지고 그 계층을 인공신경망모델에 넣어준다. 넣어서 내가 만든 계층 구조대로 네가 훈련시켜 라고 명령을 내린다.
- 훈련한다음 뭔가 실행이된다.(fit하는것처럼)
- 이후 검증하고 예측한다.
- 딥러닝에서는 출력의 개수와 튜닝은 설정하지만, 보통 하이퍼파라메터 튜닝의 속성값들은 손을 잘 안대고 default값을 사용한다.
- 설정단계가 있으니 먼저 설정단계를 하도록 하겠다.
- activation : 활성화 함수라고 칭합니다.
→ 훈련 시 입력된 특성(뉴런)의 크기를, 어떤 형태의 크기로 변환할지를 결정하는 함수.
→ 출력계층(Output Layer)에는 해당 종속변수의 특성에 따라 결정됨.
-→ 선형형태인 회귀분석의 경우 linear 사용.
-→ 범주형태의 분류분석의 경우에는 sigmoid, softmax, relu, tanh, LeakyRelu등 사용.
☆★--→ 이진분류 : sigmoid, relu, tanh, . ★☆
☆★--→ 다중분류 : softmax ★☆
→ 입력계층 또는 은닉계층에는 : linear, sigmoid, softmax, relu, tanh, LeakyRelu 등이 사용됨.
(이진분류) : 바이너리 / 둘 중 하나 선택
ReLU는 0을 기준으로하고 0보다 작은값은 출력에서 버려버린다. 그래서 0보다 큰거만 출력한다.
sigmoid의 경우 기울기가 점점 감소하기때문에 0.6 0.7 이런값은 없고 거의다 1로만 나오기때문에 명확성이 떨어지고
ReLU의 경우는 기울기가 일정하기때문에 값이 명확하다. 대신 - 값이 다 버려지기때문에 Leaky ReLU와 비교해서 leakyReLU의 경우는 - 값도 일부 허용해준다.
ReLU는 0보다 작으면 다 버리니까 출력을 다 버려버리기때문에 값이 적어져서 정확도가 떨어질 수 있어서 Leaky ReLu를 이용해서 하고
이후 tanh가 나와서 -값을 다쓰는 녀석을 쓸 수 있다 만, -의 허용범위가 너무 커서 정확도가 떨어지는 경우가 생기기때문에 LeakyReLU를 제일 많이 쓴다.
마지막계층에서는 Tanh는 사용하지 않고, sigmoid나 ReLU를 많이 사용하고, 중간계층에서는 뭘 써도 상관없다.
(다중분류)
softmax를 사용. 확률적으로 뽑아낸다.
<이진 분류 시 둘 중 하나를 출력 시킬때>
※ sigmoid : 0.5이상 나와야 1이 됨 (1보다 큰 값에서는 명확성이 떨어짐)
※ ReLU : 0보다 큰놈이 나와야 1이 됨 (0보다 작으면 출력에서 제외)
※ Leaky ReLU : -값도 일부는 허용해 주겠다. ==> 가장 많이 사용 ⭐⭐⭐
※ Tanh : -값도 허용하겠다.
==> 마지막 계층에 sigmoid, ReLU 많이 사용(-값 없어서)
"""
dense = keras.layers.Dense(
units=10,
kernel_initializer="uniform",
activation="softmax",
input_shape=(784, )
)
dense
Out[16]:
<keras.layers.core.dense.Dense at 0x10ebe4e9af0>
In [17]:
### 1. 모델 생성하기
model = keras.Sequential(dense)
model
Out[17]:
<keras.engine.sequential.Sequential at 0x10ebc0c4a30>
In [65]:
"""categorical_crossentropy 와 관련된 원-핫 인코딩 예제"""
import numpy as np
from tensorflow.keras.utils import to_categorical
### 임의 데이터 생성
# - randit() : 랜덤하게 정수값을 생성하는 함수
# → 첫번째 인자 : 범주의 범위(0~2 까지로 3개의 범주를 의미함)
# → 두번째 인자 : 몇 개의 랜덤한 범주값을 만들지에 대한 값(10개 생성)
labels = np.random.randint(3, size=(10, ))
labels
### 원- 핫 인코딩(One-Hot Encoding) 하기
# to_categorical() : 각각의 값을 범주의 갯수만큼의 리스트로 데이터 생성
# : 리스트 내 데이터에서 1이 있는 곳의 인덱스 위치값은 실제 labels의 값과 동일
# - num_classes : unique 한 범주의 갯수 정의
one_hot_labels = to_categorical(labels, num_classes=3)
labels, one_hot_labels.shape , one_hot_labels
Out[65]:
(array([1, 0, 1, 0, 1, 2, 2, 0, 2, 2]),
(10, 3),
array([[0., 1., 0.],
[1., 0., 0.],
[0., 1., 0.],
[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.],
[0., 0., 1.],
[1., 0., 0.],
[0., 0., 1.],
[0., 0., 1.]], dtype=float32))
In [19]:
### 3. 모델 설정 단계
"""
* loss : 손실을 줄이기 위해 사용되는 함수 정의
- : 손실함수에는 categorical_crossentropy, binary-crossentropy,
: sparse_categorical_crossentropy 가 있음.
- categorical_crossentropy : 다중분류 손실함수.
-→ 종속변수의 데이터 값이 원-핫 인코딩된 형태로 되어있는 경우 사용
-→ 예시데이터 : [[0, 1, 0],[0, 0, 1], [0, 1, 0]……]
- sparse_categorical_crossentropy : 다중분류 손실함수
-→ 종속변수의 데이터 값이 숫자값으로 되어 있는 경우사용
-→ 예시 데이터 : [0, 1, 2, 3, 4, ……]
- binary-crossentropy : 이진분류 손실함수
-→ 종속변수의 데이터 값이 숫자값으로 2개 정의되어 있는 경우사용
-→ 예시 데이터 : [0, 1, 1, 0, 0 ,1, ……]
"""
### compile 이진분류인지 다중분류인지 해당 속성들을 정의함.
model.compile(
### 손실함수 : 종속변수의 형태에 따라 결정됨.
loss="sparse_categorical_crossentropy",
### 훈련 시 출력할 값 :정확도 출력
metrics="accuracy"
)
In [27]:
### 4. 모델 훈련시키기
model.fit(train_scaled, train_target, epochs=91)
Epoch 1/91
1500/1500 [==============================] - 1s 536us/step - loss: 0.4132 - accuracy: 0.8761
Epoch 2/91
1500/1500 [==============================] - 1s 543us/step - loss: 0.4133 - accuracy: 0.8770
Epoch 3/91
1500/1500 [==============================] - 1s 535us/step - loss: 0.4139 - accuracy: 0.8760
Epoch 4/91
1500/1500 [==============================] - 1s 520us/step - loss: 0.4128 - accuracy: 0.8766
Epoch 5/91
1500/1500 [==============================] - 1s 525us/step - loss: 0.4129 - accuracy: 0.8774
Epoch 6/91
1500/1500 [==============================] - 1s 518us/step - loss: 0.4150 - accuracy: 0.8771
Epoch 7/91
1500/1500 [==============================] - 1s 528us/step - loss: 0.4144 - accuracy: 0.8761
Epoch 8/91
1500/1500 [==============================] - 1s 520us/step - loss: 0.4143 - accuracy: 0.8765
Epoch 9/91
1500/1500 [==============================] - 1s 543us/step - loss: 0.4137 - accuracy: 0.8765
Epoch 10/91
1500/1500 [==============================] - 1s 583us/step - loss: 0.4145 - accuracy: 0.8771
Epoch 11/91
1500/1500 [==============================] - 1s 543us/step - loss: 0.4144 - accuracy: 0.8771
Epoch 12/91
1500/1500 [==============================] - 1s 529us/step - loss: 0.4147 - accuracy: 0.8759
Epoch 13/91
1500/1500 [==============================] - 1s 533us/step - loss: 0.4145 - accuracy: 0.8756
Epoch 14/91
1500/1500 [==============================] - 1s 517us/step - loss: 0.4139 - accuracy: 0.8766
Epoch 15/91
1500/1500 [==============================] - 1s 527us/step - loss: 0.4150 - accuracy: 0.8769
Epoch 16/91
1500/1500 [==============================] - 1s 534us/step - loss: 0.4145 - accuracy: 0.8769
Epoch 17/91
1500/1500 [==============================] - 1s 534us/step - loss: 0.4145 - accuracy: 0.8778
Epoch 18/91
1500/1500 [==============================] - 1s 534us/step - loss: 0.4149 - accuracy: 0.8766
Epoch 19/91
1500/1500 [==============================] - 1s 523us/step - loss: 0.4143 - accuracy: 0.8776
Epoch 20/91
1500/1500 [==============================] - 1s 519us/step - loss: 0.4159 - accuracy: 0.8761
Epoch 21/91
1500/1500 [==============================] - 1s 555us/step - loss: 0.4154 - accuracy: 0.8769
Epoch 22/91
1500/1500 [==============================] - 1s 533us/step - loss: 0.4148 - accuracy: 0.8767
Epoch 23/91
1500/1500 [==============================] - 1s 549us/step - loss: 0.4151 - accuracy: 0.8764
Epoch 24/91
1500/1500 [==============================] - 1s 537us/step - loss: 0.4158 - accuracy: 0.8769
Epoch 25/91
1500/1500 [==============================] - 1s 539us/step - loss: 0.4162 - accuracy: 0.8770
Epoch 26/91
1500/1500 [==============================] - 1s 524us/step - loss: 0.4165 - accuracy: 0.8752
Epoch 27/91
1500/1500 [==============================] - 1s 528us/step - loss: 0.4162 - accuracy: 0.8769
Epoch 28/91
1500/1500 [==============================] - 1s 525us/step - loss: 0.4161 - accuracy: 0.8756
Epoch 29/91
1500/1500 [==============================] - 1s 522us/step - loss: 0.4165 - accuracy: 0.8763
Epoch 30/91
1500/1500 [==============================] - 1s 514us/step - loss: 0.4171 - accuracy: 0.8764
Epoch 31/91
1500/1500 [==============================] - 1s 530us/step - loss: 0.4167 - accuracy: 0.8776
Epoch 32/91
1500/1500 [==============================] - 1s 532us/step - loss: 0.4166 - accuracy: 0.8779
Epoch 33/91
1500/1500 [==============================] - 1s 573us/step - loss: 0.4161 - accuracy: 0.8756
Epoch 34/91
1500/1500 [==============================] - 1s 561us/step - loss: 0.4173 - accuracy: 0.8779
Epoch 35/91
1500/1500 [==============================] - 1s 533us/step - loss: 0.4168 - accuracy: 0.8774
Epoch 36/91
1500/1500 [==============================] - 1s 535us/step - loss: 0.4178 - accuracy: 0.8770
Epoch 37/91
1500/1500 [==============================] - 1s 532us/step - loss: 0.4164 - accuracy: 0.8775
Epoch 38/91
1500/1500 [==============================] - 1s 535us/step - loss: 0.4175 - accuracy: 0.8773
Epoch 39/91
1500/1500 [==============================] - 1s 535us/step - loss: 0.4172 - accuracy: 0.8767
Epoch 40/91
1500/1500 [==============================] - 1s 524us/step - loss: 0.4171 - accuracy: 0.8774
Epoch 41/91
1500/1500 [==============================] - 1s 531us/step - loss: 0.4170 - accuracy: 0.8773
Epoch 42/91
1500/1500 [==============================] - 1s 529us/step - loss: 0.4170 - accuracy: 0.8779
Epoch 43/91
1500/1500 [==============================] - 1s 556us/step - loss: 0.4172 - accuracy: 0.8765
Epoch 44/91
1500/1500 [==============================] - 1s 544us/step - loss: 0.4183 - accuracy: 0.8771
Epoch 45/91
1500/1500 [==============================] - 1s 542us/step - loss: 0.4176 - accuracy: 0.8764
Epoch 46/91
1500/1500 [==============================] - 1s 555us/step - loss: 0.4178 - accuracy: 0.8777
Epoch 47/91
1500/1500 [==============================] - 1s 543us/step - loss: 0.4185 - accuracy: 0.8782
Epoch 48/91
1500/1500 [==============================] - 1s 541us/step - loss: 0.4179 - accuracy: 0.8775
Epoch 49/91
1500/1500 [==============================] - 1s 538us/step - loss: 0.4186 - accuracy: 0.8762
Epoch 50/91
1500/1500 [==============================] - 1s 545us/step - loss: 0.4180 - accuracy: 0.8773
Epoch 51/91
1500/1500 [==============================] - 1s 542us/step - loss: 0.4180 - accuracy: 0.8789
Epoch 52/91
1500/1500 [==============================] - 1s 538us/step - loss: 0.4183 - accuracy: 0.8769
Epoch 53/91
1500/1500 [==============================] - 1s 535us/step - loss: 0.4188 - accuracy: 0.8771
Epoch 54/91
1500/1500 [==============================] - 1s 528us/step - loss: 0.4184 - accuracy: 0.8780
Epoch 55/91
1500/1500 [==============================] - 1s 535us/step - loss: 0.4192 - accuracy: 0.8762
Epoch 56/91
1500/1500 [==============================] - 1s 539us/step - loss: 0.4190 - accuracy: 0.8770
Epoch 57/91
1500/1500 [==============================] - 1s 555us/step - loss: 0.4184 - accuracy: 0.8771
Epoch 58/91
1500/1500 [==============================] - 1s 554us/step - loss: 0.4180 - accuracy: 0.8769
Epoch 59/91
1500/1500 [==============================] - 1s 550us/step - loss: 0.4185 - accuracy: 0.8782
Epoch 60/91
1500/1500 [==============================] - 1s 545us/step - loss: 0.4193 - accuracy: 0.8779
Epoch 61/91
1500/1500 [==============================] - 1s 553us/step - loss: 0.4202 - accuracy: 0.8768
Epoch 62/91
1500/1500 [==============================] - 1s 542us/step - loss: 0.4201 - accuracy: 0.8772
Epoch 63/91
1500/1500 [==============================] - 1s 537us/step - loss: 0.4203 - accuracy: 0.8766
Epoch 64/91
1500/1500 [==============================] - 1s 537us/step - loss: 0.4200 - accuracy: 0.8769
Epoch 65/91
1500/1500 [==============================] - 1s 547us/step - loss: 0.4191 - accuracy: 0.8785
Epoch 66/91
1500/1500 [==============================] - 1s 539us/step - loss: 0.4197 - accuracy: 0.8785
Epoch 67/91
1500/1500 [==============================] - 1s 531us/step - loss: 0.4200 - accuracy: 0.8776
Epoch 68/91
1500/1500 [==============================] - 1s 533us/step - loss: 0.4208 - accuracy: 0.8768
Epoch 69/91
1500/1500 [==============================] - 1s 539us/step - loss: 0.4199 - accuracy: 0.8779
Epoch 70/91
1500/1500 [==============================] - 1s 544us/step - loss: 0.4208 - accuracy: 0.8782
Epoch 71/91
1500/1500 [==============================] - 1s 543us/step - loss: 0.4208 - accuracy: 0.8776
Epoch 72/91
1500/1500 [==============================] - 1s 531us/step - loss: 0.4211 - accuracy: 0.8775
Epoch 73/91
1500/1500 [==============================] - 1s 536us/step - loss: 0.4210 - accuracy: 0.8771
Epoch 74/91
1500/1500 [==============================] - 1s 533us/step - loss: 0.4221 - accuracy: 0.8767
Epoch 75/91
1500/1500 [==============================] - 1s 538us/step - loss: 0.4216 - accuracy: 0.8779
Epoch 76/91
1500/1500 [==============================] - 1s 530us/step - loss: 0.4215 - accuracy: 0.8776
Epoch 77/91
1500/1500 [==============================] - 1s 558us/step - loss: 0.4226 - accuracy: 0.8771
Epoch 78/91
1500/1500 [==============================] - 1s 558us/step - loss: 0.4209 - accuracy: 0.8780
Epoch 79/91
1500/1500 [==============================] - 1s 550us/step - loss: 0.4209 - accuracy: 0.8775
Epoch 80/91
1500/1500 [==============================] - 1s 544us/step - loss: 0.4213 - accuracy: 0.8785
Epoch 81/91
1500/1500 [==============================] - 1s 552us/step - loss: 0.4211 - accuracy: 0.8781
Epoch 82/91
1500/1500 [==============================] - 1s 543us/step - loss: 0.4224 - accuracy: 0.8778
Epoch 83/91
1500/1500 [==============================] - 1s 534us/step - loss: 0.4218 - accuracy: 0.8774
Epoch 84/91
1500/1500 [==============================] - 1s 551us/step - loss: 0.4222 - accuracy: 0.8776
Epoch 85/91
1500/1500 [==============================] - 1s 559us/step - loss: 0.4227 - accuracy: 0.8775
Epoch 86/91
1500/1500 [==============================] - 1s 548us/step - loss: 0.4230 - accuracy: 0.8780
Epoch 87/91
1500/1500 [==============================] - 1s 552us/step - loss: 0.4220 - accuracy: 0.8779
Epoch 88/91
1500/1500 [==============================] - 1s 554us/step - loss: 0.4220 - accuracy: 0.8771
Epoch 89/91
1500/1500 [==============================] - 1s 538us/step - loss: 0.4227 - accuracy: 0.8765
Epoch 90/91
1500/1500 [==============================] - 1s 545us/step - loss: 0.4232 - accuracy: 0.8784
Epoch 91/91
1500/1500 [==============================] - 1s 557us/step - loss: 0.4223 - accuracy: 0.8786
Out[27]:
<keras.callbacks.History at 0x10ee609cd00>
In [28]:
### 5. 모델 성능 검증하기
# 딥러닝에서는 loss를 기준으로도 많이 본다. 즉 0.4047보다 0.4837이므로 훈련이 더 낮게나오면 된다. 그래야 과소적합이 없는거다.
# 정확도의 경우는 기존과 마찬가지로 훈련이 더 크고 검증이 더 작아야한다.
score = model.evaluate(val_scaled, val_target)
# [0.550127387046814, 0.8475833535194397]
score
375/375 [==============================] - 0s 458us/step - loss: 0.6047 - accuracy: 0.8446
Out[28]:
[0.6047204732894897, 0.8445833325386047]
In [29]:
"""
<인공신경망 모델 훈련 순서>
1. 모델 생성(또는 계층 생성)
2. 계층 생성(또는 모델 생성)
3. 모델 설정(compile)
4. 모델 훈련 시키기 (fit)
5. 성능평가(검증, evaluate)
<성능 개선 방법>
- 데이터 증가 시키기
- 하이퍼파라메터 튜닝(일반적으로 딥러닝에서는 디폴트 값을 사용해도 됨)
--> 성능이 현저히 낮은 경우에는 튜닝 필요
- 계층을 추가 또는 제거합니다.
"""
Out[29]:
'\n<인공신경망 모델 훈련 순서>\n1. 모델 생성(또는 계층 생성)\n2. 계층 생성(또는 모델 생성)\n3. 모델 설정(compile)\n4. 모델 훈련 시키기 (fit)\n5. 성능평가(검증, evaluate)\n\n<성능 개선 방법>\n- 데이터 증가 시키기\n- 하이퍼파라메터 튜닝(일반적으로 딥러닝에서는 디폴트 값을 사용해도 됨)\n --> 성능이 현저히 낮은 경우에는 튜닝 필요\n- 계층을 추가 또는 제거합니다.\n\n\n'
In [30]:
"""
모델에서 사용한 계층 확인하기
- output shape() : 출력 크기 (10개 출력)
- Param : Dense() : 계층이 훈련중에 사용한 총 특성의 갯수
- Param : 계층이 훈련 중에 사용한 총 특성의 갯수
--> 계산공식 = (입력크기 + 1) x 출력크기
= (748 + 1) x 10 = 7850
-
"""
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 10) 7850
=================================================================
Total params: 7,850
Trainable params: 7,850
Non-trainable params: 0
_________________________________________________________________
은닉계층 (Hidden Layer) 추가하기¶
In [33]:
model.add(
keras.layers.Dense(
10, # units는 생략해도 숫자만 적어도 된다.
kernel_initializer="uniform",
activation="relu",
input_shape=(784,)
)
)
In [34]:
model.fit(train_scaled, train_target, epochs=50)
Epoch 1/50
1500/1500 [==============================] - 1s 548us/step - loss: 0.4231 - accuracy: 0.8770
Epoch 2/50
1500/1500 [==============================] - 1s 523us/step - loss: 0.4231 - accuracy: 0.8782
Epoch 3/50
1500/1500 [==============================] - 1s 521us/step - loss: 0.4236 - accuracy: 0.8773
Epoch 4/50
1500/1500 [==============================] - 1s 526us/step - loss: 0.4226 - accuracy: 0.8777
Epoch 5/50
1500/1500 [==============================] - 1s 515us/step - loss: 0.4227 - accuracy: 0.8790
Epoch 6/50
1500/1500 [==============================] - 1s 517us/step - loss: 0.4248 - accuracy: 0.8783
Epoch 7/50
1500/1500 [==============================] - 1s 527us/step - loss: 0.4242 - accuracy: 0.8772
Epoch 8/50
1500/1500 [==============================] - 1s 525us/step - loss: 0.4242 - accuracy: 0.8775
Epoch 9/50
1500/1500 [==============================] - 1s 523us/step - loss: 0.4235 - accuracy: 0.8776
Epoch 10/50
1500/1500 [==============================] - 1s 512us/step - loss: 0.4243 - accuracy: 0.8782
Epoch 11/50
1500/1500 [==============================] - 1s 547us/step - loss: 0.4242 - accuracy: 0.8780
Epoch 12/50
1500/1500 [==============================] - 1s 544us/step - loss: 0.4247 - accuracy: 0.8776
Epoch 13/50
1500/1500 [==============================] - 1s 541us/step - loss: 0.4243 - accuracy: 0.8771
Epoch 14/50
1500/1500 [==============================] - 1s 525us/step - loss: 0.4237 - accuracy: 0.8780
Epoch 15/50
1500/1500 [==============================] - 1s 531us/step - loss: 0.4249 - accuracy: 0.8781
Epoch 16/50
1500/1500 [==============================] - 1s 518us/step - loss: 0.4244 - accuracy: 0.8784
Epoch 17/50
1500/1500 [==============================] - 1s 519us/step - loss: 0.4245 - accuracy: 0.8786
Epoch 18/50
1500/1500 [==============================] - 1s 536us/step - loss: 0.4248 - accuracy: 0.8779
Epoch 19/50
1500/1500 [==============================] - 1s 524us/step - loss: 0.4242 - accuracy: 0.8785
Epoch 20/50
1500/1500 [==============================] - 1s 545us/step - loss: 0.4258 - accuracy: 0.8768
Epoch 21/50
1500/1500 [==============================] - 1s 575us/step - loss: 0.4252 - accuracy: 0.8775
Epoch 22/50
1500/1500 [==============================] - 1s 537us/step - loss: 0.4248 - accuracy: 0.8780
Epoch 23/50
1500/1500 [==============================] - 1s 557us/step - loss: 0.4250 - accuracy: 0.8772
Epoch 24/50
1500/1500 [==============================] - 1s 526us/step - loss: 0.4257 - accuracy: 0.8781
Epoch 25/50
1500/1500 [==============================] - 1s 523us/step - loss: 0.4261 - accuracy: 0.8783
Epoch 26/50
1500/1500 [==============================] - 1s 524us/step - loss: 0.4265 - accuracy: 0.8757
Epoch 27/50
1500/1500 [==============================] - 1s 533us/step - loss: 0.4262 - accuracy: 0.8786
Epoch 28/50
1500/1500 [==============================] - 1s 535us/step - loss: 0.4260 - accuracy: 0.8772
Epoch 29/50
1500/1500 [==============================] - 1s 527us/step - loss: 0.4263 - accuracy: 0.8767
Epoch 30/50
1500/1500 [==============================] - 1s 534us/step - loss: 0.4271 - accuracy: 0.8772
Epoch 31/50
1500/1500 [==============================] - 1s 535us/step - loss: 0.4266 - accuracy: 0.8785
Epoch 32/50
1500/1500 [==============================] - 1s 527us/step - loss: 0.4264 - accuracy: 0.8797
Epoch 33/50
1500/1500 [==============================] - 1s 535us/step - loss: 0.4260 - accuracy: 0.8764
Epoch 34/50
1500/1500 [==============================] - 1s 531us/step - loss: 0.4273 - accuracy: 0.8790
Epoch 35/50
1500/1500 [==============================] - 1s 537us/step - loss: 0.4267 - accuracy: 0.8783
Epoch 36/50
1500/1500 [==============================] - 1s 524us/step - loss: 0.4277 - accuracy: 0.8780
Epoch 37/50
1500/1500 [==============================] - 1s 530us/step - loss: 0.4262 - accuracy: 0.8780
Epoch 38/50
1500/1500 [==============================] - 1s 540us/step - loss: 0.4274 - accuracy: 0.8784
Epoch 39/50
1500/1500 [==============================] - 1s 520us/step - loss: 0.4272 - accuracy: 0.8779
Epoch 40/50
1500/1500 [==============================] - 1s 534us/step - loss: 0.4270 - accuracy: 0.8782
Epoch 41/50
1500/1500 [==============================] - 1s 533us/step - loss: 0.4268 - accuracy: 0.8784
Epoch 42/50
1500/1500 [==============================] - 1s 535us/step - loss: 0.4269 - accuracy: 0.8788
Epoch 43/50
1500/1500 [==============================] - 1s 526us/step - loss: 0.4271 - accuracy: 0.8773
Epoch 44/50
1500/1500 [==============================] - 1s 515us/step - loss: 0.4283 - accuracy: 0.8779
Epoch 45/50
1500/1500 [==============================] - 1s 529us/step - loss: 0.4275 - accuracy: 0.8777
Epoch 46/50
1500/1500 [==============================] - 1s 521us/step - loss: 0.4278 - accuracy: 0.8786
Epoch 47/50
1500/1500 [==============================] - 1s 536us/step - loss: 0.4283 - accuracy: 0.8789
Epoch 48/50
1500/1500 [==============================] - 1s 524us/step - loss: 0.4277 - accuracy: 0.8790
Epoch 49/50
1500/1500 [==============================] - 1s 529us/step - loss: 0.4285 - accuracy: 0.8771
Epoch 50/50
1500/1500 [==============================] - 1s 526us/step - loss: 0.4280 - accuracy: 0.8774
Out[34]:
<keras.callbacks.History at 0x10eff0441f0>
In [36]:
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 0s 465us/step - loss: 0.6306 - accuracy: 0.8421
Out[36]:
[0.630591094493866, 0.8420833349227905]
In [37]:
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 10) 7850
dense_1 (Dense) (None, 10) 110
=================================================================
Total params: 7,960
Trainable params: 7,960
Non-trainable params: 0
_________________________________________________________________
In [ ]:
728x90
반응형
'딥러닝' 카테고리의 다른 글
심플순환신경망(Simple_RNN (0) | 2024.01.05 |
---|---|
퍼셉트론_분류데이터사용 (0) | 2024.01.05 |
DNN_분류데이터사용 (0) | 2024.01.05 |
[딥러닝]심층신경망_훈련_및_성능향상 (0) | 2024.01.03 |
[딥러닝]신경망계층_추가방법_및_성능향상방법 (0) | 2024.01.03 |