-
[CHAPTER 15] 딥러닝 | TensorFlowDeep Learning/인공지능 입문 코딩 2021. 6. 16. 23:10728x90
인간은 어떻게 생각하나?
뉴런의 구조 Dendrite : 이웃 뉴런에서 전기 신호를 받는다.
Synapse : 다른 뉴런과 Dendrite의 연결 부위에 있다. 전기 신호의 세기를 재조정한다.
Cell body(Soma) : Dendrite로부터 받은 여러 전기신호들을 모두 합친다.
Axon : Soma의 전위가 일정 이상이 되면 이웃 뉴런으로 전기 신호를 보낸다.
인간의 뇌는 뉴런이라는 수없이 많은 신경세포가 다른 신경세포와 연결되어 있고, 뉴런들 끼리 화학적 신호를 주고 받는다. 이러한 뉴런이 1000억개 가량 있다고 한다.
인간의 뇌를 모방하여 만든 알고리즘이 바로 퍼셉트론이다.
퍼셉트론에 대해 따로 정리해 놓은 글이다.
https://pintelligence.tistory.com/2?category=932370
퍼셉트론
인간은 어떻게 생각하나? Dendrite : 이웃 뉴런에서 전기 신호를 받는다. Synapse : 다른 뉴런과 Dendrite의 연결 부위에 있다. 전기 신호의 세기를 재조정한다. Cell body(Soma) : Dendrite로부터 받은 여러 전..
pintelligence.tistory.com
퍼셉트론이 하나의 신경세포를 흉내내는 것이라면 더욱 복잡하게 층을 만들면 그것이 딥러닝(deep learning) 개념의 시작이다.
인공 신경망
간단한 인공 신경망을 살펴보자.
x : 입력, 두 개의 입력이 있다.
w : 가중치, 신호의 세기를 조정한다. 뉴런의 synapse에 해당한다.
a = x1w1 + x2w2
h : 활성화 함수
y : 출력
활성화 함수는 출력 노드에 모아진 신호를 다음으로 내어 보낼때 얼마나 강하게 보낼지를 결정하는 함수이다.
뉴런의 axon에 해당한다고 볼 수 있다.
활성화 함수에는 heaviside, sigmoid, relu 등의 함수가 있다.
활성화 함수마다 장단점이 있을것 같다. 나중에 더 깊이 알아보고 싶다.
heaviside sigmoid relu heaviside 함수를 쓸 경우 수식으로 나타내면 아래와 같다.
활성화 함수에는 softmax 함수도 있는데 이 함수는 최종 출력단에 적합한 활성화 함수이다. 출력이 여러개가 있을 때 출력 노드의 합이 1이 되도록 하는 함수이다.
TensorFlow
텐서플로우(TensorFlow)는 머신러닝과 딥러닝을 위한 오픈소스 플랫폼이다.
구글에서 개발하여 내부적으로 사용하다가 2015년에 오픈소스로 공개되어 현재 2 버전으로 발전하였다.
Fashion MNIST 데이터
Fashion MNIST 데이터는 운동화, 옷, 신발같은 이미지와 이 이미지에 대한 레이블을 제공한다.
kearas.dataset.fashion_mnist 모듈을 통해 얻을 수 있다.
# tensorflow와 tf.keras를 임포트한다 import tensorflow as tf from tensorflow import keras import numpy as np import matplotlib.pyplot as plt # 패션 MNIST 데이터는 keras의 데이터셋에 있는데 이를 읽어와서 학습용, 테스트 데이터로 구분 fashion_mnist = keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
train_imges, test_images 등 데이터의 형태가 어떤식으로 생겼는지 알아보자.
print(train_images.shape) # 학습 이미지의 형태와 레이블을 출력한다 print(train_labels) print(test_images.shape)
(60000, 28, 28)
[9 0 0 ... 3 0 5]
(10000, 28, 28)train_images는 6만 장의 이미지가 28 x 28 형태로 있다.
test_images는 1만 장의 이미지가 28 x 28 형태로 있다.
레이블에는 0~9 까지의 숫자가 있다.
0: 티셔츠
1: 바지
2: 풀어보 상의
3: 드레스
4: 외투
5: 샌달
6: 셔츠
7: 스니커 운동화
8: 가방
9: 발목 부츠
처음 3개의 이미지와 레이블을 출력해 보자.
fig = plt.figure() ax1 = fig.add_subplot(1, 3, 1) ax2 = fig.add_subplot(1, 3, 2) ax3 = fig.add_subplot(1, 3, 3) ax1.imshow(train_images[0]) # 첫 번째 훈련용 데이터 ax2.imshow(train_images[1]) # 두 번째 훈련용 데이터 ax3.imshow(train_images[2]) # 세 번째 훈련용 데이터 plt.show() print(train_labels[:3])
[9 0 0] 인공신경망
모델 생성
keras.Sequential을 이용하여 인공 신경망을 만들 수 있다.
model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(128, activation='relu'), keras.layers.Dense(10, activation='softmax') ])
첫번 째 층은 Flatten, 입력을 1차원 배열로 변경한다. 입력의 차원은 (28, 28)로 지정했다.
두번 째 층은 Dense, 앞의 층에서 값을 받아 128개로 출력하고 활성화 함수는 'relu'를 사용한다.
세번 째 층은 Dense, 앞의 층에서 값을 받아 10개로 출력하고 활성화 함수는 'softmax'를 사용한다.
즉 (28, 28)형태의 이미지를 784크기의 형태로 변환하여 10개의 출력으로 확률을 나타내 준다.
10개의 출력은 0일 확률 , 1일 확률, 2일 확률 ... 9일 확률의 10개의 값이다.
학습
모델을 학습 시켜보자.
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
모델을 점점 더 좋은 상태로 만드는 것을 최적화(optimizer)라고 한다. 여러 optimizer중 'adam'이라는 것을 사용한다.
오차를 측정하는 함수 중 'sparese_categorical_crossentropy'함수를 사용한다.
fit() 함수를 사용하여 학습시킨다.
model.fit(train_images, train_labels, epochs=5)
Epoch 1/5
1875/1875 [==============================] - 4s 2ms/step - loss: 8.7043 - accuracy: 0.6566
Epoch 2/5
1875/1875 [==============================] - 3s 2ms/step - loss: 0.6601 - accuracy: 0.7612
Epoch 3/5
1875/1875 [==============================] - 3s 2ms/step - loss: 0.5456 - accuracy: 0.8094
Epoch 4/5
1875/1875 [==============================] - 3s 2ms/step - loss: 0.5065 - accuracy: 0.8232
Epoch 5/5
1875/1875 [==============================] - 3s 2ms/step - loss: 0.5034 - accuracy: 0.8281훈련 데이터와 정답 데이터를 주고 학습을 한다.
훈련 데이터 모음을 가지고 한 번 훈련을 실시하는 것을 에폭(epoch)이라고 부른다.
학습을 할 수록 오차값이 줄어들고 정확도가 올라간다.
테스트
학습된 모델을 가지고 테스트를 해보자.
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2) print('\n테스트 정확도:', test_acc)
313/313 - 0s - loss: 0.5115 - accuracy: 0.8290
테스트 정확도: 0.8289999961853027정확도는 82%정도가 나왔다.
예측
test_images에서 150번 째 이미지를 인공신경망에 입력하여 잘 예측하는지 보자.
plt.imshow(test_images[160])
print('label :', test_labels[160]) yhat = model.predict( test_images[160][np.newaxis, :, :]) # 입력의 차원이 맞지 않기 때문에 3차원으로 변환 print('yhat :', yhat) print('predict :', yhat.argmax())
label : 7
yhat : [[1.5995648e-24 7.8179082e-31 0.0000000e+00 3.9115890e-29 1.9483383e-34 5.5182155e-02 2.9366721e-36 9.2367303e-01 1.5579582e-16 2.1144839e-02]]
predict : 7예측과 정답이 일치한다.
yhat을 보면 7번째 인덱스의 값이 9.2367303e-01로 92%정도로 예측하고 있다.
신경망 학습과 편향
아래의 이미지를 인공 신경망 모델에게 무엇인지 맞춰보라고 하면 운동화 라고 대답한다.
그런데 좌우 반전이된 아래의 이미지를 맞춰보라고 하면 bag 이라고 대답한다.
# 각 레이블 값에 해당하는 의류 class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] # test_images의 9 번째 이미지를 3차원으로 변환 img = test_images[9] input_data = img[np.newaxis,:,:] # 원본 이미지 예측 print('label :', class_names[test_labels[9]]) yhat = model.predict( test_images[9][np.newaxis, :, :]) print('predict :', class_names[yhat.argmax()]) # 좌우 반전 한 뒤 예측 print('----좌우 반전---') input_mirror = input_data[:, :, ::-1] print('label :', class_names[test_labels[9]]) yhat = model.predict( input_mirror) print('predict :', class_names[yhat.argmax()])
label : Sneaker
predict : Sneaker
----좌우 반전---
label : Sneaker
predict : Bag훈련용으로 주어진 신발 데이터들은 모두 왼쪽을 쳐다보고 있었기 때문에 오른쪽을 쳐다보는 신발을 제대로 인식을 하지 못한다.
이러한 문제를 해결하기 위해서는 편향되지 않은 데이터를 확보하여야 한다.
확보된 데이터를 다양하게 변형하여 편향을 제거할 수도 있다 이것을 데이터 증강(data augmentation)이라고 한다.
딥 러닝(deep learning)
간단하게 말하면 인공 신경망의 층을 늘리면 심층 신경망이다.
심층 신경망에서 학습을 진행하는 것이 딥러닝의 기본적인 개념이다.
만들어보자!!
import tensorflow as tf from tensorflow import keras import numpy as np model2 = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(128, activation='relu'), keras.layers.Dense(64, activation='relu'), keras.layers.Dense(32, activation='relu'), keras.layers.Dense(64, activation='relu'), keras.layers.Dense(32, activation='relu'), keras.layers.Dense(10, activation='softmax') ]) model2.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model2.fit(train_images, train_labels, epochs=5)
Epoch 1/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.8303 - accuracy: 0.7683
Epoch 2/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.4842 - accuracy: 0.8283
Epoch 3/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.4320 - accuracy: 0.8460
Epoch 4/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.4059 - accuracy: 0.8553
Epoch 5/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.3858 - accuracy: 0.8625
<tensorflow.python.keras.callbacks.History at 0x7f2586749a50>위에서 만든 model과
층을 더 추가하여 만든 model2의 성능 비교를 해보자.
loss, acc = model.evaluate(test_images, test_labels) print('첫번째 모델의 정확도', acc) loss, acc = model2.evaluate(test_images, test_labels) print('두번째 모델의 정확도', acc)
313/313 [==============================] - 0s 1ms/step - loss: 0.5115 - accuracy: 0.8290
첫번째 모델의 정확도 0.8289999961853027
313/313 [==============================] - 1s 1ms/step - loss: 0.4067 - accuracy: 0.8554
두번째 모델의 정확도 0.855400025844574model2의 성능이 조금더 좋음을 알 수있다.
하지만 층이 많다고 해서 성능이 좋은 것은 아니다.
층만 깊이 쌓을 경우 출력 부분의 잘못에 근거한 학습의 내용이 입력에 가까운 네트워크 층까지 전파가 잘 되지 않는다.
이 문제는 합성곱 신경망(CNN) 모델을 만들어 냄으로써 심층 신경망을 효과적으로 학습시킬 수 있는 돌파구를 보여준다.
모델 저장하고 불러오기
아래와 같은 방법으로 모델을 저장할 수 있다. 확장자는 .h5 이다.
model2.save('./drive/My Drive/myFirstModel.h5')
저장된 모델을 불러온다.
model_imported = keras.models.load_model('./drive/My Drive/myFirstModel.h5')
불러온 모델을 이용해서 아래의 이미지를 분류해 보자.
bag_cartoon.png import cv2 class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] img = cv2.imread('./drive/My Drive/bag_cartoon.png', cv2.IMREAD_GRAYSCALE) img = cv2.resize(img, (28, 28) ) input_data = img[np.newaxis, :, :] yhat = np.argmax( model_imported.predict( input_data ) ) print(class_names[yhat])
Bag
지금까지 배운 것들로
드디어 인공신경망, 딥러닝을 배웠다.
앞에서 했던 기대수명 문제를 인공신경망으로 해결해 보자.
import pandas as pd from sklearn.model_selection import train_test_split import tensorflow as tf from tensorflow import keras from sklearn import preprocessing # 데이터 읽기 life = pd.read_csv("https://raw.githubusercontent.com/dongupak/DataSciPy/master/data/csv/Life_expectancy.csv") # 원하는 데이터만 추출 life.dropna(inplace=True) X = life[['Alcohol','Percentage expenditure', 'Measles', 'Polio', 'BMI', 'GDP', 'Thinness 1-19 years']] y = life[['Life expectancy']] # train, test 데이터 분리 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 입력 요소별 값의 범위를 평균 0, 표준편차 1이되도록 변경 scaler = preprocessing.StandardScaler().fit(X_train) X_train = scaler.transform(X_train) X_test = scaler.transform(X_test) # 신경망 모델 생성 model = keras.Sequential([ keras.layers.Dense(1000, activation='relu'), keras.layers.Dense(800, activation='relu'), keras.layers.Dense(1000, activation='relu'), keras.layers.Dense(500, activation='relu'), keras.layers.Dense(250, activation='relu'), keras.layers.Dense(100, activation='relu'), keras.layers.Dense(50, activation='relu'), keras.layers.Dense(25, activation='relu'), keras.layers.Dense(1, activation='relu') ]) model.compile(optimizer='adam', loss='mse', metrics=['mse']) # 학습 model.fit(X_train, y_train, epochs=100) # y = x 그래프 그리기 a = np.arange(40, 100) plt.plot(a, a) # 예측 test_pred = model.predict(X_test) train_pred = model.predict(X_train) # 예측 데이터와 정답 레이블의 그래프 plt.scatter(train_pred, y_train, color='red', alpha=0.5) plt.scatter(test_pred, y_test, color='blue', alpha=0.5) plt.show()
Epoch 1/100
42/42 [==============================] - 1s 4ms/step - loss: 1390.0052 - mse: 1390.0052
Epoch 2/100
42/42 [==============================] - 0s 3ms/step - loss: 180.2371 - mse: 180.2371
Epoch 3/100
42/42 [==============================] - 0s 3ms/step - loss: 126.6160 - mse: 126.6160
...
...
Epoch 100/100
42/42 [==============================] - 0s 3ms/step - loss: 12.8113 - mse: 12.8113오차 값은 12.8113 이다.
예측값과 정답값이 y=x 그래프에 가까이 몰려있다. 잘 예측하고 있다는 것이다.
빨간색은 train 데이터, 파란색은 test 데이터 이다. 두 데이터 전부 고르게 퍼져있으므로 과적합이 아닌것도 알 수 있다.
이렇게 인공 신경망을 이용하여 다양한 데이터를 분석할 수 있다.
'데이터 과학과 인공지능 입문코딩' 수업을 통해 인공지능에 대해 공부할 수 있었다.
딥러닝이라는 알고리즘.. 정말 대단한 알고리즘인 것 같다.
CNN, RNN, GAN 등등 다양한 딥러닝 모델이 있다. 이러한 모델에 대해 더욱더 깊이 공부해 보고싶다는 생각이 든다.
끝~
728x90'Deep Learning > 인공지능 입문 코딩' 카테고리의 다른 글
[CHAPTER 14] Machine Learning (0) 2021.06.10 [CHAPTER 13] OpenCV (0) 2021.06.06 [CHAPTER 12] 데이터 분석 | pandas (1) 2021.06.03 [CHAPTER 11] 데이터 시각화 | matplotlib (0) 2021.06.02 [CHAPTER 10]넘파이(numpy) (0) 2021.05.30