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

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

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

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

Python 3.x

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

1549閲覧

深層学習を行うプログラムでのエラー

mizu4423

総合スコア10

Keras

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

Python 3.x

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2017/09/04 17:14

編集2017/09/05 05:38

###前提・実現したいこと
深層学習で動物の画像を種類ごとに分類するプログラムをPythonで書いています。「Pythonによるスクレイピング&機械学習」という本のp353を参考に、コマンドラインから入力データを送り、それがどの種類に分類されるか判定するプログラムを作成しましたが、分類を行いません。

###発生している問題・エラーメッセージ
訓練したモデルは判別率9割ほどにも関わらず、どの画像を与えても、分類するカテゴリーの一番最初の物にしかならない。(for文が回ってない?)

実行結果
$ python3 getboar-checker.py sample.JPG STC_0232.JPG STC_0280.JPG STC_0141.JPG STC_1442.JPG
Using TensorFlow backend.
+ 入力: sample.JPG
| 動物: nothing
| 状態: 0
+ 入力: STC_0232.JPG
| 動物: nothing
| 状態: 0
+ 入力: STC_0280.JPG
| 動物: nothing
| 状態: 0
+ 入力: STC_0141.JPG
| 動物: nothing
| 状態: 0
+ 入力: STC_1442.JPG
| 動物: nothing
| 状態: 0

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

Python

1import getboar_keras2 as getboar 2import sys, os 3import codecs 4from PIL import Image 5import numpy as np 6 7#ファイル名が入っているかどうかを確認 8if len(sys.argv) <= 1: 9 print("getboar-checker.py (ファイル名)") 10 quit() 11 12#入力画像をNumpy配列にする 13image_size = 50 14categories = ["nothing", "others", "boar2"] 15state = [0, 1, 2] 16 17X = [] 18files = [] 19for fname in sys.argv[1:]: 20 img = Image.open(fname) 21 img = img.convert("RGB") 22 img = img.resize((image_size, image_size)) 23 in_data = np.asarray(img) 24 X.append(in_data) 25 files.append(fname) 26X = np.array(X) 27 28#CNNのモデルを構築 29model = getboar.build_model(X.shape[1:]) 30model.load_weights("./image/hogetboar-model.hdf5") 31 32#データを予測 33html = "" 34pre = model.predict(X) 35for i, p in enumerate(pre): 36 y = p.argmax() 37 print("+ 入力:", files[i]) 38 print("| 動物:", categories[y]) 39 print("| 状態:", state[y]) 40 html += """ 41 <h3>入力:{0}</h3> 42 <div> 43 <p><img src="{1}" width=300></p> 44 <p>動物 :{2}</p> 45 <p>状態 :{3}</p> 46 </div> 47 """.format(os.path.basename(files[i]), 48 files[i], 49 categories[y], 50 state[y]) 51 52#レポートを保存 53html = "<html><body style='text-align:center;'>" + \ 54 "<style> p { margin:0; padding:0; } </style>" + \ 55 html + "</body></html>" 56with codecs.open("getboar-result.html", "w", "shift_jis") as f: 57 f.write(html) 58

###試したこと
参考書のサンプルコードを自分の使っているデータセットを使った場合でやってみたが、結果は変わらなかったため、サンプルコードが間違っている可能性も考えられる。
画像データを減らしてやってみたが、効果なし。
binary_crossentropyをcategorical_crossentropyにしたが、効果なし。

###補足情報(言語/FW/ツール等のバージョンなど)
Python3.6.1
tensorflow (1.3.0)
tensorflow-tensorboard (0.1.5)
Keras (2.0.8)
numpy (1.13.1)

参考書のサンプルコードなど(ch07に入ってます)
http://www.socym.co.jp/download/1079/src.zip

また、以下の2つのプログラムによって、Numpyのデータ生成と、訓練を行った。

(1)データをNumpy配列に変換し、チューニングするプログラム(getboar-makedata2.py)

Python

1from PIL import Image 2import os, glob 3import numpy as np 4import random, math 5 6root_dir = "./image/" 7categories = ["nothing", "boar2", "others"] 8nb_classes = len(categories) 9image_size = 50 10 11X = [] 12Y = [] 13def add_sample(cat, fname, is_train): 14 img = Image.open(fname) 15 img = img.convert("RGB") #カラーモードの変更 16 img = img.resize((image_size, image_size)) #画像サイズの変更 17 data = np.asarray(img) 18 X.append(data) 19 Y.append(cat) 20 if not is_train: return 21 22 for ang in range(-20, 20, 5): 23 img2 = img.rotate(ang) 24 data = np.asarray(img2) 25 X.append(data) 26 Y.append(cat) 27 img2 = img2.transpose(Image.FLIP_LEFT_RIGHT) 28 data = np.asarray(img2) 29 X.append(data) 30 Y.append(cat) 31 32def make_sample(files, is_train): 33 global X, Y 34 X = []; Y = [] 35 for cat, fname in files: 36 add_sample(cat, fname, is_train) 37 return np.array(X), np.array(Y) 38 39allfiles = [] 40for idx, cat in enumerate(categories): 41 image_dir = root_dir + "/" + cat 42 files = glob.glob(image_dir + "/*.JPG") 43 for f in files: 44 allfiles.append((idx, f)) 45 46random.shuffle(allfiles) 47th = math.floor(len(allfiles) * 0.6) 48train = allfiles[0:th] 49test = allfiles[th:] 50X_train, y_train = make_sample(train, True) 51X_test, y_test = make_sample(test, False) 52xy = (X_train, X_test, y_train, y_test) 53np.save("./image/hogetboar.npy", xy) 54print("ok,", len(y_train))

Python (2)CNNで学習させるプログラム(getboar-keras2.py)

Python

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 = ["nothing", "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/hogetboar.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 = 'categorical_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/hogetboar-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()

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

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

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

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

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

mizu4423

2017/09/05 05:18

一応、今回の警告はkerasのバージョンアップによるもので、無視してもプログラムは問題なく動くとのことだったので、放置してました。ただ、quiquiさんの仰ることも尤もだと思いますので、結果は変わりませんでしたが、色々直しました。ご指摘ありがとうございます。
guest

回答1

0

CNNの学習で、損失関数を'binary_crossentropy'ではなく'categorical_crossentropy'に変えてみてはどうでしょうか?

投稿2017/09/05 04:12

renin

総合スコア13

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

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

mizu4423

2017/09/05 05:15

変えてみましたが、同じでした。 ご回答ありがとうございます。
renin

2017/09/05 05:30

同じというのは、訓練しなおしても同じ判別率になったということでしょうか?
mizu4423

2017/09/05 05:49

いえ、同じというのは上記のプログラムを実行し、コマンドラインから画像を与えても、修正前と同じように分類が行われなかったという点です。どの画像を何枚与えようが、全て、categories("nothing", "others", "boar2")のnothingになってしまいます。 また、binary_crossentropyからcategorical_crossentropyに変更すると判別率が67%から25%という変化が見られました。修正後のソースコードをあげたので何か間違ってたら仰ってください。
renin

2017/09/05 07:15

訓練時はデータを256で割って正規化しているのに、入力画像を予測するときはそのまま入力としているように見えます。X = np.array(X)の後にX = X.astype("float") / 256 を追加してみてはどうでしょうか?
mizu4423

2017/09/05 08:01

ご回答ありがとうございます。 追加してみましたが、解決しませんでした。 結果は修正前と同じです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問