当前位置: 首页 > 知识库问答 >
问题:

在这种情况下,在卷积之间没有池层的好处是什么?

袁元明
2023-03-14

在设计用于提取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)))

共有2个答案

龙繁
2023-03-14

提供的代码在卷积之间使用激活

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

为什么他们把激活分开,而不是在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)))

是等价的。

祁飞飙
2023-03-14

对于给定的输入维度,在达到无法再减少的1x1输出维度之前,您只能多次减少空间维度(通常每次减少2倍)!因此,对于深网,您别无选择,只能使用无降维的层组(卷积),由降维层分隔。因此,没有最大池的卷积层并没有任何好处,而是对于给定的输入大小,您只能有这么多的最大池层。

请注意,此处使用的最大池化的唯一功能是降维——它没有其他好处。事实上,更现代的全卷积架构(例如ResNet-50)不使用最大池化(除了在输入处),而是使用步幅2卷积来逐渐降低维度。

 类似资料:
  • 本文向大家介绍卷积层和池化层有什么区别相关面试题,主要包含被问及卷积层和池化层有什么区别时的应答技巧和注意事项,需要的朋友参考一下 参考回答:   卷积层 池化层 功能 提取特征 压缩特征图,提取主要特征 操作 可惜是二维的,对于三维数据比如RGB图像(3通道),卷积核的深度必须同输入的通道数,输出的通道数等于卷积核的个数。卷积操作会改变输入特征图的通道数。 池化只是在二维数据上操作的,因此不改变

  • 我用干净的架构在android项目上工作。 我有以下课程: 使用public dispose()方法从onNext实现中释放序列。 但我还是不明白使用它的好处。是否用于在销毁视图时从observable取消订阅,以便从转到并关闭发射器上的订阅?

  • 问题内容: 我已阅读以下讨论: 如果私有帮助器方法可以是静态的,则它们应该是静态的;如果它们的类没有成员变量,则所有方法应该是静态的。 似乎人们通常会接受静态方法,但由于以下两个原因,对此有些怀疑: 他们很难测试。 他们违反了OO原则。(一个人说,它们是函数,而不是方法。) 最可接受的静态方法是 私有静态 方法。但是,为什么为什么根本不存在静态方法呢?在什么情况下,它们是最优先采用的方法? 问题答

  • 我有一个粒子模拟项目,我已经工作了很多个小时,我将发布两个类。一个是粒子类,一个是main和Canvas类。我创建一个画布,然后得到它的BufferStrategy和一个Graphics在上面绘制。我使用更新循环来更新每一帧的粒子,并使用渲染循环来渲染每一帧的粒子。更新和渲染都是通过调用粒子数组列表中每个粒子的自渲染和自更新方法来完成的。现在这是我的问题。我有一个MouseListener,它在中

  • 我的SSE代码和标准的C代码一样慢,我做错了什么? 我在Intel i3-6100 CPU上运行,使用C和minGW和CLion,我使用-O0标志。 在使用clock()函数测量性能时,两个版本的速度一样快,都达到了大约45节拍(超过1000节拍)(SSE:1138节拍-C:1093节拍)。我认为SSE不知何故打乱了时钟()的时间测量,但即使只是简单地计算秒,也没有什么不同。 函数 :(交换注释.

  • 我创建了龙卷风服务器,它接受python和matlab代码并执行它。这是服务器代码。 我用来访问的客户代码是,这里 我关心的是保持执行的顺序,这样python代码只有在matlab完成后才能执行。我使用jupyter_client来执行matlab/python代码。我在这里使用python27。问题是当我提交代码时,它抛出< code > type error:' NoneType ' obje