Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度学习实战篇之 ( 十六) -- TensorFlow之ResNet

深度学习实战篇之 ( 十六) -- TensorFlow之ResNet

作者头像
用户5410712
发布于 2022-06-01 12:16:42
发布于 2022-06-01 12:16:42
73700
代码可运行
举报
文章被收录于专栏:居士说AI居士说AI
运行总次数:0
代码可运行

科普知识

NIPS(NeurIPS),全称神经信息处理系统大会(Conference and Workshop on Neural Information Processing Systems),是一个关于机器学习和计算神经科学的国际会议。该会议固定在每年的12月举行,由NIPS基金会主办。NIPS是机器学习领域的顶级会议 。在中国计算机学会的国际学术会议排名中,NIPS为人工智能领域的A类会议。

# 前言

SEP.

理论篇的上一篇文章中我们学习了残差网络(ResNet),其核心思想是通过跳跃连接构建残差结构,使得网络可以突破深度的限制,从而构建更加深层次的网络。

TensorFlow之ResNet实战

本期实战分享我们主要对ResNet网络结构中常用的ResNet-18进行代码Tensorflow实践, 本次代码十分简洁,希望各位全程跟上。

1.数据准备

本次数据采用RAFDB人脸表情数据集,包含七个分类:平和,开心,悲伤,

惊讶,厌恶,愤怒,害怕。与之前的数据集类似,该人脸表情数据集也包含

训练集合测试集,每个集中没别包含7个文件夹(表情)。与之前的数据集

一样,该数据集包含训练集与测试集,每个集包含七个文件夹(表情)

一些样本展示

2.网络结构

上图包含了ResNet网络的常见版本,本次分享以18层的ResNet-18为例,网络结构为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 残差块构建
def ResBlock(name, num_blocks, input, inchannel, outchannel, stride):
    conv_input = input
    conv_inchannel = inchannel
    conv_stride = stride
    for i in range(num_blocks):
        out = Conv_layer(names = '{}{}'.format(name, i), input = conv_input , w_shape = [3, 3, conv_inchannel, outchannel], b_shape = [outchannel], strid = [conv_stride, conv_stride])
        conv_input = out
        conv_inchannel = outchannel
        conv_stride = 1
    
    # 残差
    if stride > 1:
        shortcut  = Conv_layer(names = '{}_{}'.format(name,i), input = input , w_shape = [1, 1, inchannel, outchannel], b_shape = [outchannel], strid = [stride, stride])
        out  = out + shortcut 
    return out
    
    # 残差网络构建
    def inference(images, batch_size, n_classes,drop_rate):
    print("******** images {} ".format(images.shape))
    #第一层预处理卷积
    pre_conv1 = Conv_layer(names = 'pre_conv', input = images , w_shape = [7, 7, 3, 64], b_shape = [64], strid = [2, 2])
    print("******** pre_conv1 {} ".format(pre_conv1.shape))

    # 池化层
    pool_1 = Max_pool_lrn(names = 'pooling1', input = pre_conv1 , ksize = [1, 3, 3, 1], is_lrn = False)
    # print("******** pool_1 {} ".format(pool_1.shape))

    # 第一个卷积块(layer1)
    layer1 = ResBlock('Resblock1', 2, pool_1, 64, 64, 1)
    print("******** layer1 {} ".format(layer1.shape))

    # 第二个卷积块(layer2)
    layer2 = ResBlock('Resblock2', 2, layer1, 64, 128, 2)
    print("******** layer2 {} ".format(layer2.shape))

    # 第三个卷积块(layer3)
    layer3 = ResBlock('Resblock3', 2, layer2, 128, 256, 2)
    print("******** layer3 {} ".format(layer3.shape))

    # 第四个卷积块(layer4)
    layer4 = ResBlock('Resblock4', 2, layer3, 256, 512, 2)
    print("******** layer4 {} ".format(layer4.shape))

    # 全局平均池化
    global_avg = tf.nn.avg_pool(layer4, ksize=[1,7,7,1],strides=[1,7,7,1],padding='SAME')
    print("******** global_avg {} ".format(global_avg.shape))

    reshape = tf.reshape(global_avg, shape=[batch_size, -1])
    dim = reshape.get_shape()[1].value

    with tf.variable_scope('softmax_linear') as scope:
        weights = tf.Variable(tf.truncated_normal(shape=[dim, n_classes], stddev=0.005, dtype=tf.float32),
                              name='softmax_linear', dtype=tf.float32)

        biases = tf.Variable(tf.constant(value=0.1, dtype=tf.float32, shape=[n_classes]),
                             name='biases', dtype=tf.float32)

        resnet18_out = tf.add(tf.matmul(reshape, weights), biases, name='softmax_linear')
        print("---------resnet18_out:{}".format(resnet18_out))

    return resnet18_out

3.训练过程

源码获取:https://gitee.com/fengyuxiexie/res-net-18

END

结语

本期分享就到此结束了,残差网络因其卓越的性能深受众多研究者喜爱,由此,残差网络在很多数据集上已经成为了基线模型。

由于残差网络结构实现简单,小编希望各位童鞋能够在看懂网络结构后自己动手实现,深刻体会图像在残差网络中的维度变换,同时学习Tensorflow中卷积的步长与填充的使用,进一步提升Tensorflow的实战能力。

此外,由于Pytorch框架在学术界的受欢迎程度,后面的文章我们或许不再使用Tensorflow,而是直接采用Pytorch实现,希望各位继续喜欢。

编辑:玥怡居士|审核:小圈圈居士

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT进阶之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C嘎嘎入门篇:类和对象(1)
小编在之前讲述了C++的部分入门基础,读者朋友一定要掌握好那些,因为C++的学习和C有点不同,C++的知识都是比较连贯的,所以我们学好了前面才可以学习后面的内容,本篇文章小编将会讲述C++真正的入门篇:类和对象,学完这一部分后我们才可以说我们真的C++入门了,下面废话不多说,开启今天第一部分的讲解:
用户11295429
2024/10/16
1020
C嘎嘎入门篇:类和对象(1)
python入门教程NO.9 怎么理解面向对象编程?看我就够了!
在python中,用变量表示属性,用函数表示方法,因此具有相同属性和方法的一类事物就是‘类’,对象就是这这类事物中具体的一个。
python鱼霸霸
2020/04/23
4300
1.面向对象:初识
面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。
changxin7
2019/08/14
3070
初识Python面向对象
对象具有的行为(动词),通常可以定义成 方法(用类去定义的的对象所具备的可操作的能力叫做方法)
星陨1357
2023/03/14
2090
初识Python面向对象
【C++入门篇】保姆级教程篇【中】
由上一篇的博客我们已经学习到可以写出的基本C++程序了,接下来我们将要进入C++重要的一环——面向对象,在学习面向对象之前,我觉得有必要先了解一下面向对象的由来,那么我们就从语言的发展史开始今天的学习之旅吧!
用户11029129
2024/06/04
1360
【C++入门篇】保姆级教程篇【中】
【C++】踏上C++的学习之旅(六):深入“类和对象“世界,掌握编程的黄金法则(一)
在本文中我们即将要接触到C++的第一块"硬骨头"——“类和对象”。为什么说"类和对象"是一块一骨头呢?因为里面涉及的语法细节十分的繁杂,不过读者们不必担心,我的"类和对象"这个系列会罗列和讲解各种语法细节,还要对这些地方加以认证,以帮助大家能够感知到这些细节的存在更好的理解"类和对象"的玩法!
埋头编程
2024/11/15
1750
【C++】踏上C++的学习之旅(六):深入“类和对象“世界,掌握编程的黄金法则(一)
初识C++ · 类和对象(上)
C语言是一门面向过程的语言,注重的是解决问题的过程,举个例子——洗衣服,洗衣服的过程是:拿衣服——放进洗衣机——放洗衣液——放水——打开洗衣机——开始工作——结束——晾衣服,注重整个过程,C++是一门面向对象的语言,注重的是解决问题时候涉及的对象,比如洗衣服的时候涉及到了衣服,洗衣机,水,洗衣液等对象,注重的是对象交互来解决某个问题。
_lazy
2024/10/16
890
初识C++ · 类和对象(上)
python开发第六篇--递归函数和面
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
py3study
2020/01/03
3380
从基础入门到学穿C++(类和对象篇)【超详细】【一站式速通】
C语言是一种面向过程的语言,C++和python、java一样都是一种面向对象的语言。
see.
2024/06/04
1361
从基础入门到学穿C++(类和对象篇)【超详细】【一站式速通】
【c++】类和对象(一)
在面向过程编程中,我们关注的是如何一步一步地执行这些任务,每个步骤都是一个过程或函数,我们按照顺序调用它们,最终得到想要的结果。这里的食材和步骤是分开的,首先我们定义了食材(数据),然后通过一系列的函数(步骤)来处理这些食材
用户11029103
2024/04/02
1220
【c++】类和对象(一)
Python面向对象编程(一)
1.面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的编程就好比设计一条流水线,是一种机械式的思维方式。
py3study
2020/01/07
3330
Python面向对象编程(一)
【C++】42道面试经典问题总结
C和C++的内存分布没有区别,usr space (reserve、.text、.rodata、.bss、heap stack 命令行参数和环境变量)+kernal space(ZONE_DMA 、ZONE_NORAMAL、ZONE_HIGHMEM)
洁洁
2024/09/11
2210
Java教程分享Java面向对象与面向过程[通俗易懂]
Java教程分享Java面向对象与面向过程,面向对象: 是一种看待问题, 解决问题的思维方式, 着眼点在于找到一个能够帮助解决问题的实体, 然后委托这个实体来解决问题
全栈程序员站长
2022/09/15
2270
【C++初阶】类和对象修炼上
C语言是面向过程的语言,关注的是过程,把洗衣服这件事拆分成浸泡,漂洗,脱水,晾干等过程,把过程写成函数,最后调用函数来完成;
MicroFrank
2023/01/16
7790
第二阶段-Java面向对象:【第一章 面向对象】
在我们正式进入学习这部分前,了解一下面向过程和面向对象这两个概念,对于我们 接下来的学习有很大的好处。别急,下面我就来和你说一说。
BWH_Steven
2019/08/09
6080
什么是面向对象? Java 的灵魂概念
为满足移动端和PC端的双重阅读体验,以及文章质量的保证,开始重构的以及新写的文章都会基于 “语雀” 平台编写,公众号会同步刚发布的文章,但随后的修改或者更新只会在语雀中维护。
BWH_Steven
2021/09/22
5520
什么是面向对象? Java 的灵魂概念
【 JavaSE 】 类和对象
作用:this表示当前对象引用(注意不是当前对象),可以借助 this 来访问对象的字段和方法
用户9645905
2022/11/30
4940
【 JavaSE 】 类和对象
【C++篇】类与对象(上篇):从面向过程到面向对象的跨越
大家好,我是“我想吃余”,很高兴你能和我一起进入到C++的学习中,我会将我的学习过程中的宝贵经验不遗余力的输入到文章中,希望可以帮助到你的学习。本文涵盖了从面向过程与面向对象的区别,到类的定义、访问限定符、封装、作用域、实例化、对象大小计算,以及this指针等内容。
我想吃余
2025/03/31
1620
【C++篇】类与对象(上篇):从面向过程到面向对象的跨越
Java基础语法(七)——类和对象
  相信大家都吃过月饼,我们做月饼的模子就是一个类,而通过这个模子可以做出月饼,那么在这个例子当中,类就是那个模子,而月饼就是那个对象,所以月饼就是一个实体。一个模子可以实例化无数个对象。
RAIN7
2021/08/11
5590
开源图书《Python完全自学教程》8.1面向对象
有的资料将这一章内容命名为“面向对象”,虽然没有错误,但这并不很 Pythonic ,因为 Python 中的函数是第一类对象,在前一章中已经开始“面向对象”了。其实不仅仅是第7章,本书从一开始,就在“面向对象”。那么,本章的类与对象有什么关系?为什么很多自学者会在学到本章的时候遇到困难?如何跨过这个难关?请读者满怀信心地认真学习本章和第9章,严格地执行各项学习建议。“漫卷诗书喜欲狂”的成功愉悦就在不远的将来。
老齐
2022/07/06
3720
开源图书《Python完全自学教程》8.1面向对象
推荐阅读
相关推荐
C嘎嘎入门篇:类和对象(1)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验