Python Keras模型的预测和批量预测方法之间有什么区别?

Python Keras模型的预测和批量预测方法之间有什么区别?,python,deep-learning,keras,Python,Deep Learning,Keras,根据keras: 然而,在批处理中调用标准的predict方法时,无论是使用一个元素还是多个元素,似乎都没有任何区别 model.predict_on_batch(np.zeros((n, d_in))) 与 model.predict(np.zeros((n, d_in))) (anumpy.ndarray的形状(n,d_out)区别在于当您传递大于一批的x数据时 将逐批检查所有数据,预测标签。 因此,它在内部分批进行拆分,并一次进料一批 另一方面,假定您传入的数据正好是一批数据,因此将其

根据keras:

然而,在批处理中调用标准的
predict
方法时,无论是使用一个元素还是多个元素,似乎都没有任何区别

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

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

(a
numpy.ndarray
的形状
(n,d_out

区别在于当您传递大于一批的
x
数据时

将逐批检查所有数据,预测标签。 因此,它在内部分批进行拆分,并一次进料一批


另一方面,假定您传入的数据正好是一批数据,因此将其馈送到网络。它不会尝试拆分数据(根据您的设置,如果阵列非常大,可能会对您的GPU内存造成问题)我只想添加一些不适合注释的内容。似乎
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)
但是:

[165]中的
m.predict(A)
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1米(A)
预测中的~/miniconda3/envs/ccia/lib/python3.6/site-packages/keras/engine/training.py(self,x,批量大小,详细,步骤)
1746 f=自预测函数
1747返回自预测循环(f,ins,批次大小=批次大小,
->1748详细=详细,步骤=步骤)
1749
1750 def系列在批次上(自身、x、y、,
~/miniconda3/envs/ccia/lib/python3.6/site-packages/keras/engine/training.py in\u predict\u循环(self、f、ins、批大小、详细、步骤)
1306 out.append(np.zeros(shape,dtype=batch_out.dtype))
1307对于i,批输出在枚举中(批输出):
->1308 outs[i][batch_start:batch_end]=batch_out
1309如果详细==1:
1310程序条更新(批处理结束)
ValueError:无法将输入数组从形状(4,3)广播到形状(5,3)

我不确定这是否真的是一个bug。

与在单个批上执行predict相比,在批上执行predict要快得多

  • 批次和型号信息
    • 批次形状:(1024333)
    • 批处理数据类型:float32
    • 模型参数:~150k
  • 时间结果:
    • 预测:~1.45秒
    • 批量预测:~95.5 ms

总之,predict方法具有额外的操作,以确保批集合得到正确处理,而predict\u on\u batch是一种轻量级的预测替代方法,应在单个批上使用。

数组的大小是多少?
predict
采用参数
batch\u size
,如果未设置,则默认值为32。如果n确定,则为thx。批量大小实际上与SGD(及其变体)的小批量大致相同。也得到了证实。是的,无论你在哪里看到“批量”,通常的假设是你在谈论学习算法的小批量。没有线索,从未遇到过那个用例yetI不明白那
(5,3)
来自。批处理中有5个元素,但为什么第二个维度会消失?@GPhilo查看输出列表,假设第一个维度是“批索引”,则输出形状会被切片.好的,现在我明白你的意思了。我认为,
predict
必须检查输出的形状,因为它需要将所有结果放在一起并同时返回所有结果,所以它预先分配了空间。另一方面,
predict\u batch
只需要返回一次评估运行的结果,所以它不需要关心结果是的,如果自定义层不能每批生成一个结果,
predict
将不起作用。但我也不认为这是一个错误。@GPhilo我认为是一个错误的原因是没有使用方法
compute\u output\u shape
predict
正在执行形状检查,就像t的副产品一样他使用第一批的形状预先分配列表。似乎用户有责任适当地处理第一个维度,这包括正确定义方法
计算输出形状
并返回该形状的张量。此外,
预测
预测批量
如果样本小于
批量大小
样本,则应以类似方式进行操作。
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)