在这种情况下,在卷积之间没有池化层有什么好处?
What is the advantage of not having pooling layers in between convolutions in this context?
在设计用于提取 DNA 基序的卷积神经网络的上下文中,为什么一个堆叠的卷积层之间没有最大池化函数?
这是此架构出现的背景。
self.model = Sequential()
assert len(num_filters) == len(conv_width)
for i, (nb_filter, nb_col) in enumerate(zip(num_filters, conv_width)):
conv_height = 4 if i == 0 else 1
self.model.add(Convolution2D(
nb_filter=nb_filter, nb_row=conv_height,
nb_col=nb_col, activation='linear',
init='he_normal', input_shape=self.input_shape,
W_regularizer=l1(L1), b_regularizer=l1(L1)))
self.model.add(Activation('relu'))
self.model.add(Dropout(dropout))
self.model.add(MaxPooling2D(pool_size=(1, pool_width)))
提供的代码确实在卷积之间使用激活
self.model = Sequential()
assert len(num_filters) == len(conv_width)
for i, (nb_filter, nb_col) in enumerate(zip(num_filters, conv_width)):
conv_height = 4 if i == 0 else 1
self.model.add(Convolution2D(
nb_filter=nb_filter, nb_row=conv_height,
nb_col=nb_col, activation='linear',
init='he_normal', input_shape=self.input_shape,
W_regularizer=l1(L1), b_regularizer=l1(L1)))
self.model.add(Activation('relu')) # <--------------------- ACTIVATION
self.model.add(Dropout(dropout))
self.model.add(MaxPooling2D(pool_size=(1, pool_width)))
生成的模型类似于
conv -- relu -- dropout -- conv -- relu -- dropout -- ... -- max pool
为什么他们将激活单独放置而不是将 specyfing "activation" 放在 conv 本身中?不知道,看起来像是一个奇怪的实施决定,但从实际的角度来看
self.model.add(Convolution2D(
nb_filter=nb_filter, nb_row=conv_height,
nb_col=nb_col, activation='linear',
init='he_normal', input_shape=self.input_shape,
W_regularizer=l1(L1), b_regularizer=l1(L1)))
self.model.add(Activation('relu'))
和
self.model.add(Convolution2D(
nb_filter=nb_filter, nb_row=conv_height,
nb_col=nb_col, activation='relu',
init='he_normal', input_shape=self.input_shape,
W_regularizer=l1(L1), b_regularizer=l1(L1)))
等价。
对于给定的输入维度,您只能减少空间维度(通常每次减少 2 倍)很多次,然后才能达到无法再减少的 1x1 输出维度!因此,对于深度网络,您别无选择,只能拥有没有降维的层组(卷积),并由进行降维的层分隔开。所以,这不是在中间没有最大池化的情况下使用卷积层有任何优势的问题,而是对于给定的输入大小你只能有这么多的最大池化层。
请注意,此处使用的最大池化的唯一功能是降维 - 它没有其他好处。事实上,更现代的全卷积架构如 ResNet-50 不使用最大池化(输入端除外),而是使用步幅为 2 的卷积来逐渐降低维度。
在设计用于提取 DNA 基序的卷积神经网络的上下文中,为什么一个堆叠的卷积层之间没有最大池化函数?
这是此架构出现的背景。
self.model = Sequential()
assert len(num_filters) == len(conv_width)
for i, (nb_filter, nb_col) in enumerate(zip(num_filters, conv_width)):
conv_height = 4 if i == 0 else 1
self.model.add(Convolution2D(
nb_filter=nb_filter, nb_row=conv_height,
nb_col=nb_col, activation='linear',
init='he_normal', input_shape=self.input_shape,
W_regularizer=l1(L1), b_regularizer=l1(L1)))
self.model.add(Activation('relu'))
self.model.add(Dropout(dropout))
self.model.add(MaxPooling2D(pool_size=(1, pool_width)))
提供的代码确实在卷积之间使用激活
self.model = Sequential()
assert len(num_filters) == len(conv_width)
for i, (nb_filter, nb_col) in enumerate(zip(num_filters, conv_width)):
conv_height = 4 if i == 0 else 1
self.model.add(Convolution2D(
nb_filter=nb_filter, nb_row=conv_height,
nb_col=nb_col, activation='linear',
init='he_normal', input_shape=self.input_shape,
W_regularizer=l1(L1), b_regularizer=l1(L1)))
self.model.add(Activation('relu')) # <--------------------- ACTIVATION
self.model.add(Dropout(dropout))
self.model.add(MaxPooling2D(pool_size=(1, pool_width)))
生成的模型类似于
conv -- relu -- dropout -- conv -- relu -- dropout -- ... -- max pool
为什么他们将激活单独放置而不是将 specyfing "activation" 放在 conv 本身中?不知道,看起来像是一个奇怪的实施决定,但从实际的角度来看
self.model.add(Convolution2D(
nb_filter=nb_filter, nb_row=conv_height,
nb_col=nb_col, activation='linear',
init='he_normal', input_shape=self.input_shape,
W_regularizer=l1(L1), b_regularizer=l1(L1)))
self.model.add(Activation('relu'))
和
self.model.add(Convolution2D(
nb_filter=nb_filter, nb_row=conv_height,
nb_col=nb_col, activation='relu',
init='he_normal', input_shape=self.input_shape,
W_regularizer=l1(L1), b_regularizer=l1(L1)))
等价。
对于给定的输入维度,您只能减少空间维度(通常每次减少 2 倍)很多次,然后才能达到无法再减少的 1x1 输出维度!因此,对于深度网络,您别无选择,只能拥有没有降维的层组(卷积),并由进行降维的层分隔开。所以,这不是在中间没有最大池化的情况下使用卷积层有任何优势的问题,而是对于给定的输入大小你只能有这么多的最大池化层。
请注意,此处使用的最大池化的唯一功能是降维 - 它没有其他好处。事实上,更现代的全卷积架构如 ResNet-50 不使用最大池化(输入端除外),而是使用步幅为 2 的卷积来逐渐降低维度。