首页 > 解决方案 > 在 keras 中实现 LeNet。如何只在卷积层中组合一些特征图?

问题描述

我目前正在尝试从其在 keras 中的原始论文中实现 LeNet。在那里,架构定义如下

Lenet 架构

作者还描述,在卷积层 C3 中,并非所有过滤器都应用于前一层的所有特征图。他们还提供此表来定义哪些特征图与哪些过滤器结合使用。似乎我发现的每个实现都没有这样做。

在此处输入图像描述

所以我的问题是

这是我当前的代码,没有选择性地应用过滤器。

model = keras.Sequential()

#C1
model.add(layers.Conv2D(filters=6, kernel_size=(3, 3), activation='relu', input_shape=(32,32,1)))
#S2    
model.add(layers.AveragePooling2D())
#C3
model.add(layers.Conv2D(filters=16, kernel_size=(3, 3), activation='relu'))
model.add(layers.AveragePooling2D())

model.add(layers.Flatten())

model.add(layers.Dense(units=120, activation='relu'))

model.add(layers.Dense(units=84, activation='relu'))

model.add(layers.Dense(units=10, activation = 'softmax'))

标签: tensorflowkerasconv-neural-network

解决方案


通过使用函数式 API,您可以相当容易地获取由 NN 层生成的张量的某些切片。

即,让conv_1=tf.keras.layers.Conv2D(parameters)成为您要从中提取某些特征图的层。相应地,在模型的定义中,您将拥有

    features = conv_1(previous_features)

例如,如果您想从通道 3、4 和 5 获取特征图,您可以使用tf.slice或使用 pythonic/numpy 索引(TF 支持):

    # assuming dimensions are (batch_size, height, width, channels)
    feature_maps = features[:,:,:,3:6] 

要获取任意通道,您可能首先需要通过使用以下方式沿通道轴取消features堆叠来列出您的列表:featurestf.unstack

    features_list = tf.unstack(feature_maps, axis=-1)

这会产生一个张量列表,每个张量都是一个特定的特征图。然后您可以使用以下方法将它们组合成一个新的张量tf.satck

    # let a1, ..., an are indexes of the channels you need.
    particular_features = tf.stack( [features_list[a1], ... , features_list[an] ], axis=-1 )

您可以通过将由此获得的特征图作为参数传递给更多层,从而在网络中进一步使用它们。这应该做的工作。

我不熟悉 LeNet 模型的任何实现,因此我无法对此发表评论。


推荐阅读