2017-07-07 628 views
4

按照keras documentationKeras模型的預測和predict_on_batch方法有什麼區別?

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

然而,似乎沒有爲與標準predict方法的任何差異對一批調用時,它是否有一個或多個元素之中。

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

相同

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

(形狀(n, d_outnumpy.ndarray

+0

數組的大小是多少? 'predict'採用'batch_size'參數,如果未設置,則默認爲32。如果n <= 32,那麼這兩個函數調用應該是相同的。 – Toterich

回答

5

傳遞時作爲x數據比一批較大的不同之處在於英寸

predict會遍歷所有的數據,批處理,預測標籤。 因此它內部分批分批並一次進料一批。

predict_on_batch另一方面,假設您傳入的數據恰好是一個批次,因此將其饋送到網絡。它不會嘗試拆分它(如果陣列非常大,取決於您的設置,可能會證明您的GPU內存有問題)

+0

好的,thx。 batch_size實際上與SGD的(及其變體)minibatches大致相同。還證實[這裏](https://stats.stackexchange.com/questions/221886/how-to-set-mini-batch-size-in-sgd-in-keras)。 – Phylliade

+0

是的,無論你看到什麼「批次」,常見的假設是你正在談論學習算法的minibatches。 – GPhilo

1

我只是想添加一些不適合評論的內容。看來,predict檢查仔細輸出形狀:

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) 

但是:

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) 

我不知道這是否是一個bug真的。

+0

我不明白'(5,3)'來自哪裏。您的批次中有5個元素,但爲什麼第二個維度消失? – GPhilo

+0

@GPhilo請看https://github.com/keras-team/keras/blob/master/keras/engine/training.py#L1336輸出列表是預先計算好的,輸出形狀是在第一維是「批次指數」。 –

+0

好了,我明白你的意思了。我認爲「預測」必須檢查輸出的形狀,因爲它需要將所有結果放在一起並同時返回它們,因此它爲此預先分配了空間。另一方面,'predict_batch'只需要返回一次評估運行的結果,所以它不需要關心返回結果的形狀。所以是的,如果自定義圖層不能爲每個批次生成一個結果,「預測」將不起作用。我也不認爲這是一個錯誤,雖然.. – GPhilo

相關問題