CNN架构 - 如何解释内核大小表示法

时间:2018-02-28 01:14:34

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

使用Keras我正在尝试重建我在论文中找到的基本CNN架构。本文描述了如下架构:

  1. 标准化输入36x36
  2. 第一卷积特征图32x32(3 @ 1x5x5内核)
  3. 第二卷积特征图28x28(3 @ 3x5x5内核)
  4. 第一次最大合并输出14x14
  5. 第3卷积特征图10x10(3 @ 3x5x5内核)
  6. 第二次最大合并输出5x5
  7. 平铺
  8. 完全连接的层75节点
  9. 完全连接的第10层节点
  10. 完全连接的第2层节点
  11. 输出
  12. 激活功能据说属于relu。

    我在keras中想出了以下代码来复制架构:

    model = Sequential()
    model.add(Dense(36, input_shape=(36,36,1)))
    model.add(BatchNormalization())
    model.add(Activation('relu'))
    model.add(Conv2D(32, (5, 5)))
    model.add(Activation('relu'))
    model.add(Conv2D(32, (5, 5)))
    model.add(Activation('relu'))
    model.add(Conv2D(32, (5, 5)))
    model.add(Activation('relu'))
    
    model.add(Conv2D(28, (5, 5)))
    model.add(Activation('relu'))
    model.add(Conv2D(28, (5, 5)))
    model.add(Activation('relu'))
    model.add(Conv2D(28, (5, 5)))
    model.add(Activation('relu'))
    
    
    model.add(MaxPooling2D(pool_size=(2, 2)))
    
    model.add(Conv2D(10, (5, 5),padding="same"))
    model.add(Activation('relu'))
    model.add(Conv2D(10, (5, 5),padding="same"))
    model.add(Activation('relu'))
    model.add(Conv2D(10, (5, 5),padding="same"))
    model.add(Activation('relu'))
    
    model.add(MaxPooling2D(pool_size=(2, 2),padding="same"))
    
    
    model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
    model.add(Dense(75))
    model.add(Activation('relu'))
    model.add(Dense(10))
    model.add(Activation('relu'))
    model.add(Dense(2))
    model.add(Activation('softmax'))
    
    
    model.compile(Adam(lr=.01), loss='categorical_crossentropy', metrics=['acc'])
    

    但是,我不知道如何理解卷积特征映射的内核符号。更具体地说,我不明白为什么有3个维度(即3 @ 1x5x5 ),而我只能将元组定义为" kernel_size"在我的Keras模型中。

1 个答案:

答案 0 :(得分:3)

如果您附上论文会更容易,但是根据我们的论文,它应该如下:

3 @ 1x5x5表示内核大小为5乘5,1是输入的通道数,3是输出通道数。

我没有使用过Keras,但看起来应该是这样的:

model = Sequential() 
model.add(BatchNormalization(input_shape=(36,36)))  
model.add(Conv2D(3, (5, 5), activation='relu'))
model.add(Conv2D(3, (5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(3, (5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))   

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors 
model.add(Dense(75, activation= 'relu')) 
model.add(Dense(10, activation= 'relu')) 
model.add(Dense(2, activation= 'softmax'))

model.compile(Adam(lr=.01), loss='categorical_crossentropy', metrics=['accuracy'])