【问题标题】:keras implementation of a parallel convolution layerkeras 实现并行卷积层
【发布时间】:2020-05-18 00:25:46
【问题描述】:

一般学习 keras 和 cnn,因此尝试实现我在一篇论文中找到的网络,其中有一个 3 个 conv 的并行卷积层,其中每个 conv 对输入应用不同的过滤器,这里是我尝试解决的方法它:

inp = Input(shape=(32,32,192))

conv2d_1 = Conv2D(
        filters = 32,
        kernel_size = (1, 1),
        strides =(1, 1),
        activation = 'relu')(inp)
conv2d_2 = Conv2D(
        filters = 64,
        kernel_size = (3, 3),
        strides =(1, 1),
        activation = 'relu')(inp)
conv2d_3 = Conv2D(
        filters = 128,
        kernel_size = (5, 5),
        strides =(1, 1),
        activation = 'relu')(inp)
out = Concatenate([conv2d_1, conv2d_2, conv2d_3])
model.add(Model(inp, out))

-这给了我以下错误:A Concatenate layer requires inputs with matching shapes except for the concat axis....etc

  • 我尝试通过在每个 Conv2D 函数中添加 arg input_shape = inp 来解决它,现在它给了我 Cannot iterate over a tensor with unknown first dimension.

ps : 论文作者用 caffe 实现了这个网络,这一层的输入是 (32,32,192),合并后的输出是 (32,32,224)。

【问题讨论】:

  • 你的内核大小不同,因此 conv1 的输出是 32x32x32,conv2 是 30x30x64,conv3 是 28x28x128。
  • aramakus,我明白,但输出是 (,,224) 像 32+64+128,所以他们一定以某种方式合并了它们,这就是我想要的知道
  • aramakus,所以如果问题出在 x 和 y 只能用填充来解决,如果 z 在 Concatenate() 中也应该相同,还有其他方法可以合并(32x32x32 )+(32x32x64)+(32x32x128) 变成 (32x32x224) ?
  • 默认情况下,Cancatenate 将输入沿深度(最后一个维度)堆叠在一起。但是在您的代码中没有填充它不能这样做,因为 x 和 y 是不同的。我贴了一个代码,看比说更容易。
  • aramakus,谢谢,现在我明白它是如何工作的了,:) y

标签: tensorflow keras conv-neural-network caffe


【解决方案1】:

除非您添加填充以匹配数组形状,否则Concatenate 将无法匹配它们。尝试运行此

import tensorflow as tf
from tensorflow.keras.layers import Input, Conv2D, Concatenate

inp = Input(shape=(32,32,192))

conv2d_1 = Conv2D(
        filters = 32,
        kernel_size = (1, 1),
        strides =(1, 1),
        padding = 'SAME',
        activation = 'relu')(inp)
conv2d_2 = Conv2D(
        filters = 64,
        kernel_size = (3, 3),
        strides =(1, 1),
        padding = 'SAME',
        activation = 'relu')(inp)
conv2d_3 = Conv2D(
        filters = 128,
        kernel_size = (5, 5),
        strides =(1, 1),
        padding = 'SAME',
        activation = 'relu')(inp)
out = Concatenate()([conv2d_1, conv2d_2, conv2d_3])

model = tf.keras.models.Model(inputs=inp, outputs=out)

model.summary()

【讨论】: