热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

resnet50代码_机器学习深度残差网络(ResNet)论文学习(附代码实现)

本文结合50层深度残差网络的实现学习何博士的大作-DeepResidualLearningforImageRecognition。理论上,深层网络结构包含了浅层网络结

本文结合50层深度残差网络的实现学习何博士的大作-Deep Residual Learning for Image Recognition。理论上,深层网络结构包含了浅层网络结构所有可能的解空间,但是实际网络训练中,随着网络深度的增加,网络的准确度出现饱和,甚至下降的现象,这个现象可以在下图直观看出来:56层的网络比20层网络效果还要差。但是这种退化并不是因为过拟合导致的,因为56层的神经网络的训练误差同样高。

6a17869577b7e445156813b758ccda5b.png

这就是神经网络的退化现象。何博士提出的残差学习的方法解决了解决了神经网络的退化问题,在深度学习领域取得了巨大的成功。

1.Residual Networks

各个深度的神经网络的结构如下:

51dbdb17805aa72325b22f8feb0bd48b.png

50层网络的结构实际上是把34层网络的2个3x3的卷积层替换成3个卷积层:1x1、3x3、1x1,可以看到50层的网络相对于34层的网络,效果上有不小的提升。

19ce5a27765298c276f258aa9d358d32.png

代码实现

ResNet 50代码实现的网络结构与上图50层的网络架构完全一致。对于深度较深的神经网络,BN必不可少,关于BN的介绍和实现可以参考以前的文章。

class ResNet50(object):

def __init__(self, inputs, num_classes=1000, is_training=True,

scope="resnet50"):

self.inputs =inputs

self.is_training = is_training

self.num_classes = num_classes

with tf.variable_scope(scope):

# construct the model

net = conv2d(inputs, 64, 7, 2, scope="conv1") # -> [batch, 112, 112, 64]

net = tf.nn.relu(batch_norm(net, is_training=self.is_training, scope="bn1"))

net = max_pool(net, 3, 2, scope="maxpool1") # -> [batch, 56, 56, 64]

net = self._block(net, 256, 3, init_stride=1, is_training=self.is_training,

scope="block2") # -> [batch, 56, 56, 256]

net = self._block(net, 512, 4, is_training=self.is_training, scope="block3")

# -> [batch, 28, 28, 512]

net = self._block(net, 1024, 6, is_training=self.is_training, scope="block4")

# -> [batch, 14, 14, 1024]

net = self._block(net, 2048, 3, is_training=self.is_training, scope="block5")

# -> [batch, 7, 7, 2048]

net = avg_pool(net, 7, scope="avgpool5") # -> [batch, 1, 1, 2048]

net = tf.squeeze(net, [1, 2], name="SpatialSqueeze") # -> [batch, 2048]

self.logits = fc(net, self.num_classes, "fc6") # -> [batch, num_classes]

self.predictions = tf.nn.softmax(self.logits)

2.Building Block

每个Block中往往包含多个子Block,每个子Block又有多个卷积层组成。每个Block的第一个子Block的第一个卷积层的stride=2,完成Feature Map的下采样的工作。

ae11aed9c96038b28aab06dc4ad7790e.png

代码实现

def _block(self, x, n_out, n, init_stride=2, is_training=True, scope="block"):

with tf.variable_scope(scope):

h_out = n_out // 4

out = self._bottleneck(x, h_out, n_out, stride=init_stride,

is_training=is_training, scope="bottlencek1")

for i in range(1, n):

out = self._bottleneck(out, h_out, n_out, is_training=is_training,

scope=("bottlencek%s" % (i + 1)))

return out

3. Bottleneck Architectures

在更深层(esNet-50/101/152)的神经网络中为了节省计算耗时, 作者对神经网络的架构进行了改造,将原有的两层3x3卷积层改造为三层卷积层:1x1,3x3,1x1。

The three layers are 1×1, 3×3, and 1×1 convolutions, where the 1×1 layers are responsible for reducing and then increasing (restoring)dimensions, leaving the 3×3 layer a bottleneck with smaller input/output dimensions。

8564aaf1769985c1b2f89f1892693ae7.png

代码实现:

x: 是输入数据,格式为[BatchSize, ImageHeight,ImageWidth, ChannelNum];

h_out: 卷积核个数;

n_out: Block的输出的卷积核个数;

stride: 卷积步长;

is_training: 用于Batch Normalization;

def _bottleneck(self, x, h_out, n_out, stride=None, is_training=True, scope="bottleneck"):

""" A residual bottleneck unit"""

n_in = x.get_shape()[-1]

if stride is None:

stride = 1 if n_in == n_out else 2

with tf.variable_scope(scope):

h = conv2d(x, h_out, 1, stride=stride, scope="conv_1")

h = batch_norm(h, is_training=is_training, scope="bn_1")

h = tf.nn.relu(h)

h = conv2d(h, h_out, 3, stride=1, scope="conv_2")

h = batch_norm(h, is_training=is_training, scope="bn_2")

h = tf.nn.relu(h)

h = conv2d(h, n_out, 1, stride=1, scope="conv_3")

h = batch_norm(h, is_training=is_training, scope="bn_3")

if n_in != n_out:

shortcut = conv2d(x, n_out, 1, stride=stride, scope="conv_4")

shortcut = batch_norm(shortcut, is_training=is_training, scope="bn_4")

else:

shortcut = x

return tf.nn.relu(shortcut + h)

4. Shortcuts

Identity Mapping是深度残差网络的一个核心思想,深度残差网络中Building Block表达公式如下:

fd37c5b9047f643ac4980f8845e5323e.png

x是Layer Input, y是未经过Relu激活函数的Layer Output, 是待学习的残差映射。

上式仅仅能处理F(x, wi)和x维度相同的情况,当二者维度不同的情况下应该怎么处理呢?

作者提出了两种处理方式: zero padding shortcut和 projection shortcut。并在实验中构造三种shortcut的方式:

A) 当数据维度增加时,采用zero padding进行数据填充;

B) 当数据维度增加时,采用projection的方式;数据维度不变化时,直接使用恒等映射;

C) 数据维度增加与否都采用projection的方式;

三种方式的对比效果如下:

49f75b5927e96319595a13339c8c8cda.png

可以看到效果排序如下: A

5.其它辅助函数的实现

5.1 变量初始化

fc_initializer = tf.contrib.layers.xavier_initializer

conv2d_initializer = tf.contrib.layers.xavier_initializer_conv2d

5.2 创建变量的辅助函数

# create weight variable

def create_var(name, shape, initializer, trainable=True):

return tf.get_variable(name, shape=shape, dtype=tf.float32,

initializer=initializer, trainable=trainable)

5.3 卷积辅助函数

# conv2d layer

def conv2d(x, num_outputs, kernel_size, stride=1, scope="conv2d"):

num_inputs = x.get_shape()[-1]

with tf.variable_scope(scope):

kernel = create_var("kernel



推荐阅读
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 最详尽的4K技术科普
    什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • com.hazelcast.config.MapConfig.isStatisticsEnabled()方法的使用及代码示例 ... [详细]
  • 在2019中国国际智能产业博览会上,百度董事长兼CEO李彦宏强调,人工智能应务实推进其在各行业的应用。随后,在“ABC SUMMIT 2019百度云智峰会”上,百度展示了通过“云+AI”推动AI工业化和产业智能化的最新成果。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
author-avatar
要做转播达人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有