실무에서는 딱딱 나눠 떨어지지 않는다는 것에 유의하자
train_test_split
을 통해 데이터셋을 분리할 수 있다.pd.get_dummies
category
로 변경해야한다.pd.Categorical
x1
컬럼을 가변수화 하고 싶을 때, info를 확인해보면 데이터 타입이 문자열(object)로 되어 있다.<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 x1 5 non-null object
1 x2 5 non-null int64
dtypes: int64(1), object(1)
memory usage: 208.0+ bytes
Categorical
을 사용할 때는 가변수화할 컬럼과 어떤 범주값이 존재하는지를 지정해주어야 한다.x1
컬럼의 자료형을 category로 전환하면 판다스가 해당 컬럼을 범주 데이터로 간주한다.train['x1'] = pd.Categorical(train['x1'], categories = ['a','b','c'])
train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 x1 5 non-null category
1 x2 5 non-null int64
dtypes: category(1), int64(1)
memory usage: 305.0 bytes
get_dummies()
함수를 사용할 때 사용할 컬럼을 columns=
옵션으로 지정한다. 이때 사용할 컬럼의 데이터 자료가 category
여야 한다.x1
컬럼에는 c
값이 없었음에도 불구하고 train 데이터와 동일하게 가변수화 되었다.test['x1'] = pd.Categorical(test['x1'], categories = ['a','b','c'])
pd.get_dummies(test, columns = ['x1'])
x2 x1_a x1_b x1_c
0 7 True False False
1 8 False True False
2 9 False True False
dropna()
메서드를 통해 결측치 제거가 가능하다.sklearn.impute.SimpleImputer
sklearn.impute.SimpleImputer
sklearn.impute.KNNImputer
이제 모든 과정을 하나의 함수로 만들면 된다.
joblib
라이브러리를 이용하면 함수에 필요한 매개변수나 함수 자체, 학습된 모델 등을 pkl 파일로 저장할 수 있다.
실습 주제 : 수어 번역 AI 모델 파이프라인 구축
과제
※ 학습 데이터, 검증 데이터의 전처리 과정은 생략한다.
# 1. 세션 클리어
clear_session()
# 2. 레이어 쌓기
il = Input(shape=(x_train.shape[1], x_train.shape[2], x_train.shape[3]))
# 컨볼루션 레이어 1
x = Conv2D(32, (3, 3), activation='swish')(il)
x = MaxPooling2D((2, 2))(x)
# 컨볼루션 레이어 2
x = Conv2D(64, (3, 3), activation='swish')(x)
x = MaxPooling2D((2, 2))(x)
# Flatten 레이어
x = Flatten()(x)
# Dense 레이어 1
x = Dense(128, activation='swish')(x)
x = Dropout(0.2)(x)
# 출력 레이어
ol = Dense(24, activation='softmax')(x)
# 모델 선언
model = Model(il, ol)
# 컴파일
model.compile(loss=tf.keras.losses.categorical_crossentropy,
metrics=['accuracy'],
optimizer='adam')
# 요약
model.summary()
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 28, 28, 1)] 0
conv2d (Conv2D) (None, 26, 26, 32) 320
max_pooling2d (MaxPooling2D (None, 13, 13, 32) 0
)
conv2d_1 (Conv2D) (None, 11, 11, 64) 18496
max_pooling2d_1 (MaxPooling (None, 5, 5, 64) 0
2D)
flatten (Flatten) (None, 1600) 0
dense (Dense) (None, 128) 204928
dropout (Dropout) (None, 128) 0
dense_1 (Dense) (None, 24) 3096
=================================================================
Total params: 226,840
Trainable params: 226,840
Non-trainable params: 0
_________________________________________________________________
코랩 환경이 아닌 로컬에서 돌아가는 모델이므로 가볍게 구성하였다.
검증용 데이터에 대해서는 아주 우수한 성능을 보였다.
cv2
라이브러리를 사용하였다.import cv2
data_path = 'test image/'
data_file = 'v.png'
filename = data_path + data_file
# 파일 로딩
img = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)
(1 * 28 * 28 * 1)
에 맞도록 reshape하는 과정, 스케일링 과정을 진행한다.# 이미지 크기 조정
img = cv2.resize(img, (28, 28))
# input shape 맞추기
img = img.reshape(1, 28, 28, 1)
# Minmax 스케일링
img = img / 255
model_path = 'exercise1/model.pkl'
# 모델 로딩
model = joblib.load(model_path)
# 예측
pred = model.predict(img)
pred = pred.argmax()
def pipeline(img, model):
# 크기 조정
img = cv2.resize(img, (28, 28))
# input shape 맞추기
img = img.reshape(1, 28, 28, 1)
# 스케일링
img = img / 255
# 모델 로딩
model = joblib.load(model_path)
# 예측
pred = model.predict(img)
pred = pred.argmax()
return pred