深度学习---ResNet网络结构

ResNet 网络是什么?为什么引入残差网络?

  1. resnet是残差网络结构,一般来讲,随着网络层数的增加,很容易造成“退化”和“梯度消失”的问题。所以提出了残差网络

残差模块的结构图

 

注意:

输入x 和卷积后的F(x)的维度必须相同

高于50层深度的resnet模型中,为了减少计算量,对残差模块进行了优化,将内部的两个3×3的layers换成1× 1 --> 3× 3 --> 1 ×1 三层layers,

第一层的1*1 :进行深度降维

第二层的3*3  :  提取特征

第三层的1*1 :   用于维度还原

 

ResNet的网络结构图

 

ResNet各个版本的网络结构图:

 

Resnet-50 

3,4,6,3,代表的是有多少个这样的残差模块堆叠

Resnet-34和Resnet-50  tensorflow实现模型搭建

第一种类型的残差模块:(3*3)

 def bn_block_1(self, in_put, bn_filter, strides=(1, 1), conv_shortcut=False):

        x = Conv2D(bn_filter, kernel_size=(3, 3), strides=strides, padding='same')(in_put)
        x = BatchNormalization(axis=3)(x)
        x = Activation('relu')(x)
        x = Conv2D(bn_filter, kernel_size=(3, 3), strides=(1, 1), padding='same')(x)
        x = BatchNormalization(axis=3)(x)
        #x = Activation('relu')(x)

        if conv_shortcut:
            shortcut = Conv2D(bn_filter, kernel_size=(3, 3), strides=strides, padding="same")(in_put)
            shortcut = BatchNormalization(axis=3)(shortcut)
            x = add([x, shortcut])
            x = Activation('relu')(x)
            return x
        else:
            x = keras.layers.add([x, in_put])
            x = Activation('relu')(x)
            return x

 

第二种类型的残差模块:(1*1 -> 3*3 -> 1*1)

 def bn_block_2(self, in_put, bn_filter, strides=(1, 1), conv_shortcut=False):
        k1, k2, k3 = bn_filter
        x = Conv2D(k1, kernel_size=1, strides=strides, padding='same')(in_put)
        #x = Dropout(0.2)(x)
        x = BatchNormalization(axis=3)(x)
        x = Activation('relu')(x)
        x = Conv2D(k2, kernel_size=3, strides=(1, 1), padding='same')(x)
        #x = Dropout(0.2)(x)
        x = BatchNormalization(axis=3)(x)
        x = Activation('relu')(x)
        x = Conv2D(k3, kernel_size=1, strides=(1, 1), padding='same')(x)
        #x = Dropout(0.2)(x)
        x = BatchNormalization(axis=3)(x)
        #x = Activation('relu')(x)
        if conv_shortcut:
            shortcut = Conv2D(k3, kernel_size=1, strides=strides, padding="same")(in_put)
            #shortcut = Dropout(0.2)(shortcut)
            shortcut = BatchNormalization(axis=3)(shortcut)
            x = add([x, shortcut])
            x = Activation('relu')(x)
            return x
        else:
            x = add([x, in_put])
            x = Activation('relu')(x)
            return x

Resnet-34结构:

    def resnet_34(self, input_shape):
        in_put = Input(input_shape)
        x = ZeroPadding2D((3, 3))(in_put)

        # conv1
        x = Conv2D(filters=64, kernel_size=(7, 7), strides=(2, 2), padding='valid')(x)
        x = BatchNormalization(axis=3)(x)
        x = Activation('relu')(x)
        x = MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same')(x)

        # conv2_x
        x = self.bn_block_1(x, bn_filter=64)
        x = self.bn_block_1(x, bn_filter=64)
        x = self.bn_block_1(x, bn_filter=64)

        # conv3_x
        x = self.bn_block_1(x, bn_filter=128, strides=(2, 2), conv_shortcut=True)
        x = self.bn_block_1(x, bn_filter=128)
        x = self.bn_block_1(x, bn_filter=128)
        x = self.bn_block_1(x, bn_filter=128)

        # conv4_x
        x = self.bn_block_1(x, bn_filter=256, strides=(2, 2), conv_shortcut=True)
        x = self.bn_block_1(x, bn_filter=256)
        x = self.bn_block_1(x, bn_filter=256)
        x = self.bn_block_1(x, bn_filter=256)
        x = self.bn_block_1(x, bn_filter=256)
        x = self.bn_block_1(x, bn_filter=256)

        # conv5_x
        x = self.bn_block_1(x, bn_filter=512, strides=(2, 2), conv_shortcut=True)
        x = self.bn_block_1(x, bn_filter=512)
        x = self.bn_block_1(x, bn_filter=512)
        x = AveragePooling2D(pool_size=(7, 7))(x)
        x = Flatten()(x)
        x = Dense(self.type_num, activation='softmax')(x)

        model = Model(inputs=in_put, outputs=x)
        return model

Resnet-50模型结构:

 def resnet_50(self, input_shape):
        in_put = Input(input_shape)
        x = ZeroPadding2D((3, 3))(in_put)

        # conv1_x
        x = Conv2D(filters=64, kernel_size=(7, 7), strides=(2, 2), padding='valid')(x)
        #x = Dropout(0.2)(x)
        x = BatchNormalization(axis=3)(x)
        x = Activation('relu')(x)
        x = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(x)

        # conv2_x
        x = self.bn_block_2(x, bn_filter=[64, 64, 256], strides=(1, 1), conv_shortcut=True)
        x = self.bn_block_2(x, bn_filter=[64, 64, 256])
        x = self.bn_block_2(x, bn_filter=[64, 64, 256])

        # conv3_x
        x = self.bn_block_2(x, bn_filter=[128, 128, 512], strides=(2, 2), conv_shortcut=True)
        x = self.bn_block_2(x, bn_filter=[128, 128, 512])
        x = self.bn_block_2(x, bn_filter=[128, 128, 512])
        x = self.bn_block_2(x, bn_filter=[128, 128, 512])

        # conv4_x
        x = self.bn_block_2(x, bn_filter=[256, 256, 1024], strides=(2, 2), conv_shortcut=True)
        x = self.bn_block_2(x, bn_filter=[256, 256, 1024])
        x = self.bn_block_2(x, bn_filter=[256, 256, 1024])
        x = self.bn_block_2(x, bn_filter=[256, 256, 1024])
        x = self.bn_block_2(x, bn_filter=[256, 256, 1024])
        x = self.bn_block_2(x, bn_filter=[256, 256, 1024])

        # conv5_x
        x = self.bn_block_2(x, bn_filter=[512, 512, 2048], strides=(2, 2), conv_shortcut=True)
        x = self.bn_block_2(x, bn_filter=[512, 512, 2048])
        x = self.bn_block_2(x, bn_filter=[512, 512, 2048])

        x = Dropout(0.3)(x)
        x = AveragePooling2D(pool_size=(7, 7))(x)
        x = Flatten()(x)
        x = Dense(self.type_num, activation='softmax')(x)
        #x = Dropout(0.2)(x)

        model = Model(inputs=in_put, outputs=x)
        return model

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Multi-scale-1D-ResNet是一种用于信号处理和时间序列分析的深度学习模型。它基于ResNet(残差网络)的架构,并通过引入多尺度特征来改进模型的性能。 在传统的ResNet中,每个块都具有相同的尺度,这可能会限制模型对不同频率的信号特征的捕捉。因此,Multi-scale-1D-ResNet通过添加具有不同滤波器长度的并行卷积层来引入多尺度,从而使模型能够更好地学习不同频率的特征。 具体来说,Multi-scale-1D-ResNet包括一系列块,每个块内部包含了一定数目的相同尺度的卷积层。但与传统ResNet不同的是,在每个块的最后,Multi-scale-1D-ResNet还引入了一组具有不同滤波器长度的卷积层。这些卷积层使得模型能够在多个尺度上建模,从而能够更好地捕捉信号中的关键特征。 在实际应用中,Multi-scale-1D-ResNet被广泛用于诊断和预测方面,例如医疗领域中的心电(ECG)分析,智能交通领域中的交通流预测和自然语言处理领域中的文本分类等。 ### 回答2: multi-scale-1d-resnet是一种深度学习模型。它结合了多尺度信息和残差网络来处理1D信号(比如音频,生物医学信号等)。该模型包括了多个1D卷积层和池化层,以提取输入信号的不同尺度(比如音频信号的基频和谐波等)。同时,残差网络的加入可以有效地防止梯度消失问题,使得该模型能够训练更深的神经网络。 multi-scale-1d-resnet模型在许多应用领域都有广泛的应用,比如语音识别、心电诊断等。因为1D信号具有时域关系,而且大多数情况下其与其他数据(如像)没有直接的对应关系,所以需要一种特殊的模型来处理。multi-scale-1d-resnet模型的出现大大提高了这类问题的解决效率,具有很好的性能表现。 总之,multi-scale-1d-resnet是一种处理1D信号的深度学习模型,它集成了多尺度信息和残差网络,可以有效地提取1D信号的特征,以实现不同领域的应用。 ### 回答3: Multi-scale-1D-ResNet是一种深度学习模型,可以处理一维序列数据。该模型是在ResNet的基础上,加入了多尺度特征融合的机制。在传统的ResNet中,深度网络的信息流只有一个固定的尺度,而多尺度特征融合将不同尺度的特征进行融合,可以提高网络对不同尺度的信号的处理能力,提高模型的表达能力和泛化能力。 Multi-scale-1D-ResNet模型中,输入的一维时间序列数据首先通过多个卷积层提取特征,然后使用残差块将特征进行深层次的挖掘。在多尺度特征融合中,通过在不同的卷积层之间增加shortcut连接,将不同尺度的特征进行融合。同时,在全局池化层中,对不同尺度特征进行平均池化,得到融合后的特征表示。最后,通过全连接层将特征映射到输出维度,完成任务的预测。 Multi-scale-1D-ResNet适用于处理一维时间序列数据,如语音、信号、股票等数据。由于多尺度特征融合的机制,使得模型能够更好地处理不同尺度的信号分布,具有很强的泛化能力和适配性。同时,由于ResNet的残差块结构,可避免梯度消失等问题,能够训练更深层次的网络。因此,Multi-scale-1D-ResNet成为处理时间序列数据上的重要方法之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值