深入理解shortcut

概述

shortcut(或shortpath,中文“直连”或“捷径”)是CNN模型发展中出现的一种非常有效的结构,本文将从Highway networks到ResNet再到DenseNet概述shortcut的发展。

前言

自2012年Alex Krizhevsky利用深度卷积神经网络(CNN)(AlexNet )取得ImageNet比赛冠军起,CNN在计算机视觉方面的应用引起了大家广泛地讨论与研究,也涌现了一大批优秀的CNN模型。研究人员发现,网络的深度对CNN的效果影响非常大,但是单纯地增加网络深度并不能简单地提高网络的效果,由于梯度发散,反而可能损害模型的效果。而shortcut的引入就是解决这个问题的妙招。本文主要就模型发展中的shortcut展开讨论。

1. Highway networks

Highway 是较早将shortcut的思想引入深度模型中一种方法,目的就是为了解决深度网络中梯度发散,难以训练的问题。我们知道,对于最初的CNN模型(称为“plain networks”,并不特指某个模型框架),只有相邻两层之间存在连接,如图1所示,x、y是相邻两层,通过W_H连接,通过将多个这样的层前后串接起来就形成了深度网络。相邻层之间的关系如下,

                                                                            

网络变化如下图:

                                                                         

为了解决深度网络的梯度发散问题,Highway在两层之间增加了(带权的)shortcut。两层之间的结构如图所示。

                                                                          

关系式如下:

                                                           

其中设置C=1-T,可以将上式改写为:

                                                       

文中作者将T称为“transform gate”,将C称为“carry gate”。输入层x是通过C的加权连接到输出层y。通过这种连接方式的改进,缓解了深度网络中的梯度发散问题。

2.ResNet

ResNet的动机依然是解决深度模型中的退化问题:层数越深,梯度越容易发散,误差越大,难以训练。理论上,模型层数越深,误差应该越小才对,因为我们总可以根据浅层模型的解构造出深层模型的解(将深层模型与浅层模型对应的层赋值为浅层模型的权重,将后面的层取为恒等映射),使得这个深层模型的误差不大于浅层模型的误差。但是实际上,深度模型的误差要比浅层模型的误差要大,

作者认为产生这种现象的原因是深度模型难以优化,难以收敛到较优的解,并假设相比于直接优化最初的plain networks的模型F(x)=y,残差F(x)=y-x更容易优化。

对于ResNet,形式化地表示为下图,优化的目标F为F(x)=y-x,即为残差。

                                                   

需要注意的是,变换F可以是很多层,也就是说shortcut不一定只跨越1层。并且实际中,由于shortcut只跨越单层没有优势,ResNet中是跨越了2层或3层。ResNet-34中,采用下图左侧的shortcut跨越方式;ResNet-50/101/152采用下图右侧的shortcut跨越方式。

                                      

对比highway networks和plain networks,可以看到ResNet的改进主要在以下方面:

  • 将highway networks的T和C都设为1,降低模型的自由度(深度模型中,自由度越大未必越好。自由度越大,训练会比较困难)。
  • shortcut不仅限于跨越1层,而可以跨越2层或3层。

三、DenseNet

DenseNet 的初衷依然是为了解决深度模型的退化问题——梯度发散,借鉴highway networks和ResNet的思路,DenseNet将shortcut用到了“极致”——每两层之间都添加shortcut,L层的网络共有L*(L-1)/2个shortcut(如果我们这样做模型会不会太大?参数会不会太多?计算会不会太慢?作者当然不会直接这么做)。通过shortcut可以直接将浅层的信息传递到深层,一方面可以解决退化问题,另一方面也可以看作是特征重用(feature reuse)。

对于ResNet,相邻两层之间有:

                                                                    

                                                                   

 对于DenseNet,则有 :       

                                                                   

连接单元如下图所示,每层的输出结果都会通过shortcut连接到后面的层。

                                                     

如果真的每层的输出都稠密地连接到后面的所有层,那么模型将变得非常“宽”,计算将会很慢。因此,作者采用的是“局部”稠密连接,如下图所示,每个block里面才进行稠密连接。每个block里面的连接方式如下图所示,前面层的输出通过shortcut直接连接到block中后面的其他层。block之间通过transition层连接。

                                                             

对于一个包括t层的block,假设每层输出k个feature map(或通道),则第i(1 ≤i≤ t)层的输入feature map数为k*(i-1)+k0,其中k0为block的输入的通道数。将层分block只是限制了i的大小,如果每层的输出数k比较大的话,计算仍然很慢,因此作者也对k进行了限制,文中k称为growth rate。此外为了将模型进一步压缩,作者还采用了bottleneck layer和对transition的输出进行压缩(DenseNet-BC)。

转载自https://cloud.tencent.com/developer/article/1148375

<think>嗯,用户问的是如何在UniApp中实现应用快捷方式的功能。首先,我需要回忆一下UniApp相关的知识,尤其是关于创建桌面快捷方式的部分。记得之前看到过引用[2]提到,UniApp的App端内置了HTML5+引擎,可以直接使用plus对象。所以,可能需要用到HTML5+的API。 接下来,我应该确认UniApp的版本要求。用户可能需要配置manifest.json文件,启用相关的模块。比如,在HBuilder X中,可能需要勾选"Shortcut"模块,或者在manifest里添加android的快捷方式配置。 然后,具体的实现步骤应该是怎样的呢?首先,动态创建快捷方式可能需要调用plus.android的接口。比如,获取当前Activity,然后使用Intent来创建快捷方式。这部分代码可能需要写原生Android的代码,通过UniApp的机制调用。 另外,用户可能需要静态配置快捷方式,也就是在应用安装时就存在的。这时候需要在manifest.json中配置shortcuts数组,指定图标、名称和跳转路径。这应该是在原生配置部分,比如在android的配置节点下添加。 还需要考虑Android和iOS的兼容性问题。可能Android支持静态和动态快捷方式,而iOS可能不支持,或者需要不同的实现方式。用户可能需要被告知这些平台差异。 另外,用户可能需要示例代码。比如,动态创建快捷方式的函数,如何在UniApp的页面中调用,如何设置图标和名称,以及如何处理点击事件,跳转到指定页面。同时,需要注意权限问题,比如Android上可能需要用户授权才能创建快捷方式。 还有,引用[1]提到了动态切换应用图标和名称的插件,虽然用户的问题是关于快捷方式的,但或许可以提一下相关插件,但可能不需要深入,除非有直接关联。 需要确保用户了解如何配置manifest文件,以及动态创建时使用的JavaScript代码。同时,提醒用户注意真机调试,因为模拟器可能不支持某些功能。 最后,总结步骤,分点说明静态配置和动态创建的步骤,给出代码示例,并指出平台限制和注意事项。这样用户就能清楚如何实现了。</think>### UniApp实现应用快捷方式功能分步指南 在UniApp中实现应用快捷方式(Shortcut)功能主要通过HTML5+扩展API实现,以下是具体实现步骤和注意事项: #### 一、基础环境准备 1. 确保使用HBuilderX 3.3.0+版本 2. 在manifest.json中添加Android权限: ```json "permission": { "Android": { "request": ["INSTALL_SHORTCUT", "UNINSTALL_SHORTCUT"] } } ``` #### 二、静态快捷方式配置(应用安装时创建) ```json // manifest.json "app-plus": { "distribute": { "android": { "shortcuts": [{ "id": "main", "icon": "/static/logo.png", "label": "主页入口", "action": "pages/index/index" }] } } } ``` #### 三、动态创建快捷方式(运行时创建) ```javascript // 在vue页面中添加方法 function createShortcut() { if (plus.os.name === 'Android') { const main = plus.android.runtimeMainActivity(); const Intent = plus.android.importClass('android.content.Intent'); const ShortcutIconResource = plus.android.importClass('android.content.Intent.ShortcutIconResource'); // 创建快捷方式意图 const shortcutIntent = new Intent(main.getIntent()); shortcutIntent.setAction(Intent.ACTION_MAIN); shortcutIntent.addCategory(Intent.CATEGORY_LAUNCHER); // 添加快捷方式 const addIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "我的快捷方式"); const iconRes = ShortcutIconResource.fromContext(main, main.getApplicationInfo().icon); addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes); main.sendBroadcast(addIntent); } } ``` #### 四、功能特性对比 | 类型 | 触发时机 | 修改权限 | 平台支持 | |------------|----------------|----------------|----------------| | 静态快捷方式 | 安装时自动创建 | 需更新应用版本 | Android 7.1+ | | 动态快捷方式 | 运行时动态创建 | 需用户授权 | 部分Android系统| #### 五、注意事项 1. 动态创建需要用户手动授权,部分厂商系统(如小米、华为)会限制该功能[^2] 2. 快捷方式图标建议使用72x72px的PNG格式 3. iOS系统暂不支持快捷方式功能 4. 真机调试时需勾选"使用手机系统环境"
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值