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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

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

Q&A

1回答

297閲覧

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

mizu4423

総合スコア10

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

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

0グッド

1クリップ

投稿2017/09/06 07:30

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

###該当のソースコード

Python3.x

1from keras.models import Sequential 2from keras.layers import Conv2D, MaxPooling2D 3from keras.layers import Activation, Dropout, Flatten, Dense 4from keras.utils import np_utils 5import numpy as np 6 7root_dir = "./image/" 8categories = ["normal", "boar2", "others"] 9nb_classes = len(categories) 10image_size = 50 11 12# データ読み込み 13def main(): 14 X_train, X_test, y_train, y_test = np.load("./image/getboar2.npy") 15 #データを正規化 16 X_train = X_train.astype("float") / 256 17 X_test = X_test.astype("float") / 256 18 y_train = np_utils.to_categorical(y_train, nb_classes) 19 y_test = np_utils.to_categorical(y_test, nb_classes) 20 #モデルを訓練 & 評価 21 model = model_train(X_train, y_train) 22 model_eval(model, X_test, y_test) 23 24#モデル構築 25def build_model(in_shape): 26 model = Sequential() 27 model.add(Conv2D(32, (3, 3), padding='same', input_shape=in_shape)) 28 model.add(Activation('relu')) 29 model.add(MaxPooling2D(pool_size=(2, 2))) 30 model.add(Dropout(0.25)) 31 model.add(Conv2D(64, (3, 3), padding='same')) 32 model.add(Activation('relu')) 33 model.add(Conv2D(64, (3, 3))) 34 model.add(MaxPooling2D(pool_size=(2, 2))) 35 model.add(Dropout(0.25)) 36 model.add(Flatten()) 37 model.add(Dense(512)) 38 model.add(Activation('relu')) 39 model.add(Dropout(0.5)) 40 model.add(Dense(nb_classes)) 41 model.add(Activation('softmax')) 42 model.compile(loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics=['accuracy']) 43 return model 44 45# 訓練 46def model_train(X, y): 47 model = build_model(X.shape[1:]) 48 model.fit(X, y, batch_size=32, epochs=30) 49 #モデル保存 50 hdf5_file = "./image/decideboar-model.hdf5" 51 model.save_weights(hdf5_file) 52 return model 53 54#モデル評価 55def model_eval(model, X, y): 56 score = model.evaluate(X, y) 57 print('loss=', score[0]) 58 print('accuracy=', score[1]) 59 60if __name__ == "__main__": 61 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)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

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

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

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

python

1mask = y[:, 0]==1

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

python

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

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

python

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

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

python

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

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

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

投稿2017/11/07 06:15

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mizu4423

2017/11/08 07:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問