Keras 시작하기 - PART 2 : 데이터 적재와 이미지 분류기 - 1

(핸즈 온 머신러닝 4판을 보고 직접 해보면서 정리한 내용이 포함되어 있습니다.)

케라스는 텐서플로, 파이토치와 비교해서 쉽게 신경망을 구성해 훈련, 평가, 실행할 수 있는 고수준 딥러닝 API 이다. 케라스는 크게 두 가지 방식으로 계산 백엔드를 구성한다. 첫 번째는 멀티백엔드 케라스이다. 시에노와 텐서플로, 마이크로소프트 코그니티브 툴킷 세 가지 딥러닝 라이브러리를 백엔드로 구성한다. 이후에는 MXNet, Core ML, 자바스크립트나 타임사크립트 등 여러 백엔드서 케라스를 실행할수 있도록 구현이 되었다. 두 번째가 텐서플로가 자체적으로 지원하는 tf.keras 이다. 텐서플로에 자체적으로 포함되어 있고 데이터적재와 전처리를 간편하게 수행할 수 있도록 텐서플로 데이터 API를 지원한다. 책에서는 MNIST 이미지 데이터셋을 이용했지만 나는 삼성전자의 캔들차트 데이터를 사용하기로 했다. 라벨링은 0 또는 1로 되어있으므로 이진 분류기가 될 것이다. 각 이미지가 60p60p 사이즈이고 각 픽셀마다 rgb값을 따로 저장해놨으므로 하나의 이미지당 6060*3 크기인 10800개의 int형 데이터로 구성된다. 책에서는 데이터셋을 2차원의 이미지 그대로 신경망에 전달 될 수 있도록 했다. 나도 기존에 사용했던 BinaryClassifier 에서 이미지를 1차원 배열로 바꿨던 방 식에서 2차원 미지 형태를 그대로 사용하는 방식을 사용하기로 했다. 사용하던 candlechart4ML 의 candlechart_generator 메소드는 rgb이미지를 반환하는데 rgb를 반환했을 때 안좋은점이 데이터의 개수가 3배가 된다는 점이라고 생각했다. 따라서 흑백이미지로 바꾸고 이미지의 각 픽셀을 0부터 255의 gray scale 로 나타내 보기로 했다.


def image2gray(candlechart_dir):
    symbol = candlechart_dir.split('\\')[-3]
    imgs = list([])
    for i in range(len(os.listdir(candlechart_dir))):
        imgname = '{}-{}.png'.format(symbol, i)
        im = Image.open(candlechart_dir+imgname)
        imGray = im.convert('L')
        imGray.save(candlechart_dir+imgname)
def image2_2Ddataarray(candlechart_dir):
    symbol = candlechart_dir.split('\\')[-3]
    imgs = list([])
    for i in range(len(os.listdir(candlechart_dir))):
        imgname = '{}-{}.png'.format(symbol, i)
        im = Image.open(candlechart_dir+imgname)
        imgs.append(np.array(im))
    return np.array(imgs) ---

이전까지 혼동해서 사용하던 검증, 훈련, 테스트 세트에 대해서 정확하게 짚고 넘어가겠다. 전체 데이터셋은 훈련세트와 테스트 셋으로 나뉘고, 훈련세트는 다시 훈련세트와 검증세트로 나뉜다. 즉 검증세트는 훈련을 위하여 따로 빼놓는 훈련세트의 일부이다. 코드 상에서 표현을 책에 따르면 전체훈련세트 , train_full 전체훈련 세트 중 훈련세트 , valid 전체훈련 세트 중 검증세트 , train 전체테스트세트, test 원본세트(본인이추가), all 로 표현하게 된다. 따라서 혼동이 없도록 앞으로는 이 표현을 따라서 코드를 작성한다.


X_all = candle_array / 255.0
y_all = label_array

slicer1 = int(0.8 * len(candle_array))

X_train_full, y_train_full = X_all[:slicer1], y_all[:slicer1]
X_test, y_test = X_all[slicer1:], y_all[slicer1:]

slicer2 = int(0.8 * len(X_train_full))

X_valid, X_train = X_train_full[slicer2:], X_train_full[:slicer2]
y_valid, y_train = y_train_full[slicer2:], y_train_full[:slicer2] ---

Updated: