我如何在keras中合并平均和最大池

时间:2018-03-27 04:20:51

标签: python keras theano

我正在尝试使用Keras合并CNN的最大池层和平均池层。我正在使用Theano后端。

以下是我的代码:

from keras.layers import Conv2D, MaxPooling2D, AveragePooling2D
tower_1 = Conv2D(32, (3,3), padding='same', activation='relu')(input_img)
tower_2 = MaxPooling2D((2,2), strides=(2,2), padding='same')(tower_1)
tower_1 = AveragePooling2D((2,2), strides=(2,2), padding='same')(tower_1)
tower_1 = keras.layers.average([tower_1,tower_2])
tower_1 = Conv2D(32, (3,3), padding='same', activation='relu')(tower_1)
output = MaxPooling2D((2,2), strides=(2,2), padding='same')(tower_1)

但我收到以下错误:

ValueError: padding must be zero for average_exc_pad
Apply node that caused the error: AveragePoolGrad{ignore_border=True, mode='average_exc_pad', ndim=2}(Elemwise{Composite{(i0 * (i1 + Abs(i1)))}}.0, IncSubtensor{InplaceInc;::, ::, :int64:, :int64:}.0, TensorConstant{(2,) of 2}, TensorConstant{(2,) of 2}, TensorConstant{(2,) of 1})
Toposort index: 137
Inputs types: [TensorType(float32, 4D), TensorType(float32, 4D), TensorType(int32, vector), TensorType(int32, vector), TensorType(int32, vector)]
Inputs shapes: [(32, 32, 64, 64), (32, 32, 33, 33), (2,), (2,), (2,)]
Inputs strides: [(524288, 16384, 256, 4), (139392, 4356, 132, 4), (4,), (4,), (4,)]
Inputs values: ['not shown', 'not shown', array([2, 2]), array([2, 2]), array([1, 1])]
Outputs clients: [[InplaceDimShuffle{0,2,3,1}(AveragePoolGrad{ignore_border=True, mode='average_exc_pad', ndim=2}.0)]]

Backtrace when the node is created(use Theano flag traceback.limit=N to make it longer):
  File "C:\Users\aiza\Anaconda3\envs\py2\lib\site-packages\theano\gradient.py", line 1272, in access_grad_cache
    term = access_term_cache(node)[idx]
  File "C:\Users\aiza\Anaconda3\envs\py2\lib\site-packages\theano\gradient.py", line 967, in access_term_cache
    output_grads = [access_grad_cache(var) for var in node.outputs]
  File "C:\Users\aiza\Anaconda3\envs\py2\lib\site-packages\theano\gradient.py", line 967, in <listcomp>
    output_grads = [access_grad_cache(var) for var in node.outputs]
  File "C:\Users\aiza\Anaconda3\envs\py2\lib\site-packages\theano\gradient.py", line 1272, in access_grad_cache
    term = access_term_cache(node)[idx]
  File "C:\Users\aiza\Anaconda3\envs\py2\lib\site-packages\theano\gradient.py", line 967, in access_term_cache
    output_grads = [access_grad_cache(var) for var in node.outputs]
  File "C:\Users\aiza\Anaconda3\envs\py2\lib\site-packages\theano\gradient.py", line 967, in <listcomp>
    output_grads = [access_grad_cache(var) for var in node.outputs]
  File "C:\Users\aiza\Anaconda3\envs\py2\lib\site-packages\theano\gradient.py", line 1272, in access_grad_cache
    term = access_term_cache(node)[idx]
  File "C:\Users\aiza\Anaconda3\envs\py2\lib\site-packages\theano\gradient.py", line 1108, in access_term_cache
    new_output_grads)

HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node.

将最大和平均合并图层合并为一个合并图层的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

我建议你为自己创建一个自定义池功能。在搜索如何执行此操作时,我发现this对您来说非常有用

  

您好。如果这只是供您自己使用,我可以建议如下:   在本地python目录中复制“pooling.py”文件,   并将其重命名为“custom_pooling.py”。它将拥有所有   所需的模块导入 - 签入此link:然后,选择   池化类最接近您要实现和重命名的类   它是“类RMS_Pooling1D(层):”等等。当你准备好了,只是   像任何其他图层一样导入此类。我创建了自己的图层   类似的方式。我希望这有帮助。感谢。

以上区块报价适用于RMS合并,您可以平均averagemax合并。

答案 1 :(得分:0)

我建议将这两个层连接起来:

from keras.layers import Conv2D, MaxPooling2D, AveragePooling2D, concatenate

tower_1 = Conv2D(32, (3,3), padding='same', activation='relu')(input_img)
tower_2 = MaxPooling2D((2,2), strides=(2,2), padding='same')(tower_1)
tower_1 = AveragePooling2D((2,2), strides=(2,2), padding='same')(tower_1)
tower_1 = concatenate([tower_1,tower_2])
tower_1 = Conv2D(32, (3,3), padding='same', activation='relu')(tower_1)
output = MaxPooling2D((2,2), strides=(2,2), padding='same')(tower_1)

平均尝试:

from keras.layers import average

input_img = Input(shape=(224, 224, 3))

tower_1 = Conv2D(32, (3,3), padding='same', activation='relu')(input_img)
tower_2 = MaxPooling2D((2,2), strides=(2,2), padding='same')(tower_1)
tower_1 = AveragePooling2D((2,2), strides=(2,2), padding='same')(tower_1)
tower_1 = average([tower_1,tower_2])
tower_1 = Conv2D(32, (3,3), padding='same', activation='relu')(tower_1)
output = MaxPooling2D((2,2), strides=(2,2), padding='same')(tower_1)

答案 2 :(得分:0)

删除填充后错误消失=&#39;相同&#39;属性。