2017-07-07 315 views
4

はkeras documentationによると:Kerasモデルのpredictメソッドとpredict_on_batchメソッドの違いは何ですか?

predict_on_batch(self, x) 
Returns predictions for a single batch of samples. 

しかし、それは、1つまたは複数の要素と一緒にいるかどうか、バッチで呼び出されたときに標準predict方法と何か違いがあるとは思えません。

model.predict_on_batch(np.zeros((n, d_in))) 

使用すると、1つのバッチよりも大きいxデータとして渡すときに差がである

model.predict(np.zeros((n, d_in))) 

(形状(n, d_outnumpy.ndarray

+0

配列のサイズはどのくらいですか? 'predict'は引数' batch_size'をとり、設定されていなければデフォルトで32になります。 n <= 32の場合、これらの2つの関数呼び出しは同じことを行う必要があります。 – Toterich

答えて

5

と同じです。

predictは、すべてのデータを、バッチでバッチバッチを予測し、ラベルを予測します。 したがって、内部でバッチを分割し、一度に1つのバッチを供給します。一方、渡したデータが正確に1つのバッチであると仮定して、それをネットワークに送ります。それは分割しようとしません(あなたの設定に応じて、配列が非常に大きい場合、あなたのGPUメモリに問題があるかもしれません)

+0

Ok、thx。 batch_sizeは、実際にはSGD(およびその変種)ミニバッチとほぼ同じです。また、[こちら](https://stats.stackexchange.com/questions/221886/how-to-set-mini-batch-size-in-sgd-in-keras)で確認済みです。 – Phylliade

+0

はい、「バッチ」と表示されているところでは、学習アルゴリズムのミニバッチについて話しているというのが一般的な前提です。 – GPhilo

1

私はちょうどコメントに収まらないものを追加したいだけです。これはバグが本当にあるならば

In [165]: m.predict(A) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-165-c5ba5fc88b6e> in <module>() 

----> 1 m.predict(A) 

~/miniconda3/envs/ccia/lib/python3.6/site-packages/keras/engine/training.py in predict(self, x, batch_size, verbose, steps) 
    1746   f = self.predict_function 
    1747   return self._predict_loop(f, ins, batch_size=batch_size, 
-> 1748         verbose=verbose, steps=steps) 
    1749 
    1750  def train_on_batch(self, x, y, 

~/miniconda3/envs/ccia/lib/python3.6/site-packages/keras/engine/training.py in _predict_loop(self, f, ins, batch_size, verbose, steps) 
    1306       outs.append(np.zeros(shape, dtype=batch_out.dtype)) 
    1307     for i, batch_out in enumerate(batch_outs): 
-> 1308      outs[i][batch_start:batch_end] = batch_out 
    1309     if verbose == 1: 
    1310      progbar.update(batch_end) 

ValueError: could not broadcast input array from shape (4,3) into shape (5,3) 

私はわからない。そして、

class ExtractShape(keras.engine.topology.Layer): 
    def call(self, x): 
     return keras.backend.sum(x, axis=0) 
    def compute_output_shape(self, input_shape): 
     return input_shape 

a = keras.layers.Input((None, None)) 
b = ExtractShape()(a) 
m = keras.Model(a, b) 
m.compile(optimizer=keras.optimizers.Adam(), loss='binary_crossentropy') 
A = np.ones((5,4,3)) 

In [163]: m.predict_on_batch(A) 
Out[163]: 
array([[5., 5., 5.], 
     [5., 5., 5.], 
     [5., 5., 5.], 
     [5., 5., 5.]], dtype=float32) 
In [164]: m.predict_on_batch(A).shape 
Out[164]: (4, 3) 

しかし、predictチェックは慎重に出力形状をようです。

+0

'(5,3)'がどこから来るのか分かりません。バッチに5つの要素がありますが、なぜ2番目の次元が消えていますか? – GPhilo

+0

@GPhilo https://github.com/keras-team/keras/blob/master/keras/engine/training.py#L1336を参照してください。出力のリストが事前計算され、出力の形状が最初の次元「バッチインデックス」です。 –

+0

さて、私はあなたのポイントを得る。私は、すべての結果をまとめて同時に返す必要があるため、出力の形状をチェックする必要があると思うので、そのスペースを事前に割り当てます。一方、 'predict_batch'は、1回の評価実行の結果を返すだけでよいので、返されるものの形を気にする必要はありません。したがって、バッチごとに1つの結果を生成しないカスタムレイヤーの場合、 'predict'は機能しません。私もこれはバグだとは思わない。 – GPhilo

関連する問題