python神经网络ResNet50模型


Posted in Python onMay 06, 2022

什么是残差网络

最近看yolo3里面讲到了残差网络,对这个网络结构很感兴趣,于是了解到这个网络结构最初的使用是在ResNet网络里。

Residual net(残差网络):
 

将靠前若干层的某一层数据输出直接跳过多层引入到后面数据层的输入部分。

意味着后面的特征层的内容会有一部分由其前面的某一层线性贡献。

其结构如下:

python神经网络ResNet50模型


深度残差网络的设计是为了克服由于网络深度加深而产生的学习效率变低与准确率无法有效提升的问题。

什么是ResNet50模型

ResNet50有两个基本的块,分别名为Conv Block和Identity Block,其中Conv Block输入和输出的维度是不一样的,所以不能连续串联,它的作用是改变网络的维度;

Identity Block输入维度和输出维度相同,可以串联,用于加深网络的。

Conv Block的结构如下:

python神经网络ResNet50模型


Identity Block的结构如下:

python神经网络ResNet50模型


这两个都是残差网络结构。

总的网络结构如下:

python神经网络ResNet50模型


这样看起来可能比较抽象,还有一副很好的我从网上找的图,可以拉到最后面去看哈,放前面太占位置了。

ResNet50网络部分实现代码

#-------------------------------------------------------------#
#   ResNet50的网络部分
#-------------------------------------------------------------#
from __future__ import print_function

import numpy as np
from keras import layers

from keras.layers import Input
from keras.layers import Dense,Conv2D,MaxPooling2D,ZeroPadding2D,AveragePooling2D
from keras.layers import Activation,BatchNormalization,Flatten
from keras.models import Model

from keras.preprocessing import image
import keras.backend as K
from keras.utils.data_utils import get_file
from keras.applications.imagenet_utils import decode_predictions
from keras.applications.imagenet_utils import preprocess_input


def identity_block(input_tensor, kernel_size, filters, stage, block):

    filters1, filters2, filters3 = filters

    conv_name_base = 'res' + str(stage) + block + '_branch'
    bn_name_base = 'bn' + str(stage) + block + '_branch'

    x = Conv2D(filters1, (1, 1), name=conv_name_base + '2a')(input_tensor)
    x = BatchNormalization(name=bn_name_base + '2a')(x)
    x = Activation('relu')(x)

    x = Conv2D(filters2, kernel_size,padding='same', name=conv_name_base + '2b')(x)

    x = BatchNormalization(name=bn_name_base + '2b')(x)
    x = Activation('relu')(x)

    x = Conv2D(filters3, (1, 1), name=conv_name_base + '2c')(x)
    x = BatchNormalization(name=bn_name_base + '2c')(x)

    x = layers.add([x, input_tensor])
    x = Activation('relu')(x)
    return x


def conv_block(input_tensor, kernel_size, filters, stage, block, strides=(2, 2)):

    filters1, filters2, filters3 = filters

    conv_name_base = 'res' + str(stage) + block + '_branch'
    bn_name_base = 'bn' + str(stage) + block + '_branch'

    x = Conv2D(filters1, (1, 1), strides=strides,
               name=conv_name_base + '2a')(input_tensor)
    x = BatchNormalization(name=bn_name_base + '2a')(x)
    x = Activation('relu')(x)

    x = Conv2D(filters2, kernel_size, padding='same',
               name=conv_name_base + '2b')(x)
    x = BatchNormalization(name=bn_name_base + '2b')(x)
    x = Activation('relu')(x)

    x = Conv2D(filters3, (1, 1), name=conv_name_base + '2c')(x)
    x = BatchNormalization(name=bn_name_base + '2c')(x)

    shortcut = Conv2D(filters3, (1, 1), strides=strides,
                      name=conv_name_base + '1')(input_tensor)
    shortcut = BatchNormalization(name=bn_name_base + '1')(shortcut)

    x = layers.add([x, shortcut])
    x = Activation('relu')(x)
    return x


def ResNet50(input_shape=[224,224,3],classes=1000):

    img_input = Input(shape=input_shape)
    x = ZeroPadding2D((3, 3))(img_input)

    x = Conv2D(64, (7, 7), strides=(2, 2), name='conv1')(x)
    x = BatchNormalization(name='bn_conv1')(x)
    x = Activation('relu')(x)
    x = MaxPooling2D((3, 3), strides=(2, 2))(x)

    x = conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1))
    x = identity_block(x, 3, [64, 64, 256], stage=2, block='b')
    x = identity_block(x, 3, [64, 64, 256], stage=2, block='c')

    x = conv_block(x, 3, [128, 128, 512], stage=3, block='a')
    x = identity_block(x, 3, [128, 128, 512], stage=3, block='b')
    x = identity_block(x, 3, [128, 128, 512], stage=3, block='c')
    x = identity_block(x, 3, [128, 128, 512], stage=3, block='d')

    x = conv_block(x, 3, [256, 256, 1024], stage=4, block='a')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='b')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='c')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='d')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='e')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='f')

    x = conv_block(x, 3, [512, 512, 2048], stage=5, block='a')
    x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b')
    x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c')

    x = AveragePooling2D((7, 7), name='avg_pool')(x)

    x = Flatten()(x)
    x = Dense(classes, activation='softmax', name='fc1000')(x)

    model = Model(img_input, x, name='resnet50')

    model.load_weights("resnet50_weights_tf_dim_ordering_tf_kernels.h5")

    return model

图片预测

建立网络后,可以用以下的代码进行预测。

if __name__ == '__main__':
    model = ResNet50()
    model.summary()
    img_path = 'elephant.jpg'
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)

    print('Input image shape:', x.shape)
    preds = model.predict(x)
    print('Predicted:', decode_predictions(preds))

预测所需的已经训练好的ResNet50模型可以在https://github.com/fchollet/deep-learning-models/releases下载。非常方便。
预测结果为:

Predicted: [[('n01871265', 'tusker', 0.41107917), ('n02504458', 'African_elephant', 0.39015812), ('n02504013', 'Indian_elephant', 0.12260196), ('n03000247', 'chain_mail', 0.023176488), ('n02437312', 'Arabian_camel', 0.020982226)]]

以上就是python神经网络ResNet50模型的复现详解的详细内容!


Tags in this post...

Python 相关文章推荐
Python实现合并字典的方法
Jul 07 Python
Django中反向生成models.py的实例讲解
May 30 Python
mac安装pytorch及系统的numpy更新方法
Jul 26 Python
python后端接收前端回传的文件方法
Jan 02 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 Python
Python CSV文件模块的使用案例分析
Dec 21 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
自学python用什么系统好
Jun 23 Python
python中取绝对值简单方法总结
Jul 24 Python
python-图片流传输的思路及示例(url转换二维码)
Dec 21 Python
pytorch 实现在测试的时候启用dropout
May 27 Python
python多次执行绘制条形图
Apr 20 Python
python和anaconda的区别
May 06 #Python
python神经网络Xception模型
May 06 #Python
Python使用永中文档转换服务
May 06 #Python
Python tensorflow卷积神经Inception V3网络结构
May 06 #Python
Python实现Matplotlib,Seaborn动态数据图
May 06 #Python
PYTHON InceptionV3模型的复现详解
代码复现python目标检测yolo3详解预测
You might like
PHP生成静态HTML文档实现代码
2016/06/23 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
2018/02/07 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
vue组件name的作用小结
2018/05/23 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
layer弹出层扩展主题的方法
2019/09/11 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
Python requests模块session代码实例
2020/04/14 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
HTML5之语义标签介绍
2016/07/07 HTML / CSS
生产班组长岗位职责
2014/01/05 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
房展策划方案
2014/06/07 职场文书
禁毒宣传标语
2014/06/19 职场文书
机械机修工岗位职责
2014/08/03 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记
Python可视化神器pyecharts绘制水球图
2022/07/07 Python