Kerasで1つのインスタンスのみの予測を取得するにはどうすればよいですか?


13

Kerasに、次のようなラベルのない新しいデータセットにフィットモデルを使用した予測を適用するように要求すると、

model1.predict_classes(X_test)

それは正常に動作します。しかし、1行だけを予測しようとすると失敗します。

model1.predict_classes(X_test[10])

Exception: Error when checking : expected dense_input_6 to have shape (None, 784) but got array with shape (784, 1)

なんでかしら?

回答:



7

predict_classes(num_instances, features)ように、形状の2D配列を期待していX_testます。しかし、のように単一のインスタンスにインデックスを付けると、X_test[10]形状の1D配列が返されます(features,)

追加の軸を戻すには、、、、またはを使用するか、そもそもそれを削除しないでください(たとえばを使用して)。np.expand_dims(X_test[10], axis=0)X_test[10][np.newaxis,:]X_test[10:11]


動作していないようです。エラーメッセージはありませんが、出力もありません。変。
Hendrik

5

現在(Keras v2.0.8)は、バッチでトレーニングした後、単一行の予測を取得するのに少し手間がかかります。

基本的に、batch_sizeはトレーニング時に固定され、予測時に同じでなければなりません。

現在の回避策は、トレーニングされたモデルから重みを取得し、それらを、今作成したばかりの新しいモデル(batch_sizeが1)の重みとして使用することです。

そのための簡単なコードは

model = create_model(batch_size=64)
mode.fit(X, y)
weights = model.get_weights()
single_item_model = create_model(batch_size=1)
single_item_model.set_weights(weights)
single_item_model.compile(compile_params)

より深く掘り下げたブログ投稿は次のとおりです。https//machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/

私は過去にこのアプローチを使用して、予測時に複数のモデルを作成しました。1つは大きなバッチで予測を行い、もう1つは小さなバッチで予測を行い、もう1つは単一のアイテムで予測を行います。バッチ予測の方がはるかに効率的であるため、予測をかなり迅速に取得しながら、(batch_sizeで割り切れる数だけでなく)任意の数の予測行を柔軟に取り込むことができます。


3

これは、1つの要素(今回は17)を予測する方法です。

model.predict_classes(X_test[17:18])

答えの何が問題になっていますか?
Supamee、

2

あなたはただ1つの例でリストを渡すべきです、私は今テストすることができませんが、これはうまくいくはずです:

model1.predict_classes([X_test[10]])

残念ながら動作しません。
Hendrik

1
self.result = self.model.predict(X)

Xはnumpy配列です。それが私がしたすべてであり、それはうまくいきました。


1

私は次のアプローチを使用してこれを修正しました:

single_test = X_test[10]
single_test = single_test.reshape(1,784)

reshape関数の機能の数(784)は上記の例に基づいていることに注意してください。機能が少ない場合は、調整する必要があります。

それもあなたのために働くことを願っています。


1

インスタンスを出力しようとすると、次のようになります。

x_test:\n
array([[0., 1., 1., ..., 0., 0., 0.],
        [0., 1., 1., ..., 0., 0., 0.],
        [0., 1., 1., ..., 0., 0., 0.],
        ...,
        [0., 1., 0., ..., 0., 0., 0.],
        [0., 1., 1., ..., 0., 0., 0.],
        [0., 1., 1., ..., 0., 0., 0.]])

x_test[0]:
array([0., 1., 1., ..., 0., 0., 0.])

したがって、np.arrayを使用して次元を追加し直すことができると思います。

mode.predict(np.array(x_test[0],ndmin=2))

0

これは、トレーニングデータが(784、1)という形になったことを意味します。次のように変形することができます。それは私のために働いた。

model1.predict_classes(X_test[10].reshape(784,1))

transpose()形状が(1,784)の場合も実行できます。

model1.predict_classes(X_test[10].transpose())
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.