【딥 러닝 초보자용】Keras를 사용한 전체 결합에 의한 간단한 2치 분류의 구현
개요
딥 러닝의 등장에 의해, 지금까지의 기계 학습보다 좋은 정밀도로 AI 태스크를 해낼 수 있게 되었습니다.
그러나 딥 러닝은 아직 발전 단계라는 것도 있어, 이렇게 하면 좋다고 말한 방법이 확립되고 있는 것은 아닙니다. 또 연구단계라고 하는 것도 있어, 실장·제어가 복잡한 것도 많은 상황입니다.
이번은 실장을 가능한 한 간결하게 해, 딥 러닝을 움직여 보는 것을 목적으로, 간단한 2치 분류를 소개합니다.
이번에는 사과와 미칸의 두 가지 이미지를 딥 러닝을 사용하여 분류합니다. DL 프레임워크에는 튜닝에 어려움이 있지만 간단하게 사용할 수 있는 Keras를 채용했습니다.
환경
디렉토리 구성
실행 모듈 및 데이터 저장을 위한 디렉토리를 준비합니다.
├── data
└── exe.py
data 디렉토리 안에는 학습용 데이터 train과 테스트용 데이터 test를 준비해, 사과와 미칸의 이미지를 각각 저장합니다.
├── test
│ ├── 00_apple
│ └── 01_orange
└── train
├── 00_apple
└── 01_orange
데이터
각 디렉토리 안은 이와 같이 되어 있습니다.
├── data
└── exe.py
├── 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%의 정답률이 되었습니다.
Reference
이 문제에 관하여(【딥 러닝 초보자용】Keras를 사용한 전체 결합에 의한 간단한 2치 분류의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/asakbiz/items/b4ebc3221680dd296879
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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)
# 推論
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%의 정답률이 되었습니다.
Reference
이 문제에 관하여(【딥 러닝 초보자용】Keras를 사용한 전체 결합에 의한 간단한 2치 분류의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/asakbiz/items/b4ebc3221680dd296879
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
accuracy: 100.0 %
Reference
이 문제에 관하여(【딥 러닝 초보자용】Keras를 사용한 전체 결합에 의한 간단한 2치 분류의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/asakbiz/items/b4ebc3221680dd296879텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)