【问题标题】:How can this CNN be implemented?这个CNN如何实现?
【发布时间】:2021-07-01 10:13:09
【问题描述】:

我正在阅读崔志华等人的论文《基于深度学习的恶意代码变体检测》。人偶然发现了一个问题。该论文包含以下段落:

"对于我们的模型,我们为不同大小的恶意软件图像设计了不同的 CNN 架构。对于 24x24 的输入,我们的模型有 7 层,其中包括 5 个隐藏层。详细结构如下:C1: 8*20*20、S2:8*10*10、C3:16*8*8、S4:16*4*4、C5:80*1*1,每种卷积核对应一种特征map。每层的maps指的是每层的特征图的数量。对于其他尺寸的输入,随着尺寸的增加,层数也会增加(例如,双倍尺寸意味着增加两层)。"

所以我对 24x24 灰度输入图像的 CNN 实现将是以下形式:

model = Sequential()
model.add(tf.keras.layers.Conv2D(8, 5, activation="relu", input_shape=(24,24,1)))
model.add(tf.keras.layers.MaxPool2D(2))
model.add(tf.keras.layers.Conv2D(2, 3, activation="relu"))
model.add(tf.keras.layers.MaxPool2D(2))
model.add(tf.keras.layers.Conv2D(5, 4, activation="relu"))

但是“双倍尺寸意味着添加两层”是什么意思? 48x48 灰度输入图像的实现看起来如何?

【问题讨论】:

    标签: python tensorflow keras neural-network conv-neural-network


    【解决方案1】:

    您可以使用model.summary() 查看每一层之后的输出形状,因此对于24x24x1 输入,您有:

    _________________________________________________________________
    Layer (type)                 Output Shape              Param #
    =================================================================
    conv2d (Conv2D)              (None, 20, 20, 8)         208
    _________________________________________________________________
    max_pooling2d (MaxPooling2D) (None, 10, 10, 8)         0
    _________________________________________________________________
    conv2d_1 (Conv2D)            (None, 8, 8, 2)           146
    _________________________________________________________________
    max_pooling2d_1 (MaxPooling2 (None, 4, 4, 2)           0
    _________________________________________________________________
    conv2d_2 (Conv2D)            (None, 1, 1, 5)           165
    =================================================================
    

    请注意,在最后一次卷积(即过滤器的数量)之后,您最终会得到 5 个值。

    如果您将输入大小增加到48x48x1,您将获得7x7x5 输出:

    _________________________________________________________________
    Layer (type)                 Output Shape              Param #
    =================================================================
    conv2d_3 (Conv2D)            (None, 44, 44, 8)         208
    _________________________________________________________________
    max_pooling2d_2 (MaxPooling2 (None, 22, 22, 8)         0
    _________________________________________________________________
    conv2d_4 (Conv2D)            (None, 20, 20, 2)         146
    _________________________________________________________________
    max_pooling2d_3 (MaxPooling2 (None, 10, 10, 2)         0
    _________________________________________________________________
    conv2d_5 (Conv2D)            (None, 7, 7, 5)           165
    =================================================================
    

    我假设您想要1x1x5 的输出,如第一个示例所示,因此您需要添加两个新层,将图像的高度和宽度降低到1x1,例如:

    model = Sequential()
    model.add(tf.keras.layers.Conv2D(8, 5, activation="relu", input_shape=(48,48,1)))
    model.add(tf.keras.layers.MaxPool2D(2))
    model.add(tf.keras.layers.Conv2D(2, 3, activation="relu"))
    model.add(tf.keras.layers.MaxPool2D(2))
    # new layers
    model.add(tf.keras.layers.Conv2D(2, 3, activation="relu"))
    model.add(tf.keras.layers.MaxPool2D(2))
    # ---
    model.add(tf.keras.layers.Conv2D(5, 4, activation="relu"))
    

    你会得到:

    _________________________________________________________________
    Layer (type)                 Output Shape              Param #
    =================================================================
    conv2d_21 (Conv2D)           (None, 44, 44, 8)         208
    _________________________________________________________________
    max_pooling2d_16 (MaxPooling (None, 22, 22, 8)         0
    _________________________________________________________________
    conv2d_22 (Conv2D)           (None, 20, 20, 2)         146
    _________________________________________________________________
    max_pooling2d_17 (MaxPooling (None, 10, 10, 2)         0
    _________________________________________________________________
    conv2d_23 (Conv2D)           (None, 8, 8, 2)           38
    _________________________________________________________________
    max_pooling2d_18 (MaxPooling (None, 4, 4, 2)           0
    _________________________________________________________________
    conv2d_24 (Conv2D)           (None, 1, 1, 5)           165
    =================================================================
    

    请注意,在您的示例中,只有池化层具有stride = 2,因此这是大小减半的地方; Conv2D layer 默认有strides=(1, 1)


    参考文献

    【讨论】:

      猜你喜欢
      • 2018-04-04
      • 2019-03-09
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 2019-09-02
      • 1970-01-01
      相关资源
      最近更新 更多