keras.layers.concatenate做什么

keras.layers.concatenate做什么,keras,deep-learning,conv-neural-network,keras-layer,tf.keras,Keras,Deep Learning,Conv Neural Network,Keras Layer,Tf.keras,我偶然发现,想知道在这种情况下,keras.layers.concatenate到底做了什么 最佳猜测: 在fire_module()中,y基于每个像素进行学习(kernel_size=1) y1基于y(kernel\u size=1)的激活映射的每个像素进行学习 y3基于y的activation map的3x3像素区域进行学习(kernel\u size=3) concatenate将y1和y3放在一起,这意味着总计过滤器现在是y1和y3中过滤器的总和 这种连接是基于每个像素的学习的平均值,基

我偶然发现,想知道在这种情况下,
keras.layers.concatenate
到底做了什么

最佳猜测:

  • fire_module()
    中,
    y
    基于每个像素进行学习(
    kernel_size=1
  • y1
    基于
    y
    kernel\u size=1
    )的
    激活映射的每个像素进行学习
  • y3
    基于
    y
    activation map
    的3x3像素区域进行学习(
    kernel\u size=3
  • concatenate
    y1
    y3
    放在一起,这意味着总计
    过滤器
    现在是
    y1
    y3
    中过滤器的总和
  • 这种连接是基于每个像素的学习的平均值,基于3x3的学习,两者都基于之前基于每个像素的激活图,使模型更好
  • 非常感谢您的帮助

    def fire(x, squeeze, expand):
        y  = Conv2D(filters=squeeze, kernel_size=1, activation='relu', padding='same')(x)
        y  = BatchNormalization(momentum=bnmomemtum)(y)
        y1 = Conv2D(filters=expand//2, kernel_size=1, activation='relu', padding='same')(y)
        y1 = BatchNormalization(momentum=bnmomemtum)(y1)
        y3 = Conv2D(filters=expand//2, kernel_size=3, activation='relu', padding='same')(y)
        y3 = BatchNormalization(momentum=bnmomemtum)(y3)
        return concatenate([y1, y3])
    
    def fire_module(squeeze, expand):
        return lambda x: fire(x, squeeze, expand)
    

    编辑:

    更具体地说,为什么不这样做:

    # why not this?
    def fire(x, squeeze, expand):
        y  = Conv2D(filters=squeeze, kernel_size=1, activation='relu', padding='same')(x)
        y  = BatchNormalization(momentum=bnmomemtum)(y)
        y = Conv2D(filters=expand//2, kernel_size=1, activation='relu', padding='same')(y)
        y = BatchNormalization(momentum=bnmomemtum)(y)
        y = Conv2D(filters=expand//2, kernel_size=3, activation='relu', padding='same')(y)
        y = BatchNormalization(momentum=bnmomemtum)(y)
        return y
    


    当他解释连接时,我引用了@parsethis,这是如果a连接到b(结果连接在一起)时的结果:

    表示它只返回一个包含所有输入串联的张量,前提是它们共享一个维度(即相同的长度或witdh,取决于轴)

    你的情况是这样的:

    Y 
     \
      Y1----
       \    |
        Y3  Y1
    

    我希望我足够清楚

    当他解释连接时,我引用了@parsethis,如果a连接到b(结果连接在一起):

    表示它只返回一个包含所有输入串联的张量,前提是它们共享一个维度(即相同的长度或witdh,取决于轴)

    你的情况是这样的:

    Y 
     \
      Y1----
       \    |
        Y3  Y1
    

    我希望我说得够清楚了

    谢谢你的解释。顺便问一下,在我的例子中,不是发生了这样的事情吗:y的y1和y3分支,然后按照您的描述连接起来,并返回到y?老实说,我认为发生了这样的事情。Y1从Y分支,Y3从Y1分支,然后Y1的输出(也是Y3的输入)附加到Y3的输出。如果愿意的话,可以跳过一些连接。据我所知,这有助于模型记住Y1中发生的事情,以防它变得太深,在Y3之后忘记。我想我看到了混乱。让我试着这样解释。Y=点火模块()(Y)。在fire()内部,y从y学习,y1从y分支,y3从y分支,y3被附加到y1,这个附加层进入y。因此,每次调用fire_模块时,层逐点学习一次(y),学习逐点(y1)和3区域(y3)的平均值被添加到第一个逐点学习(y)中。感谢您的解释。顺便问一下,在我的例子中,不是发生了这样的事情吗:y的y1和y3分支,然后按照您的描述连接起来,并返回到y?老实说,我认为发生了这样的事情。Y1从Y分支,Y3从Y1分支,然后Y1的输出(也是Y3的输入)附加到Y3的输出。如果愿意的话,可以跳过一些连接。据我所知,这有助于模型记住Y1中发生的事情,以防它变得太深,在Y3之后忘记。我想我看到了混乱。让我试着这样解释。Y=点火模块()(Y)。在fire()内部,y从y学习,y1从y分支,y3从y分支,y3被附加到y1,这个附加层进入y。因此,每次调用fire_模块时,层逐点学习一次(y),学习逐点(y1)和3区域(y3)的平均值被添加到第一个逐点学习(y)中。
    Y 
     \
      Y1----
       \    |
        Y3  Y1