【딥 러닝 초보자용】Keras를 사용한 전체 결합에 의한 간단한 2치 분류의 구현

개요



딥 러닝의 등장에 의해, 지금까지의 기계 학습보다 좋은 정밀도로 AI 태스크를 해낼 수 있게 되었습니다.
그러나 딥 러닝은 아직 발전 단계라는 것도 있어, 이렇게 하면 좋다고 말한 방법이 확립되고 있는 것은 아닙니다. 또 연구단계라고 하는 것도 있어, 실장·제어가 복잡한 것도 많은 상황입니다.

이번은 실장을 가능한 한 간결하게 해, 딥 러닝을 움직여 보는 것을 목적으로, 간단한 2치 분류를 소개합니다.

이번에는 사과와 미칸의 두 가지 이미지를 딥 러닝을 사용하여 분류합니다. DL 프레임워크에는 튜닝에 어려움이 있지만 간단하게 사용할 수 있는 Keras를 채용했습니다.

환경


  • gpu GeForce GTX 1070
  • os ubuntu16.04
  • CUDA 8.0
  • cudnn 6.0
  • Keras 2.0.8

  • 디렉토리 구성



    실행 모듈 및 데이터 저장을 위한 디렉토리를 준비합니다.
    ├── data 
    └── exe.py
    
    

    data 디렉토리 안에는 학습용 데이터 train과 테스트용 데이터 test를 준비해, 사과와 미칸의 이미지를 각각 저장합니다.
    ├── test
    │   ├── 00_apple
    │   └── 01_orange
    └── train
        ├── 00_apple
        └── 01_orange
    
    

    데이터



    각 디렉토리 안은 이와 같이 되어 있습니다.
  • 사과
  • 미칸

  • 학습


    from keras.utils.np_utils import to_categorical
    from keras.optimizers import Adagrad
    from keras.optimizers import Adam
    import numpy as np
    from PIL import Image
    import os
    
    # 教師データ読み込み
    
    train_path="./data/train/"
    test_path="./data/test/"
    
    xsize=25
    ysize=25
    
    image_list = []
    label_list = []
    
    
    for dataset_name in os.listdir(train_path):
    
        dataset_path = train_path + dataset_name
        label = 0
    
        if dataset_name == "00_apple":
            label = 0
        elif dataset_name == "01_orange":
            label = 1
    
        for file_name in sorted(os.listdir(dataset_path)):
            label_list.append(label)
            file_path = dataset_path + "/" + file_name
            image = np.array(Image.open(file_path).resize((xsize, ysize)))
            print(file_path)
    
            # RGBの順に変換、[[Redの配列],[Greenの配列],[Blueの配列]]
            image = image.transpose(2, 0, 1)
    
            # 1次元配列に変換(25*25*3) Red,Green,Blueの要素が順番に並ぶ。
            image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0]
    
            # 0〜1の範囲に変換
            image_list.append(image / 255.)
    
    
    # numpy変換。
    X = np.array(image_list)
    
    # label=0 -> [1,0], label=1 -> [0,1] に変換
    Y = to_categorical(label_list)
    
    # モデル定義
    model = Sequential()
    model.add(Dense(200, input_dim=xsize*ysize*3))
    model.add(Activation("relu"))
    model.add(Dropout(0.2))
    
    model.add(Dense(200))
    model.add(Activation("relu"))
    model.add(Dropout(0.2))
    
    model.add(Dense(2))
    model.add(Activation("softmax"))
    
    model.compile(loss="categorical_crossentropy", optimizer=Adam(lr=0.001), metrics=["accuracy"])
    model.summary()
    
    # 学習
    model.fit(X, Y, nb_epoch=1000, batch_size=100, validation_split=0.1)
    
    

    이미지 분류 등을 할 때는 CNN을 사용하는 경우가 많습니다만, 이번은 단순화를 위해, 전체 결합만을 사용했습니다. 또, 화상으로부터 형태의 특징량을 추출할 때에, 불필요한 정보가 포함되지 않도록 그레이스케일화하는 경우가 많습니다만, 사과와 미칸의 분류이기 때문에 색의 정보가 중요하다고 판단 그리고 그레이 스케일화하지 않고 RGB의 정보를 모든 것을 신경망의 input에 건네주고 있습니다.

    추론


    # 推論
    total = 0.
    ok_count = 0.
    
    for testset_name in os.listdir(test_path):
    
        testset_path = test_path + testset_name
    
        label = -1
    
        if testset_name == "00_apple":
            label = 0
        elif testset_name == "01_orange":
            label = 1
        else:
            print("error : label not exist")
            exit()
    
        for file_name in os.listdir(testset_path):
            label_list.append(label)
            file_path = testset_path + "/" + file_name
            image = np.array(Image.open(file_path).resize((25, 25)))
            print(file_path)
            image = image.transpose(2, 0, 1)
            image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0]
            result = model.predict_classes(np.array([image / 255.]))
            print("label:", label, "result:", result[0])
    
            total += 1.
    
            if label == result[0]:
                ok_count += 1
    
    
    
    print("accuracy: ", ok_count / total * 100, "%")
    
    

    결과


    accuracy:  100.0 %
    

    딥 러닝이 고정밀도라고 해도 정답률 100%까지는 좀처럼 되지 않습니다. 그러나 이번은 사과와 미칸의 단순한 분류이기 때문에 100%의 정답률이 되었습니다.

    좋은 웹페이지 즐겨찾기