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 相关文章推荐
python3判断url链接是否为404的方法
Aug 10 Python
详解django的serializer序列化model几种方法
Oct 16 Python
将pandas.dataframe的数据写入到文件中的方法
Dec 07 Python
python 检查文件mime类型的方法
Dec 08 Python
详解Python 解压缩文件
Apr 09 Python
值得收藏的10道python 面试题
Apr 15 Python
python添加菜单图文讲解
Jun 04 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
python基础教程之while循环
Aug 14 Python
python语言线程标准库threading.local解读总结
Nov 10 Python
python 装饰器的基本使用
Jan 13 Python
Python Matplotlib绘制动画的代码详解
May 30 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 Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
2014/06/23 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
php常用字符串比较函数实例汇总
2014/11/24 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
python进程与线程小结实例分析
2018/11/11 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
dedecms页面如何获取会员状态的实例代码
2016/03/15 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
jQuery上传多张图片带进度条样式(DEMO)
2017/03/02 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
Python getopt模块处理命令行选项实例
2014/05/13 Python
Python 探针的实现原理
2016/04/23 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
python3爬虫怎样构建请求header
2018/12/23 Python
Python的UTC时间转换讲解
2019/02/26 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
Python爬取网页信息的示例
2020/09/24 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
医院后勤自我鉴定
2013/10/13 职场文书
普通大学毕业生自荐信范文
2014/02/23 职场文书
人事专员的岗位职责
2014/03/01 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
财务总监岗位职责
2015/02/03 职场文书
营运督导岗位职责
2015/04/10 职场文书
新郎婚礼致辞
2015/07/27 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书