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

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

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

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

6569閲覧

画像認識の正解率が低い原因が分からない

51sep

総合スコア22

Keras

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/13 06:55

編集2020/09/15 00:32

pythonを用いて、機械学習による画像認識を試しています。初心者です。
公式サイト「はじめてのニューラルネットワーク:分類問題の初歩」のモデルを参照し、自作画像で実行してみました。
学習後、学習に使用していない10画像を取込み、予測させたところ、正解率0%でした。
正解率0%の原因は、適切なモデルではない/適切に学習できていない/適切に予測できていない(適切に前処理ができていない?)など色々と考えられますが、原因がわかりません。
どなたかアドバイスをお願いしてもよろしいでしょうか。

■画像データの例
28×28ピクセル、0~9が描かれた各20画像:合計200画像
画像データ

■プログラム(前処理)

v_image = [] v_label = [] for index, name in enumerate(folder): dir = TRAIN_PATH + "\" + name files = glob.glob(dir + "\*.png") print(dir) for i, file in enumerate(files): if COLOR_CHANNEL == 1: img = load_img(file, color_mode = "grayscale", target_size=(INPUT_IMAGE_SIZE, INPUT_IMAGE_SIZE)) elif COLOR_CHANNEL == 3: img = load_img(file, color_mode = "rgb", target_size=(INPUT_IMAGE_SIZE, INPUT_IMAGE_SIZE)) array = img_to_array(img) v_image.append(array) v_label.append(index) v_image = np.array(v_image) v_label = np.array(v_label) v_image = v_image.astype('float32') v_image = v_image / 255.0 v_label = np_utils.to_categorical(v_label, CLASS_NUM) train_images, test_images, train_labels, test_labels = train_test_split(v_image, v_label, test_size=0.20) train_images2 = np.squeeze(train_images) test_images2 = np.squeeze(test_images) print(train_images2.shape) print(test_images2.shape) #(160, 28, 28) #(40, 28, 28)

■プログラム(モデル)

model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(128, activation='relu'), keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(train_images2, train_labels2, epochs=10) #Epoch 1/10 #160/160 [====] - 0s 241us/step - loss: 0.5764 - accuracy: 0.9375 #Epoch 2/10 #160/160 [====] - 0s 94us/step - loss: 0.4676 - accuracy: 0.9250 #Epoch 3/10 #160/160 [====] - 0s 98us/step - loss: 0.3689 - accuracy: 0.9500 #…略 #Epoch 10/10 #160/160 [====] - 0s 108us/step - loss: 0.1200 - accuracy: 1.0000

■プログラム(テストデータの予測):正解率100%
テストデータ:学習に使用した画像と同様に処理した画像データ:40画像
200画像をtrain data(160), test data(40)に分けている

predictions = model.predict(test_images2) for i in range(10): predict=predictions[i] true=test_labels2[i] pred=np.argmax(predict) if true == pred: answer = '〇' else: answer = '×' print("結果",answer,"正解",truename[true],"予測",predname[np.argmax(predict)],"予測確率",100*np.max(predict)) #結果 〇 正解 true1 予測 pred1 予測確率 69.27081942558289 #結果 〇 正解 true6 予測 pred6 予測確率 93.02898645401001 #結果 〇 正解 true1 予測 pred1 予測確率 98.59963059425354 #結果 〇 正解 true1 予測 pred1 予測確率 79.41316366195679 #結果 〇 正解 true5 予測 pred5 予測確率 86.45367622375488 #結果 〇 正解 true7 予測 pred7 予測確率 84.96416211128235 #結果 〇 正解 true0 予測 pred0 予測確率 97.37188220024109 #結果 〇 正解 true7 予測 pred7 予測確率 92.23640561103821 #結果 〇 正解 true8 予測 pred8 予測確率 54.4350802898407 #結果 〇 正解 true2 予測 pred2 予測確率 36.53178811073303

■プログラム(自作画像の予測):正解率0%
自作画像:学習に使用した画像と同様の処理をした(つもり)画像データ:10画像

for i in range(10): img=Image.open(filenames[i]).convert('RGB') img=ImageOps.grayscale(img) img=ImageOps.invert(img) img=img.resize((28,28)) im_np=np.asarray(img) im_np=im_np/255.0 x=im_np.reshape([1,28,28]) predict=model.predict(x) true=int(labels[i]) pred=np.argmax(predict) if true == pred: answer = '〇' else: answer = '×' print("結果",answer,"正解",truename[true],"予測",predname[np.argmax(predict)],"予測確率",100*np.max(predict)) #結果 × 正解 true0 予測 pred1 予測確率 84.3161940574646 #結果 × 正解 true1 予測 pred9 予測確率 28.724533319473267 #結果 × 正解 true2 予測 pred9 予測確率 38.480645418167114 #結果 × 正解 true3 予測 pred1 予測確率 47.03499674797058 #結果 × 正解 true4 予測 pred3 予測確率 50.42678117752075 #結果 × 正解 true5 予測 pred0 予測確率 24.910038709640503 #結果 × 正解 true6 予測 pred1 予測確率 33.938488364219666 #結果 × 正解 true7 予測 pred8 予測確率 27.09353268146515 #結果 × 正解 true8 予測 pred4 予測確率 41.56872630119324 #結果 × 正解 true9 予測 pred0 予測確率 35.21081507205963

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/09/13 08:38 編集

学習画像はMNISTのデータセット(60000くらいだったと思います)ではなくて、自作のデータセット(データ増強無し200枚のみ)、という理解でよろしいでしょうか? > (適切に前処理ができていない?) 0%の原因がここにあるとは思いませんが、0-255のuint8であっても、学習前には0-1のfloatにした方が(正規化した方が)いいかも、というのは目にします。参考まで。 初歩的なミスでよくあるのが、思ったのと違うファイルをロードしてしまっている/前処理をしてしまっていることです。念のため、for文で評価している最中の画像を表示させて確認した方が良いかもしれません。先の方が回答されていますが、原因は「(学習画像はすでに反転済みなのに)テスト時だけimg=ImageOps.invert(img) をして反転させているから」もあり得る話だと思います。 ご確認ください。
51sep

2020/09/13 19:36

fourteenlengthさん、コメントをありがとうございました。 今回の画像は、自作のデータセット(データ増強無し200枚のみ)です。 念のため、画像を表示させてみましたが、該当の画像でした。やはり、前処理の状態がよろしくないようでしょうか。。
退会済みユーザー

退会済みユーザー

2020/09/14 21:55

全体のコードがないので何とも言えませんが、訓練画像と評価画像にtrain_images2, train_labels2のような配列があると思います。ここにダミーデータとしてMNISTを突っ込んで動作確認をしてはいかがでしょうか? MNISTではうまく行った→自前で用意したデータに問題があった MNISTでうまくいかなかった→自前データの前にアルゴリズムに問題があった あとは画像を可視化して表示させる際に、0-1なのか0-255なのかをprintして試した方がいいかもしれません。
51sep

2020/09/15 00:45

fourteenlengthさん、コメントをありがとうございました。 mnistで、今回学習後のmodel.predict()を試したところ、正解率は低かったです。モデルは公式プログラムと同じですので、データの前処理が適切ではないのかなと思い、前処理のプログラムを追加UPさせてもらいました。フォルダに正解ラベルの名前をつけて、画像を20枚ずつ保存しています。 ちなみに、取込み画像で予測する際、float処理の有無も確認してみましたが、予測値は変わりませんでした。
51sep

2020/09/16 03:57 編集

その後の進捗報告です。 初心に戻り、公式プログラムのモデルをMnistを使って実行してみました。 その後、自作画像(10画像)を取り込み、上記「■プログラム(自作画像の予測)」のプログラムにて、予測させてみました。 正解率50%になりました。 また、前処理の方法をモデル投入時と同じ方法にして予測させてみましたが、やはり、上記「■プログラム(自作画像の予測)」の予測確率と同じでした。 素人考えの見解ですが、つまり、前処理・モデルは、現状、特に問題はなく、、モデルの学習具合(データ数)によるということでしょうか。もうそこぐらいしか思いつきません。。 学習に使用した画像は、全部で200画像でフリーのサイトから拝借したもので非常に少ないです。そこからtrainに160、testに40に分け、testデータをバリデーションしました→正解率100%。一方、予測に使った取込み画像は、私の手書きのオリジナルでした(28*28ピクセルに手書きで書いた)。学習不足で、認識が0だったということなのでしょうか。。 testデータの正解率が高くても、外部取込みの正解率が高くないと、なんだかtestデータで確認する意味もないような、、素人としては次にどうしていくか悩ましいところです。
退会済みユーザー

退会済みユーザー

2020/09/16 10:02

> mnistで、今回学習後のmodel.predict()を試したところ、正解率は低かったです > その後の進捗報告です。 > 初心に戻り、公式プログラムのモデルをMnistを使って実行してみました。 これはMNISTの画像とラベルを「train_images, test_images, train_labels, test_labels 」に代入して学習して、MNISTのデータで検証した、という理解(pythonのコードやネットワーク構造は掲載のままで、MNISTの学習データを使って学習させ、MNISTの検証データで検証した)でよいでしょうか? 確かMNISTは中間層が3層くらいでも10周するだけで95%くらいの精度まで稼げるはずですので、これが低いようであればネットワーク構造やハイパーパラメータが怪しい気もします。適合率も大事ですが、Lossがちゃんと減っているかも指標にすると何か見えるかもしれません。
退会済みユーザー

退会済みユーザー

2020/09/17 09:35

(手元のPython(Tensorflow)の具合がいまいちですので、)土曜日くらいに時間ができたら確認します。
51sep

2020/09/18 07:57

fourteenlengthさん、コメントをありがとうございます。 すみません、あれからまだ再確認できていませんが、初心に戻って実行したのは、以下のとおりです。 「MNISTの画像とラベルを「train_images, test_images, train_labels, test_labels 」に代入して学習して、MNISTのデータで検証した」 →ファッションMNISTをMNISTにしただけで、あとのコードは掲載のままです。 →実行後のモデルで、自分の手書き画像10枚を予測させたところ、5枚当たりました(正解率50%) こんな感じです。。
guest

回答2

0

ベストアンサー

工程を俯瞰する。

データを確保する:最終的には自前にしたい

(前処理:リサイズ他):最終的には自前にしたい

ネットワークを定義する:既定のものよりもシンプルなネットワークで試す
(精度は多少落ちたとしても全くもって見当違いにはならなさそう)

学習する:特に触らない

検証する:特に触らない

実証されているシンプルなもので試す。

先の工程をまずは実証されてる一番簡単な例で試します。
CNNではMNIST、学習用60000枚、テスト用10000枚です。
これを掲載のネットワークで走らせます。

つづいて、掲載の通りまでデータセットを縮めます。
学習用160枚、テスト用40枚ですね。

既定削減
Train60000枚160枚
Loss0.04520.7380
Acc98.6%88.1%
**Test **10000枚40枚
Loss0.06841.1152
Acc97.9%67.5%

精度はともかく、とりあえず正常に学習が進んだことは確認できました。

結果について考える。

ここから、既定のMNISTでも、既定より削減したものでも、TrainのほうがTestよりも精度が高くLossも少ないことが分かります。…割り当てたデータ量を考えれば当たり前と言えば当たり前ですが、データ数が多い既定の方ではそれほどLossの変化はありませんし、値も0.0x程度と相当誤差が少ないことが分かります。一方、データ数が少ない方ではLossがまだまだ1近くでもっと減らないかなぁという感じがします。
※ネットワーク構造やデータによってLossの値は変化しますので直感的な理解として捉えて下さい。

NNの事例を考えるときには、正解率も大事ですが、Lossのことも気にしてあげてください。Lossがちゃんと減っているか(迷って何となく正解になってしまったのか、ほぼ迷わずに正解になったのか)にNNの気持ち(?)が出てくると思います。

どうしたらよいか考える。

実際の生データは見えておりませんが、51sepさんはここに掲載してからも相当検証をされているようですので、画像のチャネル数、寸法、白黒反転、実は画像とラベルとが食い違っているといったポカはないものと思います。とりあえずMNISTで動くことは確認できていますので、ネットワーク構造や学習率もとりあえずは問題ない、と見ていいと思います。
ここまで来ると、もうピンときているかもしれませんが、画像のデータのボリュームが一番怪しいだろうと思います。

生画像が200枚あるそうですので、データ増強をして画像を数万枚まで増やせばそれなりに満足のいくものが得られると思います。
例えば、縦横数pxシフトする、少し回転させる、台形状にひずませる、ごま塩ノイズを加えるなどです。キーワードはデータ増強data augumentationです。

さらに、
学習用画像160枚は100%、テスト画像40枚は0%という内容も書かれていたかと思います。もしこれが合っているのであれば、これは典型的な過学習ですので、良くある対策は以下の2つです。

  • 上記の通りデータ増強等を使ってデータを増やす
  • Dropout

何か不明な点がありましたらコメントください。

Python3

1import tensorflow as tf 2 3def get_model(): 4 model = tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape=(28, 28)), 5 tf.keras.layers.Dense(128, activation=tf.nn.relu), 6 tf.keras.layers.Dense(10, activation=tf.nn.softmax) ]) 7 model.compile(optimizer='adam',loss='sparse_categorical_crossentropy', metrics=['accuracy']) 8 return model 9 10print("---------------------") 11print("| MNIST (FULL SIZE) |") 12print("---------------------") 13mnist = tf.keras.datasets.mnist 14 15(x_train, y_train),(x_test, y_test) = mnist.load_data() 16x_train, x_test = x_train / 255.0, x_test / 255.0 17print("Train",x_train.shape) 18print("Test",x_test.shape) 19# Train (60000, 28, 28) 20# Test (10000, 28, 28) 21 22model = get_model() 23model.fit(x_train, y_train, epochs=5) 24# Epoch 5/5 25# 60000/60000 [==============================]60000/60000 [==============================] - 23s 390us/step - loss: 0.0452 - acc: 0.9862 26 27result =model.evaluate(x_test, y_test) 28# 10000/10000 [==============================]10000/10000 [==============================] - 2s 163us/step 29 30print(dict(zip(model.metrics_names, result))) 31# {'loss': 0.06843711965740658, 'acc': 0.9788} 32 33print("---------------------") 34print("| MNIST (REDUCED) |") 35print("---------------------") 36 37(x_train, y_train),(x_test, y_test) =(x_train[:160], y_train[:160]),(x_test[:40], y_test[:40]) 38print("Train",x_train.shape) 39print("Test",x_test.shape) 40# Train (160, 28, 28) 41# Test (40, 28, 28) 42 43model = get_model() 44model.fit(x_train, y_train, epochs=5) 45# Epoch 5/5 46# 160/160 [==============================]160/160 [==============================] - 0s 450us/step - loss: 0.7380 - acc: 0.8812 47 48result =model.evaluate(x_test, y_test) 49# 40/40 [==============================]40/40 [==============================] - 0s 3ms/step 50 51print(dict(zip(model.metrics_names, result))) 52# s{'loss': 1.1152454614639282, 'acc': 0.675} 53 54

投稿2020/09/19 07:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

51sep

2020/09/21 07:34

fourteenlengthさん、ご回答をありがとうございました。 明解に分析してくださって、感謝しております。 (このまま文献にでもなりそうな内容で、、) ご提示のプログラムを実行させて頂きました。 そして、私の手書きの0~9の画像10枚(28*28ピクセル)を「規定」「削減」で実行後のモデルで予測させてみました。 以下が結果です。 ■「規定」で予測した結果(6画像が正解)60% 結果 × 正解 true0 予測 pred3 予測確率 94.7684645652771 結果 〇 正解 true1 予測 pred1 予測確率 97.16148972511292 結果 〇 正解 true2 予測 pred2 予測確率 96.51031494140625 結果 〇 正解 true3 予測 pred3 予測確率 99.99936819076538 結果 × 正解 true4 予測 pred5 予測確率 74.25382137298584 結果 〇 正解 true5 予測 pred5 予測確率 98.52708578109741 結果 〇 正解 true6 予測 pred6 予測確率 54.002946615219116 結果 〇 正解 true7 予測 pred7 予測確率 96.21085524559021 結果 × 正解 true8 予測 pred3 予測確率 99.99935626983643 結果 × 正解 true9 予測 pred3 予測確率 99.8683750629425 ■「削減」で予測した結果(3画像が正解)30% 結果 〇 正解 true0 予測 pred0 予測確率 48.61307442188263 結果 〇 正解 true1 予測 pred1 予測確率 76.18167996406555 結果 × 正解 true2 予測 pred3 予測確率 54.467350244522095 結果 〇 正解 true3 予測 pred3 予測確率 59.504109621047974 結果 × 正解 true4 予測 pred2 予測確率 67.54993796348572 結果 × 正解 true5 予測 pred3 予測確率 51.28733515739441 結果 × 正解 true6 予測 pred4 予測確率 31.245866417884827 結果 × 正解 true7 予測 pred4 予測確率 34.73733067512512 結果 × 正解 true8 予測 pred3 予測確率 45.21409869194031 結果 × 正解 true9 予測 pred4 予測確率 39.78448212146759 何回か実行させてみました。毎回、結果は異なりますが、上記のように「規定」の方が〇が多かったです。 accのとおりということでしょうか。 やっぱり、ご回答のとおり、学習させるデータの質や量に依存するという、基本的な問題…ということになりそうです。 データ増強の件は、以下の公式サイトを参考にして実行したことがあります。 https://www.tensorflow.org/tutorials/images/classification この公式サイトは2クラスで、10クラスではありませんでした。自力で10クラスに対応させて実行させたことがありましたが、今回と同様の「私の手書きの0~9の画像10枚」を予測させていないので、比較ができていません。でも、testデータのaccはほぼ1の値でした。 その他、公式サイトの転移学習もチャレンジしていますが、ここは、精度が上がらずで、うまいこと転移学習できていない…と言う結論で、現在とまっています。。 https://www.tensorflow.org/tutorials/images/transfer_learning? 素人の感想としては、自分で用意した特定の画像で当たるか当たらないかが重要なので、単純にそのモデルの正確度を追求しても意味がないように思えてしまいます(そのモデルの正確度が90%でも10%でも、その特定の画像にとっては当たれば100%…みたいな感覚)。とはいえ、、プログラムを動かす・原理を理解するといった基本の先の、「よくある疑問」「よくぶち当たる問題」を初めて経験したことに、少し進歩を感じたような…気がしています。 何を予測したいか、そのために学習データのどのような質と量に持っていくか、この辺りを明確にしないと、自作の場合は厳しいのかな…と思いました。
退会済みユーザー

退会済みユーザー

2020/09/21 21:40

> 自分で用意した特定の画像で当たるか当たらないかが重要なので、単純にそのモデルの正確度を追求しても意味がないように思えてしまいます(そのモデルの正確度が90%でも10%でも、その特定の画像にとっては当たれば100%…みたいな感覚)。 「MNISTで精度が高いからと言って、同じネットワークモデル・重みデータを"自前の手書き数字データセット"に割り当てても精度が良いとは限らない」と理解しました。 一般論で言えば、その通りと思います。MNISTの手書き数字と、自前の手書き数字とで「偏り(クセ?)」があるためです。 この偏りについては、掲載の画像5枚を見る限り、51sepさんの自前画像は「ゴシックに近い文字で画像の淵まで目一杯のフォント」の様に見えます。もし、MNISTのデータセットで学習させたモデルで正解率を高くしようとすると、「自前データセットを一周り縮小した上で外側を黒で縁取りして元の画像サイズを保つ」をすると精度が上がりそうな気がします。時間がありましたらお試しください。 参考:https://qiita.com/tackey/items/ea0a452adeac08c424d7
51sep

2020/09/22 07:30

fourteenlengthさん、ご回答をありがとうございました。 今回、色々と勉強になりました。どうもありがとうございました。 「偏り(クセ)」も影響するということ、留意したいと思います。 今回、学習させるデータが重要そうということで、もう一度以下のサイトを、MNISTで試してみようと調べ始めましたが、変換できずにグダグダしています。 データをMNISTに変えるだけ…のはずなのに、いつも前処理で撃沈です。 まだまだ自分の思い通りのことを試すには、時間がかかりそうです。。 https://www.tensorflow.org/tutorials/images/classification
退会済みユーザー

退会済みユーザー

2020/09/22 09:21 編集

MNISTでいえば、フォルダ名の 'cats'や 'dogs'を、 '0', '1'に差し替える感じ(ただしグレースケールに変更)になると思います。 前処理の中身は、イメージとラベルと一対一で連動する順番で記録する、0-1で正規化して画像を保存する、が基本だと思います。この点(のみ)に注意してプログラムを読むと、関係ないコードと関係のあるコードが分かれて見えて見通しが良くなるのではないでしょうか? コメント欄でデータをやり取りするには限界があると思いますので、 0. ○○を進めるためにトイプロブレムとしてMNISTを選び、 1. どのページを参考にして 2. どこまでやってすすめたところ、 3. どういうエラーが起きて困っている(そのコード、できれば関係する部分一式も投稿) のような感じで質問を起こした方が良いと思います。 ※上記の0-3よりは、teratail標準のフォームに従った方がいいです。あとは、この質問でも51sepさんがされたように、「○○まで自分でやって、調べて、どうしてもわからないので質問として投稿しています」という書き方ができれば、ここの諸兄姉からきちんとしたアドバイスがもらえると思います。
51sep

2020/09/23 07:53

fourteenlengthさん、ご助言をありがとうございました。 先ほど、新しく質問してみました。 公式サイトの猫・犬のデータをMNISTにして、10クラスで実行してみたいと思いました。そもそもMNISTを「flow_from_directory」で処理できるのか、、も分かりません。。本当に初歩的で、お恥ずかしいですが、他に聞ける人もいないので、投稿してみました。 公式サイトも分かりやすいのでしょうけど、使うデータや手法がそれぞれなので(一貫性がないというか…)、初学者にはキツイです。
guest

0

自作画像の白と黒を反転してみるのはどうでしょうか?

投稿2020/09/13 07:12

yymmt

総合スコア1615

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

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

51sep

2020/09/13 19:29

yymmtさん、ご回答をありがとうございました。 恥ずかしながら、初心者ですので、ここまで色々な方に伺ったり、皆様のプログラムをコピペしたり…で、まだ自分の思い通りにプログラムを書けません。。 で、すみません、「自作画像の白と黒を反転」とは、どのようにしたらよいでしょうか。。とりあえず、「img=ImageOps.invert(img)」を削除しても、結果は変わりませんでした。
yymmt

2020/09/13 19:58

該当する行を削除することで白黒反転はできていると思われます。「結果が変わらない」ということですので別の理由がありそうです。 ありがちなのは変換途中に値が変わってしまうことでしょうか。print(x[0])をしてprint(train_images[0])の結果と見比べてみて下さい。
51sep

2020/09/14 03:47

yymmtさん、ご返信をありがとうございました。 ご助言のとおり、print(x[0])、print(train_images[0])を試してみたところ、値が違っていました。 以下のような出力でした。 これは「変換途中に値が変わってしまう」ということでしょうか。 (…どのように対処したらよいのでしょうか。。) print(x[0])の出力例 [0. 0. 0. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 0と1で表示され、28*28(上記の[]のかたまりが28行)でした。 print(train_images[0])の出力例 [1. 1. 1. 1. 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 0.10196079 1. 1. 1. 1. 1. 1. ] 0.10196079と1で表示され、28*28(上記の[]のかたまりが28行)でした。
yymmt

2020/09/14 11:01

パッと見た感じだと悪いようには見えません(すべて0.になっていると予想していました)が、訓練データの黒の値が0.10196079になっているのが気になります。試しに次の2行をpredictの前に入れてみて、自作画像のゼロの値を同じ値に強制的に変更してみるのはどうでしょうか。 black = 0.10196079 x[x < black] = black
51sep

2020/09/15 00:38

yymmtさん、ご返信をありがとうございました。 ご提示のプログラムを実行してみたところ、やはり予測値(model.predict()の値)は変わりませんでした。上記のfourteenlengthさんのアドバイスも試してみまして、mnistデータでも、この学習後のモデルのmodel.predict()の値は低かったです。ということは、モデル自体は公式プログラムと同じですので、投入前の前処理がNG?しかないのかな…と思いまして、前処理のプログラムを追記UPしました。もしもお気づきの点がございましたら、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問