🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Keras

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2161閲覧

Predictの配列結果は、どう処理すればよいのでしょうか?

026sky

総合スコア1

Keras

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/03/12 08:14

TFの勉強をしています。

チュートリアルに則り、
https://www.tensorflow.org/tutorials/keras/text_classification?hl=ja
をトレースしています。

最終的に予測値(0 or 1)を出力するにあたり、
nはサンプル番号として、
model.predict(partial_x_train)[n] とか、
model.predict(partial_x_train[n]) とかで出るように思えるのですが、
配列が出てきてしまいます。
この配列をどうにか処理したら0 or 1になると思うのですが、よくわかりません。

よろしくお願い致します。

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

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

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

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

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

aipy2020

2021/03/13 16:31

>配列が出てきてしまいます。 とありますが、具体的にどんな配列が出力されるのでしょうか? >この配列をどうにか処理したら0 or 1になると思うのですが、よくわかりません。 具体的に、質問者さんはどういう出力を得たいと思っているのでしょうか?
026sky

2021/03/15 05:56 編集

回答ありがとうございます。 >>具体的にどんな配列が出力されるのでしょうか? [[6.5414987e-15] [3.0061603e-04] [5.8463514e-03] [3.0522831e-05] [0.0000000e+00] [0.0000000e+00] [0.0000000e+00] [1.0000000e+00] [9.9848169e-01] [2.3299783e-05] [7.1508127e-01] [1.0000000e+00] [9.9848169e-01] [7.5492764e-08] [1.8361345e-05] [9.9846405e-01] [1.0000000e+00] [1.7488294e-19] [3.5529952e-32] [9.9848169e-01] [1.0316495e-37] [0.0000000e+00] [2.6193261e-04] [1.7978909e-12] [9.9998057e-01] [9.9920094e-01] [1.1961475e-11] [7.9319025e-14] [1.0000000e+00] [9.9999893e-01] [1.0290895e-05] [1.0000000e+00] [1.1205060e-24] [3.6999881e-03] [1.0000000e+00] [1.0000000e+00] [1.0000000e+00] [1.1032738e-15] [5.5212504e-01] [5.5212504e-01](以下、同値) >>具体的に、質問者さんはどういう出力を得たいと思っているのでしょうか? 0 or 1 です。 2値問題のため、データに対するラベルは0 or 1が用意されており、それで訓練してあります。なので、ある1つのデータを入力したpredict結果は、0 or 1もしくはその間のスカラー値が出力されるべきかと思うのですが、私の理解が違うのでしょうか? 戻り値として、入力データと同サイズの配列が出力されています。 例えばこれを足し合わせて、要素数で割ったものが、0 or 1に相当するものなのでしょうか? その場合、 n=サンプル番号 preds=model.predict(partial_x_train[n]).sum()/len(preds) がそれに相当するものと思いますが(違っていたらご指摘下さい)、 各サンプルで、0.5付近の値になり、 正答率(accuracy)が87%と謳っているにもかかわらず、全然あっていません。 処理の仕方がおかしいのでしょうか?
guest

回答2

0

ベストアンサー

入力するサイズに注意すると、1データあたり1つの予測値を出力します。

python

1model.predict(test_data[0].reshape(1,-1)) 2>>array([[0.06148067]], dtype=float32)

モデルに(1, 256)のサイズを入力すると、1データ、256次元の解釈ですが、
(256,)を入力すると、256データ、256次元(ブロードキャストされる)という解釈ではないでしょうか。

python

1pred1 = model.predict(np.tile(test_data[0].reshape(-1,1), 256)) 2pred2 = model.predict(test_data[0]) 3print(np.stack([pred1, pred2], axis=1)) 4>> 5[[[3.54219917e-11] 6 [3.54220576e-11]] 7 8 [[3.78321127e-13] 9 [3.78325436e-13]] 10 11 [[1.17683128e-04] 12 [1.17683128e-04]] 13 14 [[1.46275759e-03] 15 [1.46269798e-03]] 16 17 [[2.73859501e-03] 18 [2.73859501e-03]] 19...

実際に、pred1とpred2がほぼ同じ値を出力しています。

投稿2021/03/15 14:35

編集2021/03/15 14:37
nanoseeing

総合スコア133

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

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

026sky

2021/03/18 02:35 編集

回答ありがとうございます。(返信遅れてすみません。) ということは、やはり n=サンプル番号 preds=model.predict(partial_x_train[n]).sum()/len(preds) がそのサンプルに対する0~1(の中間値)ということですね。 評価の仕方が間違っていたのかもしれません。 もう一度検証してみます。 ありがとうございました。 (追記) https://www.tensorflow.org/tutorials/keras/text_classification?hl=ja のコードを実行し、 Epoch 40/40 30/30 [==============================] - 1s 20ms/step - loss: 0.0961 - accuracy: 0.9750 - val_loss: 0.3099 - val_accuracy: 0.8828 訓練データでaccuracy: 0.9750 のモデルで、 preds=model.predict(partial_x_train[n]).sum()/len(preds) を使い、「訓練データで」正解率を検証してみましたが、 0.5以上を1、未満を0すると、63% 平均値(0.56)を閾値とすると、77%となり、97%には遠く及びません。 Predict(もしくは違う式)をどう処理すれば、0 or 1に辿り着けるのでしょう? 少なくとも「訓練データ」では、97%で0 or 1を一致させる処理(演算式)があるはずなのですが。。。 質問の仕方を変えると、 model.evaluate(test_data, test_labels)の「test_data」はどのような形で「test_labels」と比較されているのでしょう? 私はこれがmodel.predict(... )だと考えているのですが、違っていたらご指摘下さい。
nanoseeing

2021/03/18 04:09 編集

2値分類問題ですので、1データに対する予測値は、1つしか出力されません。 ただし、modelに入力する形状は、 (データ数, 次元数)のサイズでなくてはなりません。 ``` python data1 = partial_x_train[0].reshape(256, 1) data2 = partial_x_train[0].reshape(1, 256) pred1 = model.predict(data1) pred2 = model.predict(data2) print("input:", data1.shape, " >> ", "output:", pred1.shape) print("input:", data2.shape, " >> ", "output:", pred2.shape) ``` ``` input: (256, 1) >> output: (256, 1) input: (1, 256) >> output: (1, 1) ``` 上記の例のように、 data1・data2は、行ベクトル・列ベクトルの違いはありますが、1つのデータです。 しかし、data1は256データ、data2は1データと解釈されて、予測値が出力されています。 正解率 (accuracy) の計算方法は、 閾値で0, 1のラベルに振り直す計算方法もありますが、 (予測値, 正解ラベル) = (0.7, 1) なら、70% (予測値, 正解ラベル) = (0.2, 0) なら、80% のように、確率値をそのまま利用して計算します。
026sky

2021/03/18 07:23

丁寧な解説ありがとうございます。 理解できました。 私は(1, 256)を入力しなければいけないところを、(256, 1)を入力してしまったわけですね。 predictに.reshape(1,-1)を追加したところ、予定していたスカラー値が取得できました!!! 本当にありがとうございました。
guest

0

n=サンプル番号
preds2=model.predict_classes(partial_x_train)[n]

で、正答率97%が再現しました。
「predict」ではなく、「predict_classes」を使うべきでした。

回答いただいた皆様ありがとうございました!!!

投稿2021/03/18 03:21

026sky

総合スコア1

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

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

nanoseeing

2021/03/18 04:31

解決したとのことで良かったのですが、 predict_classes()は、predict()の予測確率を閾値0.5で、0,1にラベルわけしただけですので、本質的には同じです。 入出力の形状や、正解率の計算方法で誤解があると思われますので、前回のコメントをご参考ください。
026sky

2021/03/18 05:16

ご親切にありがとうございます。 ということは、 preds=model.predict(partial_x_train[n]).sum()/len(preds) コレが間違っているのですね。 あるサンプルの出力全要素を足し合わせて、 要素数で割っているつもりなのですが、どこがおかしいですか? たしかに、この結果を閾値0.5で仕分けしても、正答率には辿り着けませんでした。。。 結局、前回コメントいただいたpredをどう処理すれば、0~1になるのかが分かりません。 (今回の質問の本質は正にココです。)
nanoseeing

2021/03/18 05:54

ですので、入出力の形状を誤解していませんか? 1個のデータを入力すれば、1個の予測値が出力されますし、 n個のデータを入力すれば、n個の予測値が出力されます。 1個のデータを入力したはずなのに、複数の値が出力される状況というのは、モデルに入力するデータの形状を間違えているわけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問