import tensorflow.keras as keras
import pandas as pd
train_df = pd.read_csv("data/asl_data/sign_mnist_train.csv")
valid_df = pd.read_csv("data/asl_data/sign_mnist_valid.csv")
y_train = train_df['label']
y_valid = valid_df['label']
del train_df['label']
del valid_df['label']
x_train = train_df.values
x_valid = valid_df.values
# make categorical labels
num_classes = 24
y_train = keras.utils.to_categorical(y_train, num_classes)
y_valid = kears.utils.to_categorical(y_valid, num_classes)
# Normalizing
x_train = x_train/255
x_valid = x_valid/255
이전장에서는 이미지 하나에 해당하는 data row 가 784 pixel로 일렬 정렬되어 있었다.
CNN은 pixel간의 정보를 필요로 하기 때문에
784 pixel를 다시 28*28로 reshape해줘야한다.
color channel의 개수 또한 kernel의 사이즈를 결정하므로 넣어야하는 정보이다.
이 문제에서 우리는 grayscale이미지를 사용하므로 1개의 channel밖에 없다.
따라서, 최종적인 shape은 (num_data, 28, 28, num_channels) 가 된다.
x_train = x_train.reshape(-1, 28, 28, 1)
x_valid = x_valid.reshape(-1, 28, 28, 1)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import ( Dense, Conv2D, MaxPool2D, Flatten, Dropout, BatchNormalization,)
model = Sequential()
#first Convolution
model.add(Conv2D(75, (3,3), strides=1, padding="same", activation="relu", input_shape=(28,28,1)))
model.add(BatchNormalization())
model.add(MaxPool2D((2,2), strides=2, padding="same"))
#Second Convolution
model.add(Conv2D(50, (3,3), strides=1, padding="same", activation="relu"))
model.add(Dropout(0.2))
model.add(BatchNormalization())
model.add(MaxPool2D((2,2), strides=2, padding="same"))
#Third Convolution
model.add(Conv2D(25, (3,3), strides=1, padding="same", activation="relu"))
model.add(BatchNormalization())
model.add(MaxPool2D((2,2), strides=2, padding="same"))
#Classification을 위한 fully-connected Neural Network만듦.
model.add(Flatten()) # CNN을 위해 2D로 만들었던 것을 1D로 다시 flatten
model.add(Dense(units=512, activation="relu"))
model.add(Dropout(0.3))
# 24개의 알파벳 중 하나로 classification함.
model.add(Dense(units=num_classes, activation="softmax"))
첫번째 Conv2D의 parameter를 살펴보면,
(75, (3,3), strides=1, padding="same")
75는 kernel의 개수를 의미한다.
(3,3)는 kernel의 size이다.
우리가 Conv2D를 통해서 얻고자 하는 것은 kernel element값이다.
따라서 3375개의 kernel value를 학습하고자 한다.
stride는 kernel이 image내에서 이동하는 stepSize를 말하고
padding="same"이면 input과 output의 size가 same이 된다. (ex. Zero-padding을 쓰면 그렇게 됨.)
model.summary()
model.compile(loss="categorical_crossentropy, metrics=["accuracy"])
model.fit(x_train, y_train, epochs=10, verbose=1, validation_data=(x_valid, y_valid))
import IPython
app = IPython.Application.instance()
app.kernel.do_shutdown(True)