본문 바로가기
Deep Learning

[Dacon] 공유된 코드를 통해 선수지식 학습하기

by 자라자 2020. 8. 30.

선수지식 학습하기

이번 데이콘의 주제는 MNIST 데이터 속에서 숨겨진 숫자를 읽어내는 것입니다. 모델을 만들기에 앞서 공유되어있는 코드들을 따라가며 정보를 빠르게 얻어야겠다고 생각했습니다. 

 

dacon.io/competitions/official/235626/codeshare/

 

컴퓨터 비전 학습 경진대회

출처 : DACON - Data Science Competition

dacon.io

여기에 공지를 포함해서 여섯 가지 코드가 구성되어 있고 찬찬히 하나하나 살펴보겠습니다. 후술되는 코드는 해당 글의 작성자에게 있습니다. 제 자신이 공부하기 위해서 기록하는 글이기도 합니다. 계속 업데이트 예정입니다. 

 

컴퓨터 비전 학습 경진대회 베이스라인 CNN

원문주소: dacon.io/competitions/official/235626/codeshare/1555?page=1&dtype=recent&ptype=pub

Python import

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
import tensorflow as tf

필요한 라이브러리를 import 해줍니다.

 

Load Data

train = pd.read_csv('data/train.csv')
test = pd.read_csv('data/test.csv')

train과 test를 찍어보면,

train data는 28x28 (784) pixel image set 이 2048개 있고, id, digit, letter의 column이 있습니다.

test data에는  digit이 숨겨져 있네요.

 

EDA(탐색적 데이터 분석)

idx = 318
img = train.loc[idx, '0':].values.reshape(28, 28).astype(int) #열에서 필요없는 것 빼고 인덱싱 28x28 ndarray
digit = train.loc[idx, 'digit']
letter = train.loc[idx, 'letter']

plt.title('Index: %i, Digit: %s, Letter: %s'%(idx, digit, letter))
plt.imshow(img) #그리기
plt.show()

인덱스 변수에 숫자를 할당하고 plt.imshow()로 그려봅니다.

B안에 4가 보입니다. 

 

Train model

x_train = train.drop(['id', 'digit', 'letter'], axis=1).values
x_train = x_train.reshape(-1, 28, 28, 1) 
x_train = x_train/255 #normalization

y = train['digit'] #x에는 이미지정보가, y에는 숫자가 들어감.
y_train = np.zeros((len(y), len(y.unique())))
for i, digit in enumerate(y):
    y_train[i, digit] = 1

x_train 의 shape은 (2048,784)->(2048, 28, 28, 1) 이고 y_train의 shape은 (2048,10) 이 됩니다. 

normalization을 수행해줍니다. (0과 1사이 값이 더 딥러닝이 잘되므로)

y에는 숨겨져 있는 숫자 정보인 digit을 넣고,

y_train을 enumerate를 이용해서 one-hot encoding을 해줍니다.

 

def create_cnn_model(x_train):
    inputs = tf.keras.layers.Input(x_train.shape[1:])

    bn = tf.keras.layers.BatchNormalization()(inputs)
    conv = tf.keras.layers.Conv2D(128, kernel_size=5, strides=1, padding='same', activation='relu')(bn)
    bn = tf.keras.layers.BatchNormalization()(conv)
    conv = tf.keras.layers.Conv2D(128, kernel_size=2, strides=1, padding='same', activation='relu')(bn)
    pool = tf.keras.layers.MaxPooling2D((2, 2))(conv)

    bn = tf.keras.layers.BatchNormalization()(pool)
    conv = tf.keras.layers.Conv2D(256, kernel_size=2, strides=1, padding='same', activation='relu')(bn)
    bn = tf.keras.layers.BatchNormalization()(conv)
    conv = tf.keras.layers.Conv2D(256, kernel_size=2, strides=1, padding='same', activation='relu')(bn)
    pool = tf.keras.layers.MaxPooling2D((2, 2))(conv)

    flatten = tf.keras.layers.Flatten()(pool)

    bn = tf.keras.layers.BatchNormalization()(flatten)
    dense = tf.keras.layers.Dense(1000, activation='relu')(bn)

    bn = tf.keras.layers.BatchNormalization()(dense)
    outputs = tf.keras.layers.Dense(10, activation='softmax')(bn)

    model = tf.keras.models.Model(inputs=inputs, outputs=outputs)

    return model

 

CNN 모델을 만듭니다. 

tf.keras.layers.Input에 (28,28,1)을 넣어줍니다.

BatchNoramlization을 이용해서 Normalization 과 scaling.

conv2D

 

 

참고문헌

1. buomsoo-kim.github.io/keras/2018/04/22/Easy-deep-learning-with-Keras-4.md/

 

케라스와 함께하는 쉬운 딥러닝 (4) - 뉴럴 네트워크의 학습 과정 개선하기 · Buomsoo Kim

케라스와 함께하는 쉬운 딥러닝 (4) - 뉴럴 네트워크의 학습 과정 개선하기 22 Apr 2018 | Python Keras Deep Learning 케라스 다층 퍼셉트론 4 (Improving techniques for training neural networks) Objective: 인공신경망 모��

buomsoo-kim.github.io