質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • Python 3.x

    5299questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • TensorFlow

    602questions

  • Keras

    163questions

深層学習を用いたプログラムの正解率

受付中

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 552

mizu4423

score 2

前提・実現したいこと

個人的な趣味で、参考書のサンプルコードをもとに、深層学習を用いて動物を画像認識するプログラムを作っています。下記に示すソースコードのように、3つのカテゴリーに分類した画像データをもとにモデルを訓練させ、全体の正解率を出すプログラムを組みました。エラーはないのですが、このプログラムで、3つのカテゴリー(normal, boar2, others)のそれぞれにおいて分類した正解率も出せるようにしたいです。
具体的には、全体の正解率はacc = 0.9102...というように91%ですが、normalの正解率、boar2の正解率、othersの正解率も表示したいです。
また、出来たらでいいのですが、normalなのにboar2と判断された画像、反対にboar2なのにnormalと判断されたような画像の内訳も見れるようにしたいです。

該当のソースコード

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils
import numpy as np

root_dir = "./image/"
categories = ["normal", "boar2", "others"]
nb_classes = len(categories)
image_size = 50

# データ読み込み
def main():
    X_train, X_test, y_train, y_test = np.load("./image/getboar2.npy")
    #データを正規化
    X_train = X_train.astype("float") / 256
    X_test = X_test.astype("float") / 256
    y_train = np_utils.to_categorical(y_train, nb_classes)
    y_test = np_utils.to_categorical(y_test, nb_classes)
    #モデルを訓練 & 評価
    model = model_train(X_train, y_train)
    model_eval(model, X_test, y_test)

#モデル構築
def build_model(in_shape):
    model = Sequential()
    model.add(Conv2D(32, (3, 3), padding='same', input_shape=in_shape))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Conv2D(64, (3, 3), padding='same'))
    model.add(Activation('relu'))
    model.add(Conv2D(64, (3, 3)))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(512))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(nb_classes))
    model.add(Activation('softmax'))
    model.compile(loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics=['accuracy'])
    return model

# 訓練
def model_train(X, y):
    model = build_model(X.shape[1:])
    model.fit(X, y, batch_size=32, epochs=30)
    #モデル保存
    hdf5_file = "./image/decideboar-model.hdf5"
    model.save_weights(hdf5_file)
    return model

#モデル評価
def model_eval(model, X, y):
    score = model.evaluate(X, y)
    print('loss=', score[0])
    print('accuracy=', score[1])

if __name__ == "__main__":
    main()

実行結果

$ python3 getboar_keras2.py
Using TensorFlow backend.
Epoch 1/30
13634/13634 [==============================] - 386s - loss: 1.3277 - acc: 0.9165
Epoch 2/30
13634/13634 [==============================] - 364s - loss: 1.3325 - acc: 0.9169



Epoch 30/30
13634/13634 [==============================] - 351s - loss: 1.3325 - acc: 0.9169
535/535 [==============================] - 5s
loss= 1.43822707305
accuracy= 0.910280388984

補足情報(言語/FW/ツール等のバージョンなど)

参考書
http://www.socym.co.jp/support/s-1079

バージョン情報
appnope (0.1.0)
bleach (1.5.0)
chainer (2.0.1)
cycler (0.10.0)
decorator (4.1.2)
entrypoints (0.2.3)
filelock (2.0.10)
h5py (2.7.0)
html5lib (0.9999999)
ipykernel (4.6.1)
ipython (6.1.0)
ipython-genutils (0.2.0)
ipywidgets (6.0.0)
jedi (0.10.2)
Jinja2 (2.9.6)
jsonschema (2.6.0)
jupyter (1.0.0)
jupyter-client (5.1.0)
jupyter-console (5.1.0)
jupyter-core (4.3.0)
Keras (2.0.8)
Markdown (2.6.9)
MarkupSafe (1.0)
matplotlib (2.0.2)
mistune (0.7.4)
nbconvert (5.2.1)
nbformat (4.3.0)
networkx (1.11)
nose (1.3.7)
notebook (5.0.0)
numpy (1.13.1)
olefile (0.44)
opencv-python (3.3.0.9)
pandas (0.20.3)
pandocfilters (1.4.1)pexpect (4.2.1)
pickleshare (0.7.4)
Pillow (4.2.1)
pip (9.0.1)
prompt-toolkit (1.0.14)
protobuf (3.4.0)
ptyprocess (0.5.2)
Pygments (2.2.0)
pyparsing (2.2.0)
python-dateutil (2.6.1)
pytz (2017.2)
PyWavelets (0.5.2)
PyYAML (3.12)
pyzmq (16.0.2)
qtconsole (4.3.0)
scikit-image (0.13.0)
scikit-learn (0.18.2)
scipy (0.19.1)
setuptools (36.2.7)
simplegeneric (0.8.1)
six (1.10.0)
tensorflow (1.3.0)
tensorflow-tensorboard (0.1.5)
terminado (0.6)
testpath (0.3.1)
tornado (4.5.1)
traitlets (4.3.2)
wcwidth (0.1.7)
webencodings (0.5.1)
Werkzeug (0.12.2)
wheel (0.29.0)
widgetsnbextension (2.0.0)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

だいぶ時間が空いたのでもう解決したかもしれませんが、一応。

yを3カテゴリーにエンコードしているので、おそらく

y = [[1,0,0],
     [1,0,0],
     [0,0,1],
     ...]

のようになっているはずです。
ここから例えばクラス1に相当するmaskを作成して抽出することができます。

mask = y[:, 0]==1

これを用いてそれぞれのクラスの精度を評価するには次にように書き換えればよいはずです。

def model_eval_each(model, X, y):
    for i in range(3):
        mask = y[:, i]==1
        X_ = X[mask]
        y_ = y[mask]
        score = model.evaluate(X_, y_)
        print('loss[class:{0}]='.format(i), score[0])
        print('accuracy[class:{0}]='.format(i), score[1])

更に、どのように判定されているのかを知りたいのであれば、evaluateではなく、predictを使うしかないかと。
例えば、

def model_eval_each(model, X, y):
    for i in range(3):
        mask = y[:, i]==1
        X_ = X[mask]
        y_ = y[mask]
        py = model.predict(X_, y_)
        #cy_はすべてiであるはずです。
        cy_ = np.argmax(y_, axis=1)
        #cpy_でiであるものは正しく分類されています。
        cpy_ = np.argmax(py, axis=1)
        for j in range(3):
            mask2 = cpy_==j
            percentage = np.sum(mask2)/cpy_.shape[0]*100
            print('TrueClass:{0} PredictedClass:{1} Status:{2} Percentage:{3}'.format(i,j,i==j,percentage))

クラスが数字であることに不満があるならば、

labels = ['class1name', 'class2name', 'class3name']

のようなものを作って、i, jなどのところをlabels[i], labels[j]とすればよいかと。

※実際にコードを走らせていないので、カッコが正しく閉じられているかは保証しません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/08 16:16

    PCを買い換えたのでデータを移行してからやってみます。コメントありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    Kerasを用いたCNN3によるcifar10の画像認識

    Keras初心者です。 CNNを理解するためにKerasでモデルを作り、cifar10のデータを元にモデルの認識精度を出力しようとしています。 以下のプログラムに対するエラーの

  • 解決済

    Kerasで訓練データにIDがある場合のベストプラクティスについて

    前提・実現したいこと 一般的なcsvデータをKerasに食わせて他クラス分類を行おうと思っているのですが、 訓練データに含まれるID系のデータの扱いについて困っております。 ID系

  • 解決済

    kerasでcifer10のディープラーニング

     前提・実現したいこと Kerasでcifer10のディープラーニングを試したいです。 fit時にエラーが発生しました。  参考ページ AidemyのCNN画像認識 https

  • 解決済

    CNNの比較、改善点

     知りたいこと cyfer10に使用したCNNでなぜこのような差が出たのか、してはいけないことが含まれていたのか。 aidemyに使われていたCNNと層よりも、より層を増やして適当

  • 解決済

    Kerasでファインチューニング

     前提・実現したいこと 画像分類モデルを作成しています。 その際、Kerasでファインチューニングに挑戦しています。 InceptionやInceptionResNetV2のファイ

  • 解決済

    Tensorflow, kerasで作成したCNNモデルの使い方

     やりたいこと APIで画像分析を今までやってきましたが、もっと深い画像分析をやりたいと思いtensorflowとkerasを使って勉強をはじめました。まずは、イメージを掴むためk

  • 解決済

    kerasによる機械学習において損失係数が低下しない問題、中間層の設定について

    加速度・ジャイロを回転行列で計算し、xyzの3次元で出力したデータを、ravel()で時間軸なしで1次元にしたデータで分類器を作成したく、機械学習を行なっています。 特徴量Xとして

  • 解決済

    KerasでSegnetを行いたい

    https://teratail.com/questions/131885#reply-200116 以前質問させていただいた部分は解決したのですが別の部分でエラーがでてしまいまし

同じタグがついた質問を見る

  • Python 3.x

    5299questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • TensorFlow

    602questions

  • Keras

    163questions