728x90
반응형
In [83]:
"""
<합성곱신경망(CNN, Convolutional Neural Network)>
- 이미지 분석에 주로 사용되는 대표적 계층
- 기존의 인공신경망에서의 이미지 분석시에는 높이와 너비를 곱한 1차원을 사용했다면,
- CNN은 원형 그대로의 높이와 너비 차원을 사용함
- 전체 4차원의 데이터를 사용함
- 기존 이미지 분석 시 높이와 너비를 곱하여 사용하다 보면,
* 원형 그대로의 주변 이미지 공간 정보를 활용하지 못하는 단점이 있으며
* 이러한 이유로 특징 추출을 잘 못하여, 학습이 잘 이루어지지 않는 경우가 발생함
- 이러한 기존 인공신경망 모델의 단점을 보완하여 만들어진 모델이 CNN임
* 원형 형태의 이미지 정보를 그대로 유지한 상태로 학습 가능하도록 만들어졌음
* 이미지의 공간정보를 이용하여 특징을 추출함
* 인접 이미지의 특징을 포함하여 훈련됨
<합성곱 신경망 (CNN)의 계층 구조>
1. 입력 계층(Input Layer)
-데이터 입력계층 (기존과 동일)
2. 합성곱 계층(Convolutional Layer, CNN 계층)
- 이미지의 특징을 추출하는 합성곱 계층이 여러층으로 구성되어 있음
3. 활성화 함수 계층(은닉계층, Activation Layer)
- 합성곱 계층의 출력에 대한 비선형성 추가한 활성화 함수 Relu와 같은 함수 적용
4. 풀링 계층 (Pooling Layer)
- 공간 크기를 줄이고 계산량을 가속시키기 위한 계층(중요 특징만 추출하는 계층)
- 풀링 방법으로 최대 풀링(Max Pooling), 평균풀링(Average Pooling)이 있음
- 주로 Max Pooling 사용됨
5. 완전연결 계층 (은닉계층 ,Dense Layer)
- 추출된 특징을 이용하여 최종 예측을 수행하는 계층
- 이때는 기존의 방법과 동일하게 1차원 (높이 x 높이)의 전처리 계층(plattern)을 사용하는 경우도 있음(인공신경망 모델과 동일한 계층 구조로 진행)
6. 출력 계층(Output Layer)
- 최종 예측이 이루어지는 계층
***
CNN 에서 2~5번의 계층 구조가 일반적으로 사용됨,
-나머지 계층은 기존과 동일한 계층
- 2~5번의 CNN 계층은 여러개 추가가능
"""
Out[83]:
'\n<합성곱신경망(CNN, Convolutional Neural Network)>\n- 이미지 분석에 주로 사용되는 대표적 계층\n- 기존의 인공신경망에서의 이미지 분석시에는 높이와 너비를 곱한 1차원을 사용했다면, \n- CNN은 원형 그대로의 높이와 너비 차원을 사용함\n- 전체 4차원의 데이터를 사용함\n\n- 기존 이미지 분석 시 높이와 너비를 곱하여 사용하다 보면,\n* 원형 그대로의 주변 이미지 공간 정보를 활용하지 못하는 단점이 있으며\n* 이러한 이유로 특징 추출을 잘 못하여, 학습이 잘 이루어지지 않는 경우가 발생함\n\n- 이러한 기존 인공신경망 모델의 단점을 보완하여 만들어진 모델이 CNN임\n* 원형 형태의 이미지 정보를 그대로 유지한 상태로 학습 가능하도록 만들어졌음\n* 이미지의 공간정보를 이용하여 특징을 추출함\n* 인접 이미지의 특징을 포함하여 훈련됨\n\n<합성곱 신경망 (CNN)의 계층 구조>\n1. 입력 계층(Input Layer)\n -데이터 입력계층 (기존과 동일)\n\n2. 합성곱 계층(Convolutional Layer, CNN 계층)\n - 이미지의 특징을 추출하는 합성곱 계층이 여러층으로 구성되어 있음\n\n3. 활성화 함수 계층(은닉계층, Activation Layer)\n - 합성곱 계층의 출력에 대한 비선형성 추가한 활성화 함수 Relu와 같은 함수 적용\n\n4. 풀링 계층 (Pooling Layer)\n- 공간 크기를 줄이고 계산량을 가소시키기 위한 계층(중요 특징만 추출하는 계층)\n- 풀링 방법으로 최대 풀링(Max Pooling), 평균풀링(Average Pooling)이 있음\n- 주로 Max Pooling 사용됨\n\n5. 완전연결 계층 (은닉계층 ,Dense Layer)\n- 추출된 특징을 이용하여 최종 예측을 수행하는 계층\n- 이때는 기존의 방법과 동일하게 1차원 (높이 x 높이)의 전처리 계층(plattern)을 사용하는 경우도 있음(인공신경망 모델과 동일한 계층 구조로 진행)\n\n6. 출력 계층(Output Layer)\n- 최종 예측이 이루어지는 계층\n\n*** CNN 에서 2~5번의 계층 구조가 일반적으로 사용됨,\n -나머지 계층은 기존과 동일한 계층\n - 2~5번의 CNN 계층은 여러개 추가가능\n'
라이브러리¶
In [84]:
import tensorflow as tf
from tensorflow import keras
In [85]:
"""페션 데이터 셋"""
keras.datasets.fashion_mnist.load_data()
Out[85]:
((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],
[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],
[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),
array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)),
(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],
[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],
[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),
array([9, 2, 1, ..., 8, 1, 5], dtype=uint8)))
In [86]:
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
train_input.shape, train_target.shape, test_input.shape, test_target.shape
Out[86]:
((60000, 28, 28), (60000,), (10000, 28, 28), (10000,))
In [87]:
"""
* CNN에서 사용하는 차원은 4차원
- (행, 높이, 너비, 채널)
- 채널 =1 또는 3 (1은 흑백, 3은 컬러(RGB)라고 보통 칭합니다.)
"""
train_input_4d = train_input.reshape(-1, 28, 28,1)
train_input_4d.shape
Out[87]:
(60000, 28, 28, 1)
In [88]:
len(train_input_4d[0][0][0]), train_input_4d[0][0]
Out[88]:
(1,
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]], dtype=uint8))
정규화¶
In [89]:
"""픽셀 데이터 정규화 """
train_scaled = train_input_4d / 255.0
train_scaled.shape, train_scaled[0][18]
Out[89]:
((60000, 28, 28, 1),
array([[0.01176471],
[0.79215686],
[0.89411765],
[0.87843137],
[0.86666667],
[0.82745098],
[0.82745098],
[0.83921569],
[0.80392157],
[0.80392157],
[0.80392157],
[0.8627451 ],
[0.94117647],
[0.31372549],
[0.58823529],
[1. ],
[0.89803922],
[0.86666667],
[0.7372549 ],
[0.60392157],
[0.74901961],
[0.82352941],
[0.8 ],
[0.81960784],
[0.87058824],
[0.89411765],
[0.88235294],
[0. ]]))
훈련 및 검증 데이터로 분리하기 -> 8:2¶
In [90]:
from sklearn.model_selection import train_test_split
In [233]:
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)
(30720, 28, 28, 1) (30720,)
(7680, 28, 28, 1) (7680,)
(10000, 28, 28) (7680,)
In [93]:
test_input.shape, test_target.shape
Out[93]:
((10000, 28, 28), (10000,))
합성곱신경망(CNN) 훈련¶
In [103]:
"""모델 생성하기"""
model = keras.Sequential()
model
Out[103]:
<keras.engine.sequential.Sequential at 0x1f1bb8426a0>
In [104]:
"""계층 추가하기"""
"""CNN(입력 계층으로 추가)
- 데이터와 필터(filter)가 곱해진다고 해서 합성곱이라는 단어가 붙었음
- 이미지와 같은 2차원 데이터 분류에는 보통 2차원 합성곱(Conv2D)이 사용됨.
- 입력 계층으로 사용하는 경우에는 input_shape의 입력 차원 속성을 함께 사용."""
"""<CNN>
<kernel_size>
- 이미지를 훓으면서 특징을 추출하는 역할을 수행
- 필터가 사용할 사이즈를 정의함
- kernel_size=3 -> 필터가 사용할 사이즈 3행 3열을 의미함(3x3을 줄여서 3이라고 칭함)
- 커널 사이즈는 홀수로 정의함(3,5 가 주로 사용됨)
<filters>
- 커널 사이즈의 행렬의 공간 1개에 대한 필터의 갯수 정의
- 데이터를 훓으면서 특징을 감지함
- 필터의 값이 클수록 훈련 속도가 오래걸림
- 보통 32,64 가 주로 사용됨
- CNN계층을 여러개 사용하는 경우에는 처음 CNN 계층에는 작은 값부터 시작
-> 16,32,64, 128 정도가 주로 사용됨
<padding>
- 경계 처리 방식을 정의함
- 입력 데이터의 주변에 추가되는 가상의 공간을 만들 수 있음
- 처리 방식: same 과 valid가 있음
* same : 패딩을 사용하여 입력과 출력의 크기를 동일하게 만들어서 훈련하고자 할 때 사용
: 주로 권장되는 방식
* valid: 패딩을 사용하지 않음을 의미함
<strides>
- 커널이 이미지 데이터를 훓을때(특징 추출 시)의 스탭을 정의함
- 커널이 데이터 특징 추출 순서(행렬을 기준으로)
-> 왼쪽 상단에서 시작하여 오른쪽으로 이동하는 스탭 정의
-> 오른쪽 열을 다 훓고 난 다음 나래로 이동하는 스탭 정의
-strides=1: 오른쪽으로 1씩 이동, 아래로 1씩 이동을 의미
"""
model.add(keras.layers.Conv2D(kernel_size=3, filters=32, activation="relu", padding="same", strides=1, input_shape=(28,28,1)))
In [105]:
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_2 (Conv2D) (None, 28, 28, 32) 320
=================================================================
Total params: 320
Trainable params: 320
Non-trainable params: 0
_________________________________________________________________
풀링레이어(Pooling Layer) 계층 추가하기¶
In [106]:
"""풀링 레이어 (pooling layer)
- cnn 계층 추가 이후에 일반적으로 사용되는 계층
- cnn 계층에서 추출된 특징들 중에 중요한 정보만을 추출하는 계층
- 머신러닝에서 주성분 분석(PCA)과 유사한 개념
- 이미지를 구성하는 픽셀들이, 주변 픽셀들 끼리는 유사한 정보를 가진다는 개념에서 중복된 값들이나 유사한 값들을 대표하는 값들 , 즉 중요한 특징들만 추출하게 됩니다.
- 과적합 방지에 효율적으로 사용되며
- 훈련 성능에 영향을 미치지 않는 전처리 계층임
* MaxPool2D
- 사소한 값들은 무시하고 최대값의 특징들만 추출하는 방식
- pool_size = 2: 2행 2열의 공간에 중요 특징들만 저장하라는 의미
- strides = 2 : CNN에서 추출한 특징값들의 행렬을 오른쪽 2칸씩, 아래로 2칸씩 이동하면서 : 중요 특징값 추출하라는 의미
- 풀링에서 가장 대표적으로 사용되는 방식임
"""
model.add(keras.layers.MaxPool2D(pool_size=2, strides=2))
CNN 계층 추가해보기¶
In [107]:
model.add(keras.layers.Conv2D(kernel_size=3,
filters=64,
activation="relu",
padding="same",
strides=1,
))
In [108]:
model.add(keras.layers.MaxPool2D(pool_size=2, strides=2))
In [109]:
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_2 (Conv2D) (None, 28, 28, 32) 320
max_pooling2d_1 (MaxPooling (None, 14, 14, 32) 0
2D)
conv2d_3 (Conv2D) (None, 14, 14, 64) 18496
max_pooling2d_2 (MaxPooling (None, 7, 7, 64) 0
2D)
=================================================================
Total params: 18,816
Trainable params: 18,816
Non-trainable params: 0
_________________________________________________________________
인공신경망 계층 추가(전처리 또는 은닉계층 + 출력계층)¶
In [114]:
"""(전처리 계층) 예측을 위해 중요 특징 데이터를 1차원 (높이 * 너비)로 변환하기"""
model.add(keras.layers.Flatten())
In [115]:
"""은닉계층 추가
-활성화 함수 추가됨
"""
model.add(keras.layers.Dense(100, activation="relu"))
In [117]:
"""(전처리 계층) 드롭아웃도 적용"""
model.add(keras.layers.Dropout(0.2))
"""모델 계층 추가"""
model.add(keras.layers.Dense(10, activation="softmax"))
훈련계층을 이미지로 시각화 해보기¶
In [119]:
from tensorflow.keras.utils import plot_model
In [120]:
plot_model(model)
Out[120]:
In [121]:
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_2 (Conv2D) (None, 28, 28, 32) 320
max_pooling2d_1 (MaxPooling (None, 14, 14, 32) 0
2D)
conv2d_3 (Conv2D) (None, 14, 14, 64) 18496
max_pooling2d_2 (MaxPooling (None, 7, 7, 64) 0
2D)
flatten (Flatten) (None, 3136) 0
dense (Dense) (None, 100) 313700
dropout (Dropout) (None, 100) 0
dense_1 (Dense) (None, 10) 1010
=================================================================
Total params: 333,526
Trainable params: 333,526
Non-trainable params: 0
_________________________________________________________________
In [126]:
"""
계층 모델 속성 정의하여 시각화및 저장시키기
- show_shapes : 층의 형태를 세부적으로 표현 (기본값은 False)
- dpi : 이미지 해상도
"""
plot_model(model, show_shapes=True,
to_file="./model_img/CNN_Layer.png",
dpi=300)
Out[126]:
모델 설정하기¶
In [127]:
"""옵티마이저 adam"""
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
콜백함수 만들기 (자동저장, 자동종료)¶
In [128]:
checkpoint_cb = keras.callbacks.ModelCheckpoint("./model/model.best_CNN_Model.h5")
early_stopping_cb =keras.callbacks.EarlyStopping(patience=2, restore_best_weights=True)
훈련시키기¶
In [129]:
"""훈련 20회만 수행한 후 손실 곡선과 정확도 곡선 시각화해주세요"""
Out[129]:
'훈련 20회만 수행한 후 손실 곡선과 정확도 곡선 시각화해주세요'
In [132]:
history= model.fit(train_scaled, train_target, validation_data=(val_scaled, val_target), batch_size=64, epochs=20, callbacks=[checkpoint_cb, early_stopping_cb])
Epoch 1/20
750/750 [==============================] - 19s 26ms/step - loss: 0.3148 - accuracy: 0.8862 - val_loss: 0.2737 - val_accuracy: 0.8988
Epoch 2/20
750/750 [==============================] - 19s 25ms/step - loss: 0.2795 - accuracy: 0.8982 - val_loss: 0.2599 - val_accuracy: 0.9039
Epoch 3/20
750/750 [==============================] - 18s 24ms/step - loss: 0.2526 - accuracy: 0.9069 - val_loss: 0.2451 - val_accuracy: 0.9119
Epoch 4/20
750/750 [==============================] - 18s 24ms/step - loss: 0.2302 - accuracy: 0.9165 - val_loss: 0.2357 - val_accuracy: 0.9148
Epoch 5/20
750/750 [==============================] - 18s 24ms/step - loss: 0.2096 - accuracy: 0.9223 - val_loss: 0.2361 - val_accuracy: 0.9111
Epoch 6/20
750/750 [==============================] - 19s 25ms/step - loss: 0.1911 - accuracy: 0.9300 - val_loss: 0.2180 - val_accuracy: 0.9208
Epoch 7/20
750/750 [==============================] - 18s 24ms/step - loss: 0.1740 - accuracy: 0.9344 - val_loss: 0.2220 - val_accuracy: 0.9194
Epoch 8/20
750/750 [==============================] - 18s 24ms/step - loss: 0.1594 - accuracy: 0.9398 - val_loss: 0.2194 - val_accuracy: 0.9215
In [136]:
import matplotlib.pyplot as plt
In [149]:
"""손실 시각화 """
plt.title("CNN Train vs Val loss")
plt.plot(history.epoch, history.history["loss"])
plt.plot(history.epoch, history.history["val_loss"])
plt.legend(["loss","val_loss"])
plt.xlabel("epoch")
plt.ylabel("loss")
plt.grid()
plt.show()
In [148]:
""" 정확도 시각화 """
plt.title("CNN Train vs Val Accuracy")
plt.plot(history.epoch, history.history["accuracy"])
plt.plot(history.epoch, history.history["val_accuracy"])
plt.legend(["accuarcy","val_accuracy"])
plt.xlabel("epoch")
plt.ylabel("accuracy")
plt.grid()
plt.show()
훈련 및 검증 데이터 모델 성능 검증결과 확인¶
In [150]:
train_eval = model.evaluate(train_scaled, train_target)
val_evel = model.evaluate(val_scaled, val_target)
train_eval, val_evel
1500/1500 [==============================] - 5s 3ms/step - loss: 0.1527 - accuracy: 0.9476
375/375 [==============================] - 1s 3ms/step - loss: 0.2180 - accuracy: 0.9208
Out[150]:
([0.15270528197288513, 0.9476041793823242],
[0.2179737538099289, 0.9207500219345093])
훈련에 사용된 데이터를 이미지로 그려보기¶
In [158]:
val_scaled[0].shape # 높이 너비 갯수
Out[158]:
(28, 28, 1)
In [157]:
""" 이미지 데이터는 2차원으로 줄여서 그려야 합니다."""
val_scaled_0= val_scaled[0].reshape(28,28)
val_scaled_0.shape
Out[157]:
(28, 28)
In [171]:
"""이미지 한개 그려보기"""
plt.imshow(val_scaled_0, cmap="BuPu")
plt.show()
In [165]:
"""검증데이터 0번째 이미지의 정답번호는 8번"""
val_target[0]
Out[165]:
8
예측하기¶
In [174]:
val_scaled[0]
Out[174]:
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.00784314],
[0.01568627],
[0. ],
[0. ],
[0.57647059],
[0.49019608],
[0.41568627],
[0.44313725],
[0.10588235],
[0. ],
[0.00392157],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ]],
[[0. ],
[0. ],
[0. ],
[0. ],
[0.00392157],
[0.00392157],
[0. ],
[0. ],
[0. ],
[0.01176471],
[0. ],
[0.10588235],
[0.77647059],
[0.23137255],
[0. ],
[0. ],
[0.0627451 ],
[0.48627451],
[0.15686275],
[0. ],
[0.00784314],
[0.00392157],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ]],
[[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0.00392157],
[0.00784314],
[0. ],
[0.00784314],
[0. ],
[0.67843137],
[0.19607843],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0.5372549 ],
[0. ],
[0. ],
[0. ],
[0.00392157],
[0.00392157],
[0. ],
[0. ],
[0.00392157],
[0. ]],
[[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0.00392157],
[0. ],
[0. ],
[0.01176471],
[0.54901961],
[0. ],
[0. ],
[0. ],
[0. ],
[0.03921569],
[0. ],
[0.39607843],
[0.17647059],
[0. ],
[0.01568627],
[0. ],
[0. ],
[0.00392157],
[0.00392157],
[0. ],
[0. ]],
[[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0.00392157],
[0. ],
[0. ],
[0.01568627],
[0. ],
[0.11372549],
[0.56862745],
[0. ],
[0. ],
[0.00784314],
[0.00784314],
[0.01176471],
[0. ],
[0.16862745],
[0.39607843],
[0. ],
[0.02745098],
[0. ],
[0. ],
[0. ],
[0.00392157],
[0. ],
[0. ]],
[[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0.00784314],
[0. ],
[0.41176471],
[0.54509804],
[0. ],
[0. ],
[0. ],
[0. ],
[0.00392157],
[0. ],
[0.02745098],
[0.60784314],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ]],
[[0. ],
[0. ],
[0.00392157],
[0.01176471],
[0.01960784],
[0. ],
[0.00392157],
[0.00784314],
[0. ],
[0. ],
[0.72156863],
[0.49019608],
[0. ],
[0.01176471],
[0.00392157],
[0.00784314],
[0.01568627],
[0. ],
[0. ],
[0.56470588],
[0.03137255],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0.01176471],
[0.00392157]],
[[0. ],
[0.00392157],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0.90588235],
[0.17254902],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0.59607843],
[0.14117647],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ]],
[[0. ],
[0. ],
[0. ],
[0.38823529],
[0.38823529],
[0.32156863],
[0.32941176],
[0.3254902 ],
[0.23137255],
[0.29411765],
[0.81176471],
[0.26666667],
[0.14509804],
[0.23921569],
[0.23921569],
[0.24705882],
[0.23921569],
[0.23137255],
[0.21176471],
[0.71764706],
[0.43921569],
[0.21176471],
[0.39607843],
[0.42352941],
[0.36078431],
[0.29019608],
[0.40784314],
[0.2627451 ]],
[[0.01568627],
[0. ],
[0.03921569],
[0.70588235],
[0.73333333],
[0.70196078],
[0.69019608],
[0.76078431],
[0.71764706],
[0.63137255],
[0.58431373],
[0.58823529],
[0.6627451 ],
[0.69019608],
[0.70980392],
[0.72156863],
[0.71372549],
[0.6745098 ],
[0.7372549 ],
[0.65490196],
[0.63921569],
[0.65882353],
[0.72941176],
[0.7254902 ],
[0.6627451 ],
[0.61176471],
[0.62745098],
[0.22352941]],
[[0. ],
[0. ],
[0.00784314],
[0.32156863],
[0.68235294],
[0.63529412],
[0.63529412],
[0.52941176],
[0.58431373],
[0.61176471],
[0.5372549 ],
[0.54117647],
[0.50196078],
[0.50980392],
[0.5254902 ],
[0.5372549 ],
[0.54117647],
[0.53333333],
[0.56470588],
[0.59215686],
[0.53333333],
[0.58039216],
[0.56078431],
[0.65490196],
[0.60784314],
[0.56078431],
[0.61960784],
[0. ]],
[[0. ],
[0.16078431],
[0.65490196],
[0.05882353],
[0.85098039],
[0.63921569],
[0.6627451 ],
[0.58431373],
[0.6 ],
[0.57647059],
[0.51372549],
[0.6 ],
[0.57647059],
[0.54117647],
[0.5254902 ],
[0.52156863],
[0.55294118],
[0.56862745],
[0.59215686],
[0.6 ],
[0.45098039],
[0.62352941],
[0.58823529],
[0.69803922],
[0.63137255],
[0.57647059],
[0.6627451 ],
[0. ]],
[[0. ],
[0.78823529],
[1. ],
[0. ],
[0.86666667],
[0.63137255],
[0.63921569],
[0.61176471],
[0.6 ],
[0.65098039],
[0.63921569],
[0.55686275],
[0.56078431],
[0.54117647],
[0.50588235],
[0.49803922],
[0.54117647],
[0.57254902],
[0.6 ],
[0.65098039],
[0.61960784],
[0.56862745],
[0.58431373],
[0.69019608],
[0.63529412],
[0.56470588],
[0.61568627],
[0. ]],
[[0. ],
[0.85098039],
[0.47058824],
[0. ],
[0.88235294],
[0.64313725],
[0.61568627],
[0.61176471],
[0.60392157],
[0.63921569],
[0.67058824],
[0.57254902],
[0.58823529],
[0.59215686],
[0.58823529],
[0.59607843],
[0.59607843],
[0.60392157],
[0.58823529],
[0.61568627],
[0.66666667],
[0.62745098],
[0.63137255],
[0.70980392],
[0.67058824],
[0.58039216],
[0.58431373],
[0. ]],
[[0.20784314],
[0.91764706],
[0.03137255],
[0. ],
[0.88627451],
[0.68627451],
[0.58823529],
[0.59215686],
[0.62745098],
[0.62352941],
[0.62745098],
[0.62745098],
[0.61568627],
[0.61568627],
[0.60784314],
[0.60392157],
[0.60392157],
[0.61568627],
[0.62745098],
[0.64705882],
[0.63921569],
[0.6627451 ],
[0.62745098],
[0.69411765],
[0.68235294],
[0.58039216],
[0.52941176],
[0. ]],
[[0.45882353],
[0.96470588],
[0. ],
[0. ],
[0.82745098],
[0.71764706],
[0.58039216],
[0.57647059],
[0.63921569],
[0.63137255],
[0.63529412],
[0.62745098],
[0.62352941],
[0.63529412],
[0.61568627],
[0.6 ],
[0.61568627],
[0.63529412],
[0.63137255],
[0.63137255],
[0.64705882],
[0.65490196],
[0.63529412],
[0.69411765],
[0.70588235],
[0.61568627],
[0.43137255],
[0. ]],
[[0.57647059],
[0.67843137],
[0. ],
[0. ],
[0.78823529],
[0.7372549 ],
[0.58039216],
[0.56078431],
[0.63921569],
[0.63921569],
[0.63921569],
[0.63529412],
[0.63137255],
[0.63529412],
[0.63921569],
[0.64313725],
[0.63921569],
[0.63137255],
[0.63137255],
[0.63529412],
[0.64313725],
[0.64705882],
[0.63921569],
[0.69411765],
[0.69411765],
[0.67843137],
[0.29803922],
[0. ]],
[[0.58823529],
[0.61568627],
[0. ],
[0. ],
[0.74901961],
[0.74509804],
[0.55294118],
[0.59215686],
[0.63529412],
[0.63529412],
[0.63921569],
[0.64313725],
[0.63529412],
[0.63529412],
[0.64313725],
[0.64705882],
[0.64705882],
[0.63921569],
[0.64313725],
[0.64705882],
[0.64705882],
[0.64705882],
[0.65490196],
[0.67058824],
[0.70196078],
[0.70980392],
[0.17254902],
[0. ]],
[[0.52941176],
[0.58823529],
[0. ],
[0. ],
[0.60392157],
[0.76470588],
[0.52156863],
[0.59607843],
[0.64313725],
[0.63921569],
[0.65098039],
[0.65490196],
[0.64705882],
[0.65882353],
[0.65490196],
[0.65098039],
[0.65490196],
[0.65882353],
[0.65098039],
[0.65490196],
[0.65490196],
[0.65882353],
[0.65490196],
[0.65490196],
[0.72156863],
[0.6627451 ],
[0.09019608],
[0. ]],
[[0.26666667],
[0.7372549 ],
[0. ],
[0. ],
[0.49411765],
[0.90980392],
[0.51372549],
[0.62745098],
[0.65098039],
[0.65490196],
[0.64313725],
[0.65098039],
[0.65490196],
[0.65098039],
[0.65098039],
[0.63529412],
[0.65098039],
[0.65490196],
[0.65490196],
[0.65490196],
[0.6627451 ],
[0.6627451 ],
[0.64705882],
[0.64705882],
[0.72941176],
[0.65098039],
[0. ],
[0. ]],
[[0. ],
[0.61568627],
[0.30588235],
[0. ],
[0.09803922],
[0.89411765],
[0.52156863],
[0.62352941],
[0.68627451],
[0.67843137],
[0.66666667],
[0.69411765],
[0.6745098 ],
[0.65490196],
[0.67058824],
[0.65098039],
[0.6627451 ],
[0.64313725],
[0.65882353],
[0.65490196],
[0.65882353],
[0.65490196],
[0.68627451],
[0.61568627],
[0.75686275],
[0.51764706],
[0. ],
[0. ]],
[[0. ],
[0. ],
[0.43921569],
[0.24705882],
[0.50588235],
[0.90196078],
[0.57254902],
[0.65490196],
[0.66666667],
[0.65490196],
[0.68235294],
[0.6627451 ],
[0.67843137],
[0.6745098 ],
[0.61568627],
[0.63921569],
[0.61568627],
[0.64313725],
[0.63137255],
[0.63529412],
[0.63921569],
[0.63529412],
[0.64313725],
[0.62745098],
[0.77254902],
[0.43921569],
[0. ],
[0. ]],
[[0. ],
[0. ],
[0.34901961],
[0.71764706],
[0.72941176],
[0.78823529],
[0.74117647],
[0.83137255],
[0.85882353],
[0.90588235],
[0.91372549],
[0.89019608],
[0.85490196],
[0.76470588],
[0.70588235],
[0.6745098 ],
[0.67843137],
[0.66666667],
[0.65490196],
[0.65882353],
[0.66666667],
[0.66666667],
[0.67843137],
[0.69803922],
[0.85098039],
[0.30980392],
[0. ],
[0.00392157]],
[[0.00784314],
[0. ],
[0.43921569],
[0.60784314],
[0.47058824],
[0.45882353],
[0.37254902],
[0.33333333],
[0.31372549],
[0.28627451],
[0.3372549 ],
[0.39607843],
[0.2745098 ],
[0.62352941],
[0.96862745],
[0.90980392],
[0.88627451],
[0.88235294],
[0.8627451 ],
[0.82352941],
[0.76862745],
[0.7254902 ],
[0.72156863],
[0.79607843],
[0.56078431],
[0. ],
[0. ],
[0.00392157]],
[[0.00784314],
[0. ],
[0.08235294],
[0.39607843],
[0.43137255],
[0.47843137],
[0.58039216],
[0.65882353],
[0.72156863],
[0.75686275],
[0.72941176],
[0.71764706],
[0.88235294],
[0.16862745],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0. ],
[0.00392157],
[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. ]]])
In [226]:
"""검증데이터 0번째 데이터를 이용해서 예측해보기
- 예측 결과값은 모델 출력계층의 출력 크기 (갯수)만큼 확률값으로 반환해 줍니다.
- 반환된 확률 값 중 가장 큰 값의 인덱스 번호가 종속변수 값이 됩니다.
"""
import numpy as np
# adf= np.argmax(len(val_scaled[0]))
preds= model.predict(val_scaled[0:1])
preds
Out[226]:
array([[1.7726752e-13, 6.2015540e-20, 2.6471639e-13, 9.4508548e-15,
1.6554157e-13, 1.8074347e-13, 3.1339030e-14, 5.7521147e-14,
1.0000000e+00, 4.0857624e-16]], dtype=float32)
In [227]:
plt.bar(range(10), preds[0])
plt.xlabel(range(10))
plt.grid()
plt.show()
In [228]:
"""범주 명칭"""
classes = ["티셔츠", "바지", "스웨터", "드레스", "코트", "샌달", "셔츠", "스니커즈", "가방", "앵클부츠"]
classes
Out[228]:
['티셔츠', '바지', '스웨터', '드레스', '코트', '샌달', '셔츠', '스니커즈', '가방', '앵클부츠']
In [229]:
import numpy as np
In [230]:
print (np.argmax(preds))
print("예측 값 : ", classes[np.argmax(preds)])
print("실제 값 : ", classes[val_target[0]])
8
예측 값 : 가방
실제 값 : 가방
In [231]:
"""테스트 데이터를 이요해서 예측한 후,
- 예측 결과 중 10개만 추출하여,
-> 실제이미지 출력, 예측값 , 실제값을 각각 출력해 주세요...
"""
Out[231]:
'테스트 데이터를 이요해서 예측한 후,\n- 예측 결과 중 10개만 추출하여,\n -> 실제이미지 출력, 예측값 , 실제값을 각각 출력해 주세요...\n \n'
In [234]:
"""
* CNN에서 사용하는 차원은 4차원
- (행, 높이, 너비, 채널)
- 채널 =1 또는 3 (1은 흑백, 3은 컬러(RGB)라고 보통 칭합니다.)
"""
test_input_4d = test_input.reshape(-1, 28, 28,1)
test_input_4d.shape
"""픽셀 데이터 정규화 """
test_scaled = test_input_4d / 255.0
test_scaled.shape, test_input_4d[0][18]
Out[234]:
((10000, 28, 28, 1),
array([[ 0],
[ 68],
[ 94],
[ 90],
[111],
[114],
[111],
[114],
[115],
[127],
[135],
[136],
[143],
[126],
[127],
[151],
[154],
[143],
[148],
[125],
[162],
[162],
[144],
[138],
[153],
[162],
[196],
[ 58]], dtype=uint8))
In [258]:
test_pred= model.predict(test_scaled[0:10])
In [264]:
len(test_pred)
Out[264]:
10
In [313]:
fig, axs = plt.subplots(5, 2, figsize=(12, 15))
for i in range(10):
# 예측값 배열에서 각 클래스에 해당하는 예측 확률을 가져옵니다.
pred_probabilities = test_pred[i]
# 두 개의 서브플롯을 가진 플롯을 생성합니다.
axs[i//2, i%2].bar(range(10), pred_probabilities)
axs[i//2, i%2].set_title(f'Sample {i+1} Predictions (Bar Plot)')
plt.tight_layout()
plt.show()
In [277]:
for i in range(10):
print (np.argmax(test_pred[i]))
print("예측 값 : ", classes[np.argmax(test_pred[i])])
print("실제 값 : ", classes[test_target[i]])
9
예측 값 : 앵클부츠
실제 값 : 앵클부츠
2
예측 값 : 스웨터
실제 값 : 스웨터
1
예측 값 : 바지
실제 값 : 바지
1
예측 값 : 바지
실제 값 : 바지
6
예측 값 : 셔츠
실제 값 : 셔츠
1
예측 값 : 바지
실제 값 : 바지
4
예측 값 : 코트
실제 값 : 코트
6
예측 값 : 셔츠
실제 값 : 셔츠
5
예측 값 : 샌달
실제 값 : 샌달
7
예측 값 : 스니커즈
실제 값 : 스니커즈
In [318]:
""" 이미지 데이터는 2차원으로 줄여서 그려야 합니다."""
for i in range(10):
test_scaled_0= test_scaled[i].reshape(28,28)
test_scaled_0.shape
"""이미지 한개 그려보기"""
plt.imshow(test_scaled_0, cmap="bone_r")
plt.show()
print (np.argmax(test_pred[i]))
print("예측 값 : ", classes[np.argmax(test_pred[i])])
print("실제 값 : ", classes[test_target[i]])
9
예측 값 : 앵클부츠
실제 값 : 앵클부츠
2
예측 값 : 스웨터
실제 값 : 스웨터
1
예측 값 : 바지
실제 값 : 바지
1
예측 값 : 바지
실제 값 : 바지
6
예측 값 : 셔츠
실제 값 : 셔츠
1
예측 값 : 바지
실제 값 : 바지
4
예측 값 : 코트
실제 값 : 코트
6
예측 값 : 셔츠
실제 값 : 셔츠
5
예측 값 : 샌달
실제 값 : 샌달
7
예측 값 : 스니커즈
실제 값 : 스니커즈
In [317]:
test_scaled.reshape(-1,28,28)
Out[317]:
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.],
[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.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]])
In [ ]:
728x90
반응형
'딥러닝' 카테고리의 다른 글
YOLO_설치_및_객체탐지 (0) | 2024.01.10 |
---|---|
LSTM_GRU (1) | 2024.01.08 |
RNN 응용 규칙기반 챗봇 (2) | 2024.01.08 |
심플순환신경망(Simple_RNN (2) | 2024.01.05 |
퍼셉트론_분류데이터사용 (0) | 2024.01.05 |