【问题标题】:What does keras.layers.concatenate dokeras.layers.concatenate 有什么作用
【发布时间】:2020-06-08 05:19:24
【问题描述】:

我遇到了the following code,想知道keras.layers.concatenate 在这种情况下到底做了什么。

最佳猜测:

  1. fire_module()中,y基于每个像素进行学习(kernel_size=1)
  2. y1 基于y(kernel_size=1) 的activation map 的每个像素进行学习
  3. y3 基于activation mapy(kernel_size=3) 的 3x3 像素区域进行学习
  4. concatenatey1y3 放在一起,这意味着总filters 现在是y1y3 中过滤器的总和
  5. 这种连接是基于每个像素的学习、基于 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)
x = Input(shape=[144, 144, 3])
y = BatchNormalization(center=True, scale=False)(x)
y = Activation('relu')(y)
y = Conv2D(kernel_size=5, filters=16, padding='same', use_bias=True, activation='relu')(x)
y = BatchNormalization(momentum=bnmomemtum)(y)

y = fire_module(16, 32)(y)
y = MaxPooling2D(pool_size=2)(y)

编辑:

更具体一点,为什么不这样做:

# 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

【问题讨论】:

    标签: keras deep-learning conv-neural-network keras-layer tf.keras


    【解决方案1】:

    当他解释连接时,我从stack question 中引用了@parsethis,如果将 a 连接到 b(结果连接在一起),这就是它的作用:

        a        b         c
    a b c   g h i    a b c g h i
    d e f   j k l    d e f j k l
    

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

    你的情况是这样的:

    Y 
     \
      Y1----
       \    |
        Y3  Y1
    

    希望我说的够清楚

    【讨论】:

    • 感谢您的解释。顺便说一句,这不是在我的情况下发生的情况:y1 和 y3 都从 y 分支,然后按照您的描述连接并返回到 y 中?
    • 老实说,这就是我认为发生的事情。 Y1 从 Y 分支,Y3 从 Y1 分支,然后 Y1 的输出(也是 Y3 的输入)被附加到 Y3 的输出。如果您愿意,可以使用某种跳过连接。据我了解,它有助于模型记住 Y1 中发生的事情,以防它在 Y3 之后变得太深而忘记
    • 我想我看到了混乱。让我试着这样解释。 Y = fire_module()(Y)。在 fire() 内部,y 从 Y 学习,y1 从 y 分支,y3 从 y 分支,y3 附加到 y1 并且这个附加层进入 Y。所以每次调用 fire_module 时,layer 会逐点学习一次(y),平均学习 pointwise(y1) 和区域 3(y3) 被添加到第一个 pointwise learning(y)。
    猜你喜欢
    • 2019-02-19
    • 2023-04-10
    • 2011-07-17
    • 2014-09-13
    • 2011-12-30
    • 2022-01-15
    • 1970-01-01
    • 2019-04-26
    • 2016-04-29
    相关资源
    最近更新 更多