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
中过滤器的总和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