728x90
악 금요일!!!!!!!!!!!!!!!!!!!!!!! 😇🥳
오늘은 MNIST를 CNN, Tensorflow 2.x, Colab으로 구현한다.
Params(weights) = ksize Height × ksize Width × filter 개수 + b(filter 개수)
1. MNIST by CNN, Tensorflow 2.x, Colab
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout
from tensorflow.keras.optimizers import Adam
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# Raw Data Loading
df = pd.read_csv('/content/drive/MyDrive/Colab 멀캠 이지연/mnist/train.csv')
# Data Preprocessing : 결측치, 이상치, 정규화, feature engineering
# Data Split
train_x_data, test_x_data, train_t_data, test_t_data = \
train_test_split(df.drop('label', axis=1, inplace=False),
df['label'],
test_size=0.3,
random_state=1,
stratify=df['label'])
# x_data 정규화
scaler = MinMaxScaler()
scaler.fit(train_x_data)
norm_train_x_data = scaler.transform(train_x_data)
norm_test_x_data = scaler.transform(test_x_data)
# t_data One-Hot Encoding 진행 필요 없음
# Keras 구현
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3,3), # filter 개수, kernel_size=3
activation='relu',
input_shape=(28,28,1), # (이미지 개수, 이미지 height, 이미지 width, Channel)
padding='valid',
strides=(1,1))) # strides=1
model.add(MaxPooling2D(pool_size=(2,2))) # strides는 알아서 ksize와 동일하게 잡음. 1/2
model.add(Conv2D(filters=64, kernel_size=(3,3),
activation='relu',
padding='valid',
strides=(1,1)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=64, kernel_size=(3,3),
activation='relu',
padding='valid',
strides=(1,1))) # (None, 3, 3, 64)
model.add(Flatten()) # 이미지 개수를 제외한 output(3차원)을 1차원으로 펴줌
model.add(Dropout(rate=0.5))
model.add(Dense(units=256, # hidden layer
activation='relu'))
model.add(Dense(units=10,
activation='softmax'))
print(model.summary()) # Model 명세
# model 실행 옵션
model.compile(optimizer=Adam(learning_rate=1e-3), # 어떤 optimizer를 사용하느냐에 따라 learning rate가 달라짐(알고리즘이 다르기 때문)
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# model 학습
# t_data의 일부를 valid_data로 활용해서, 학습이 진행될 때(epoch)마다 평가를 함께 진행
history = model.fit(norm_train_x_data.reshape(-1,28,28,1),
train_t_data,
epochs=200,
batch_size=100,
verbose=0,
validation_split=0.3)
print(type(history)) # <class 'keras.callbacks.History'>
print(history.history.keys()) # dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])
figure = plt.figure(figsize=(15, 5))
ax1 = figure.add_subplot(1,2,1)
ax2 = figure.add_subplot(1,2,2)
ax1.plot(history.history['loss'], color='r')
ax1.plot(history.history['val_loss'], color='b')
ax2.plot(history.history['accuracy'], color='r')
ax2.plot(history.history['val_accuracy'], color='b')
# 세션 튕겨도 재학습할 필요 없게 학습된 모델 저장(모델의 구조 + 계산된 weights, bias) 확장자는 h5(HDF5) 형식
model.save('/content/drive/MyDrive/Colab 멀캠 이지연/mnist_model_save/my_mnist_model.h5')
# Evaluation
model.evaluate(norm_test_x_data.reshape(-1,28,28,1), test_t_data) # loss: 0.1032 - accuracy: 0.9900
2. Loading Model, Check Point, Early Stopping
# 모델 생성, 학습 없이 저장된 모델을 불러와서 평가
from tensorflow.keras.models import load_model
new_model = load_model('/content/drive/MyDrive/Colab 멀캠 이지연/mnist_model_save/my_mnist_model.h5')
new_model.evaluate(norm_test_x_data.reshape(-1,28,28,1), test_t_data) # loss: 0.1032 - accuracy: 0.9900
# model 학습(ckpt, early stopping, callback 포함)
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
# Check Point 설정
checkpoint_path = '/content/drive/MyDrive/Colab 멀캠 이지연/mnist_model_save/cp-{epoch:04d}.ckpt'
cp_callback = ModelCheckpoint(checkpoint_path,
save_weights_only=True,
period=5, # 5 epoch마다 저장
verbose=1)
# Early Stopping
es = EarlyStopping(monitor='val_loss',
min_delta=0.001,
patience=5,
verbose=1,
mode='auto',
restore_best_weights=True)
history = model.fit(norm_train_x_data.reshape(-1,28,28,1),
train_t_data,
epochs=50,
batch_size=100,
verbose=1,
validation_split=0.3,
callbacks=[cp_callback, es])
↓학습된 모델 저장 및 불러오기↓
2022.04.07 - [멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차/ML] - 4/7 목
↓Early Stopping↓
2022.04.12 - [멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차/DL] - 4/12 화
3. Fashion MNIST by CNN, Tensorflow 2.x, Kaggle 실습
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout
from tensorflow.keras.optimizers import Adam
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import matplotlib.image as img
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
# Raw Data Loading
train = pd.read_csv('../input/fashionmnist/fashion-mnist_train.csv')
test = pd.read_csv('../input/fashionmnist/fashion-mnist_test.csv')
display(train.head()); display(test.head())
display(train.info()); display(test.info())
# image 확인
figure = plt.figure()
ax = list()
img = train.drop('label', axis=1, inplace=False).values
for i in range(10):
ax.append(figure.add_subplot(2,5,i+1))
ax[i].imshow(img[i].reshape(28,28),
cmap='Greys',
interpolation='nearest')
plt.tight_layout()
plt.show()
# 결측치 없음
# print(train.isnull().sum().unique()); print(test.isnull().sum().unique()) # none
# combining train and test dataset
df = pd.concat([train, test], axis=0)
# print(df.shape) # (70000, 785)
# Data Split
train_x_data, test_x_data, train_t_data, test_t_data = \
train_test_split(df.drop('label', axis=1, inplace=False),
df['label'],
test_size=0.3,
random_state=1,
stratify=df['label'])
# x_data 정규화
scaler = MinMaxScaler()
scaler.fit(train_x_data)
norm_train_x_data = scaler.transform(train_x_data)
norm_test_x_data = scaler.transform(test_x_data)
# Keras
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=3,
activation='relu',
input_shape=(28,28,1),
padding='valid',
strides=1))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=64, kernel_size=3,
activation='relu',
padding='valid',
strides=1))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=64, kernel_size=3,
activation='relu',
padding='valid',
strides=1))
model.add(Flatten())
model.add(Dropout(rate=0.5))
model.add(Dense(units=256, # Hidden Layer
activation='relu'))
model.add(Dense(units=10, # Output Layer
activation='softmax'))
print(model.summary())
model.compile(optimizer=Adam(learning_rate=1e-3),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# Check Point
checkpoint_path = '../kaggle/working/Fashion_MNIST/cp-{epoch:04d}.ckpt'
cp_callback = ModelCheckpoint(checkpoint_path,
save_weights_only=True,
period=5,
verbose=1)
# Early Stopping
es = EarlyStopping(monitor='val_loss',
min_delta=0.001,
patience=5,
verbose=1,
mode='auto',
restore_best_weights=True)
history = model.fit(norm_train_x_data.reshape(-1,28,28,1),
train_t_data,
epochs=200,
batch_size=100,
verbose=1,
validation_split=0.3,
callbacks=[cp_callback, es])
model.save('../kaggle/working/Fashion_MNIST/MNIST_Model_save.h5')
figure = plt.figure(figsize=(15, 5))
ax1 = figure.add_subplot(1,2,1)
ax2 = figure.add_subplot(1,2,2)
ax1.set_title('Loss Trend')
ax1.set_xlabel('epoch')
ax1.set_ylabel('loss')
ax1.plot(history.history['loss'], color='r')
ax1.plot(history.history['val_loss'], color='b')
ax1.grid()
ax2.set_title('Accuracy Trend')
ax2.set_xlabel('epoch')
ax2.set_ylabel('accuracy')
ax2.plot(history.history['accuracy'], color='r')
ax2.plot(history.history['val_accuracy'], color='b')
ax2.grid()
ax1.legend(['train', 'validation'], loc='upper right')
ax2.legend(['train', 'validation'], loc='lower right')
plt.show()
# epoch는 10번 정도가 적당하다
# Loading Model
new_model = load_model('../kaggle/working/Fashion_MNIST/MNIST_Model_save.h5')
# Evaluation
# model.evaluate(norm_test_x_data.reshape(-1,28,28,1), test_t_data) # loss: 0.2410 - accuracy: 0.9135
new_model.evaluate(norm_test_x_data.reshape(-1,28,28,1), test_t_data) # loss: 0.2410 - accuracy: 0.9135
1. 4/11 월 | 2. 4/12 화 | 3. 4/13 수 | 4. 4/14 목 | 5. 4/15 금 |
Deep Learning Perceptron, Nueral Network |
Deep Learning Initialization, ReLU, Drop-out, Early-Stopping |
Deep Learning Image, CNN, Convolution Layer, Channel, Filter, Stride, Padding, Feature Map, Activation Map |
Deep Learning CNN, Feature Extraction, Pooling |
Deep Learning CNN |
6. 4/18 월 | 7. 4/19 화 | 8. 4/20 수 | 9. 4/21 목 | 10. 4/22 금 |
Deep Learning 전이학습, Generator, AWS |
Deep Learning |
Deep Learning |