【发布时间】:2020-06-08 05:19:24
【问题描述】:
我遇到了the following code,想知道keras.layers.concatenate 在这种情况下到底做了什么。
最佳猜测:
- 在
fire_module()中,y基于每个像素进行学习(kernel_size=1) -
y1基于y(kernel_size=1) 的activation map的每个像素进行学习 -
y3基于activation map的y(kernel_size=3) 的 3x3 像素区域进行学习 -
concatenate将y1和y3放在一起,这意味着总filters现在是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)
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