이미지 인식하는 원리
from tensorflow.keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
print("shape of 'X_train':", X_train.shape)
print("type of 'X_train' :", type(X_train) )
print("shape of 'X_train[0]':", X_train[0].shape)
print("type of 'X_train[0]' :", type(X_train[0]) )
import matplotlib.pyplot as plt
plt.imshow(X_train[0], cmap='Greys')
plt.show()
#라벨 출력
y_train[0] # 5
import sys
for pixel_line in X_train[0]:
for pixel in pixel_line:
sys.stdout.write("%-4s" % pixel)
sys.stdout.write('\n')
X_train.shape
학습 데이터 셋 준비
X_train = X_train.reshape( X_train.shape[0], 784)
- 케라스는 데이터를 0~1 사이의 값으로 변환한 후 구동할 때 최적의 성능을 보임
# 정규화(normalization) : 0 ~ 1사이의 값으로 변경
X_train = X_train.astype('float64') # 실수형으로 변경
X_train = X_train / 255 # 정규화 0~1 사의 값으로 변경
클래스 데이터 준비
# 클래스 값을 확인해 봅니다.
print("class : %d " % (y_train[0]) )
# 바이너리화 과정을 실습해 봅니다.
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
print(y_train[0])
# 이미지를 인식하는 원리
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
import sys
# MNIST 데이터셋을 불러와 학습셋과 테스트셋으로 저장
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 학습셋과 테스트셋이 각각 몇 개의 이미지로 되어 있는지 확인
print("학습셋 이미지 수 : %d 개" % (X_train.shape[0]))
print("테스트셋 이미지 수 : %d 개" % (X_test.shape[0]))
# 첫 번째 이미지를 확인
plt.imshow(X_train[0], cmap='Greys')
plt.show()
# 이미지가 인식되는 원리를 알아봅시다.
for x in X_train[0]:
for i in x:
sys.stdout.write("%-3s" % i)
sys.stdout.write('\n’)
# 차원 변환 과정을 실습해 봅니다.
X_train = X_train.reshape(X_train.shape[0], 784)
X_train = X_train.astype('float64')
X_train = X_train / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float64') / 255
# 클래스 값을 확인해 봅니다.
print("class : %d " % (y_train[0]) )
# 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
print(y_train[0])
딥러닝 기본 프레임 만들기
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
import numpy as np
import os
# MNIST 데이터를 불러옵니다.
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 차원 변환 후, 테스트셋과 학습셋으로 나누어 줍니다.
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
# 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 모델 구조를 설정합니다.
model = Sequential()
model.add(Dense(512, input_dim=784, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()
# 모델 실행 환경을 설정합니다.
model.compile(loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy'])
# 모델 최적화를 위한 설정 구간입니다.
modelpath="./MNIST_MLP.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss',
verbose=1, save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)
# 모델을 실행합니다.
history = model.fit(X_train, y_train,
validation_split=0.25,
epochs=30,
batch_size=200,
verbose=0,
callbacks=[early_stopping_callback,checkpointer])
# 테스트 정확도를 출력합니다.
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))
학습/테스트 셋 의 오차 시각화
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
# 그래프로 표현해 봅니다.
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Validset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
# 그래프에 그리드를 주고 레이블을 표시해 보겠습니다.
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
# MNIST 데이터 로드
from tensorflow.keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# X_train은 60,000개 행과 28 x 28 = 784 개 열(속성)으로 reshape 후 정규화
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
# 레이블(클래스)를 원-핫 인코딩
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 모델 구조 설계 및 컴파일
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(10, input_dim=784, activation='softmax'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
# 모델을 훈련(학습) 실행
history = model.fit(X_train, y_train, validation_split=0.25, epochs=200, batch_size=128, verbose=0)
# 테스트 데이터셋에 대한 적확도 출력
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 1. 데이터 준비 -------------------------------------------------------------
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# X_train은 60,000개 행과 28 x 28 = 784 개 열(속성)으로 reshape 후 정규화
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
# 레이블(클래스)를 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 2. 모델 구조 설계 및 컴파일 ------------------------------------------------
model = Sequential()
model.add(Dense(10, input_dim=784, activation='softmax'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
# 3. 모델을 훈련(학습) 실행 --------------------------------------------------
history = model.fit(X_train, y_train, validation_split=0.25, epochs=200, batch_size=128, verbose=0)
# 4. 테스트 데이터셋에 대한 정확도 출력 --------------------------------------
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# 1. 데이터 준비 ------------------------------------------------------------
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# X_train은 60,000개 행과 28 x 28 = 784 개 열(속성)으로 reshape 후 정규화
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
# 레이블(클래스)를 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 2. 모델 구조 설계 및 컴파일 -----------------------------------------------
model = Sequential()
model.add(Dense(512, input_dim=784, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy'])
# 모델 훈련(학습) 실행 ------------------------------------------------------
history = model.fit(X_train, y_train, validation_split=0.25, epochs=200,
batch_size=200,verbose=0)
# 테스트 데이터셋에 대한 정확도를 출력 ------------------------------------
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))
은닉층 추가
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 1. 데이터 준비 -------------------------------------------------------------
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# X_train은 60,000개 행과 28 x 28 = 784 개 열(속성)으로 reshape 후 정규화
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
# 레이블(클래스)를 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 2. 모델 구조 설계 및 컴파일 ------------------------------------------------
model = Sequential()
model.add(Dense(128, input_dim=784, activation='relu', name='dense_layer_1'))
model.add(Dense(128, activation='relu', name='dense_layer_2'))
model.add(Dense(10, activation='softmax', name='dense_layer_3'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='sgd',
metrics=['accuracy'])
# 3. 모델을 훈련(학습) 실행 --------------------------------------------------
history = model.fit(X_train, y_train, validation_split=0.25, epochs=200,
batch_size=128, verbose=0)
# 4. 테스트 데이터셋에 대한 정확도 출력 --------------------------------------
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))
은닉층 + Dropout 추가
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
# 1. 데이터 준비 -------------------------------------------------------------
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# X_train은 60,000개 행과 28 x 28 = 784 개 열(속성)으로 reshape 후 정규화
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
# 레이블(클래스)를 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 2. 모델 구조 설계 및 컴파일 ------------------------------------------------
model = Sequential()
model.add(Dense(128, input_dim=784, activation='relu', name='dense_layer_1'))
model.add(Dropout(0.3))
model.add(Dense(128, activation='relu', name='dense_layer_2'))
model.add(Dropout(0.3))
model.add(Dense(10, activation='softmax', name='dense_layer_3'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='sgd',
metrics=['accuracy'])
# 3. 모델을 훈련(학습) 실행 --------------------------------------------------
history = model.fit(X_train, y_train, validation_split=0.25, epochs=200,
batch_size=128, verbose=0)
# 4. 테스트 데이터셋에 대한 정확도 출력 --------------------------------------
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))
컨볼루션 신경망
- 입력된 이미지에서 다시 한 번 특징을 추출하기 위해 커널(스라이딩 원도우)을 도입하는 기법
- 기본 딥러닝 프레임에 이미지 인식 분야에서 강력한 성능을 보이는 컨볼루션 신경망(Convolutional Neural Network, CNN)을 얹어 보겠음.
model.add(Conv2D(32,
kernel_size=(3,3),
input_shape=(28,28, 1),
activation='relu'))
맥스 폴링, 드롭아웃, 플래트
맥스 폴링
- 정해진 구역 내에서 최댓값을 뽑아내는 맥스 폴링
드롭아웃(drop out)
- 은닉층에 배치된 노드 중 일부를 임의로 꺼 주는 것
플래튼
- 데이터를 1차원 배열로 변경
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
import numpy as np
# 데이터를 불러옵니다.
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32') / 255
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
# 컨볼루션 신경망의 설정
model = Sequential()
model.add(Conv2D(32,
kernel_size=(3, 3),
input_shape=(28, 28, 1),
activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
# model = Sequential()
# model.add(Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), activation='relu'))
# model.add( MaxPooling2D( pool_size=(2,2) ) )
# model.add(Conv2D(64, (3, 3), activation='relu'))
# model.add( MaxPooling2D( pool_size=(2,2) ) )
# model.add( MaxPooling2D( pool_size=(2,2), strides=(2,2) ) )
# model.add(Dropout(0.25))
# model.add(Flatten())
# model.add(Dense(128, activation='relu'))
# model.add(Dropout(0.5))
# model.add(Dense(10, activation='softmax'))
# 모델의 실행 옵션을 설정합니다.
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# 모델 최적화를 위한 설정 구간입니다.
modelpath="./MNIST_CNN.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath,
monitor='val_loss',
verbose=1,
save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)
# 모델을 실행합니다.
history = model.fit(X_train, y_train,
validation_split=0.25,
epochs=30,
batch_size=200,
verbose=0,
callbacks=[early_stopping_callback,checkpointer])
# 테스트 정확도를 출력합니다.
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))
# 검증셋과 학습셋의 오차를 저장합니다.
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
# 그래프로 표현해 봅니다.
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='validset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
# 그래프에 그리드를 주고 레이블을 표시하겠습니다.
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
'빅데이터 분석가 양성과정 > Python - 딥러닝' 카테고리의 다른 글
순환 신경망(Recurrent Neural Network, RNN) (0) | 2024.07.17 |
---|---|
딥러닝을 이용한 자연어 처리 (1) | 2024.07.17 |
실습 (0) | 2024.07.17 |
모델 성능 향상 (1) | 2024.07.17 |
모델 성능 검증 (0) | 2024.07.17 |