ここから本文です

機械学習のプログラムに関しての質問です。 Python下でkerasライブラリを用いまし...

アバター

ID非公開さん

2018/5/2209:59:22

機械学習のプログラムに関しての質問です。
Python下でkerasライブラリを用いました。

MNISTデータを学習させて、自分自身の手書き数字を読み取る
というプログラムです。

問題は、学習をしっかり行えていることは確かなのですが
返ってくる判別結果が毎回「2」もしくは「5」で、きちんと判別をしてくれません。

以下にコードと出力結果を記します、どこがいけないのかどなたかご指導願います

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
from keras.datasets import mnist
from keras.layers import Activation, Dense
from keras.models import Sequential
from keras import optimizers
from keras.utils.np_utils import to_categorical
import matplotlib.pyplot as plt
from keras.preprocessing import image
import numpy as np
import sys
from PIL import Image
import matplotlib.pyplot as plt

from keras.models import model_from_json

(X_train, y_train), (X_test, y_test) = mnist.load_data()

X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]
y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]

model = Sequential()
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid"))
model.add(Dense(128))
model.add(Activation("sigmoid"))
model.add(Dense(10))
model.add(Activation("softmax"))

model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=["accuracy"])

history = model.fit(X_train, y_train, verbose=1, epochs=10)

#acc, val_accのプロット
plt.plot(history.history["acc"], label="acc", ls="-", marker="o")
plt.ylabel("accuracy")
plt.xlabel("epoch")
plt.legend(loc="best")
plt.show()

### save model and weights
json_string = model.to_json()
open('model.json', 'w').write(json_string)
model.save_weights('weights.h5')


%matplotlib inline


# load model and weight
model = model_from_json(open('model.json').read())
model.load_weights('weights.h5')

filepath = "testSet/img_1.jpg"
# 画像を読み込み、グレースケールに変換し、28x28pixelに変換し、numpy配列へ変換する。
# 画像の1ピクセルは、それぞれが0-255の数値。
image = np.array(Image.open(filepath).convert("L").resize((28, 28)))
print(filepath)
# さらにフラットな1次元配列に変換。
image = image.reshape(1, 784).astype("float32")[0]
result = model.predict_classes(np.array([image / 255.]))
print("result:", result[0])

# 画像を表示
im = Image.open(filepath)
plt.imshow(np.array(im), cmap='gray')

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

補足すみません、プレビューでは出力画像表示されていたのに
更新したら消えてました。。。

Epoch 1/10
6000/6000 [==============================] - 1s 243us/step - loss: 2.0914 - acc: 0.4322
Epoch 2/10
6000/6000 [==============================] - 1s 115us/step - loss: 1.6887 - acc: 0.6958
~~~中略~~~
Epoch 10/10
6000/6000 [==============================] - 1s 109us/step - loss: 0.4971 - acc: 0.9045
<Figure size 640x480 with 1 Axes>
testSet/img_1.jpg
result: 2
<matplotlib.image.AxesImage at 0xf79e86d048>
(手書きの数字画像。。。ここではimg_1.jpg、表示)

閲覧数:
174
回答数:
1
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

ho0********さん

2018/5/2210:33:33

kerasは全く触ったことないので憶測にはなりますが、気になる部分を...

①下の方のmodel.predict_classes、実際に予測している部分では、入力画素値を255で割って0-1の値に落とし込んでいるのに、学習用のデータX_trainとX_testは255で割っていない。
X_train = X_train.reshape(X_train.shape[0], 784)[:6000] / 255
のようにしなくて大丈夫?(書き方がこれで正しいのか分かりませんが)

②MNISTは学習データ60000個とテストデータ10000個あったと思うのですが、わざわざ頭の6000個と1000個だけ取り出す意味がありますか?keras用の中身を見てないので分かりませんが、もし学習で使った6000個のデータにほとんど2と5しか入ってなかった場合や、テスト用1000個に2と5しか入ってなかった場合、学習結果が2と5ばかり出力するのは当たり前ということになります。


一番怪しい原因は①です。

  • ho0********さん

    2018/5/2215:57:06

    あとは、filepathを見た感じ、予測したい画像がいつもimg_1.jpg(同じ画像)になってたりしませんか。入れてる画像が同じなら、予測結果は毎回同じになります。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる