实战 | 封装解决WebView的那些坑

AgentWeb 替换WebView库 ,并且还是一个简洁易用的 Android Web 库 AgentWeb 替换WebView库 ,并且还是一个简洁易用的 Android Web 库 引用包 implementation ‘com.just.agentweb:agentweb:4.0.3-beta’ AgentWeb 源码开放地址 https://github.com/Justson/AgentWeb 效果图片,可放大,缩小(并且隐藏了原有的缩放按钮),返回,退出 下面我... 阅读详情

WebView 是 Android 最复杂以及最强大的一个控件(最多坑) , 一大堆的 setting 让人摸不着头脑 , 很多时候压根不知道这个设置有什么用 ,加上 WebViewClient 和 WebChromeClient 做为内部类 , 一堆业务逻辑 , 使得 Activity 变得乱糟糟的 ,代码可读性更是糟糕透了 , 最后被逼上梁山 , 走上了封装的道路 。

 

1

WebView 封装思路

 

对于 WebView 的封装 , 相信很多人都是抽象在一个基类里面 , 封装成一个 BaseWebActivity , 或者 BaseWebFragment , 对于这种封装还是不能满足像我这种有洁癖有程序员的 , 因为复用性不高 , 而且容易导致 Activity 或者 Fragment 基类膨胀 。 

 

下面向大家分享我的封装思路。

 

首先让大家看下我封装的效果

 

 

效果图

 

 

上面已经封装成一个 Web 库了 , 叫 AgentWeb , 欢迎大家使用 。

可以看到里面没有一句 WebSettings , 甚至 WebChromeClient 和 WebViewClient 都不用配置 , 使用的是简洁链式调用 。

 

AgentWeb 封装思路是通过代理 , 将 WebView 从 Activity 或者 Fragment 中代理出来 , 不再需要 Activity 或者 Fragment 内部创建和管理 ,Activity 管理 WebView 需要通过 AgentWeb , 下面通过 UML 图来简单说明下 .

 

BaseActivity 封装使用的 UML 关系图

AgentWeb 封装使用的 UML 关系图

BaseWebActivity 直接组合 WebView , 这样做为什么说复用性不高呢 ? 主要还是因为 WebView 依附在 BaseWebActivity 身上 ,要别人直接继承你的 Activity 是很不好的 ,因为 Java 的单继承关系 , 使得使用基类的灵活性受到很大的约束 , 这也是 Effective Java 里面提到的组合优先于继承 。

 

AgentWeb 则不同 , AgentWeb 是一个独立的库 , 可以让你很方便一句话就引入 , 不需要依赖 BaseWebActivity , 就像上面一样简简单单一句话引入即可。

 

AgentWeb 把 WebView 代理出来 , 将功能细分成一个类去管理 , 比如说的 WebCreator 负责创建 WebView 以及 进度条 、WebSettings 则是对 WebView 进行统一设置 , JsEntraceAccess 是对 Javascript 方法访问进行统一入口 , 这样做使得每一个功能独立 , 相互不影响 , 也使得 AgentWeb 的结构更清晰 , 符合单一职责原则 。

 

 源码太多就不贴了 ,下面分享下封装 WebView 遇到的一些问题 。

 

2

WebView 封装的一些问题与解决思路

 

WebView 的封装可谓真是一波三折啊 , WebView 实在太多坑了 , 比如说 常见的泄露 , Js 安全 ,低版本跨源问题 , Context 引致的 onJsAlert 失效 ,Android 4.4 不支持文件选择问题等等。

 

(1)内存泄露

 

这个问题在低版本不好解决就算类似下面代码通过反射制空 sConfigCallback 该字段, 还是有些手机会出现泄露 ,对于该问题 ,唯一有效方案解决在 AndroidManifest 里面为 Web Activity 添加 android:process=":web" 属性 , 然后在 该 Activity onDestroy 里面 执行 System.exit(0); 

 

下面可以解决一部分泄露

 

 

(2)addJavascriptInterface API 引起的远程代码执行漏洞

 

对于这个问题 ,我相信大家或多或少都有点了解 ,问题是由注入类引起 ,从注入类中找到 Runtime 对象 ,可以通过 Runtime 执行 shell 命令 。 

 

Google 只针对 Android 4.2.2 版本及以上版本给出了解决方法 ,为了解决兼容 4.2.2 以下版本这个问题 AgentWeb 采用 360 大牛给出的方案 , 向 Web 页面注入一段 Js 脚本 ,然后通过脚本弹 Prompt 向 Java 通信 ,解决了 4.2.2 以下版本 addJavascriptInterface 安全通信问题 。 

 

下面给出大致实现

 

比如下面注入类

 

 

低于 Android 4.2.2 的版本上面的注入对象会经过包装拼接成如下脚本 。

 

注入的脚本

 

 

 

通过 webView.loadUrl(脚本) 注入上面的脚本 。

 

Js 执行下面方法

 

 

就会执行上面的 function 里面的方法体 ,Android 端回调onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) message 参数里面取出 js 要调的目标方法 , 然后通过反射调用该目标方法 。

 

(3)对于同源跨域攻击问题

 

什么是同源策略吗 ? 同源策略是由 Netscape 提出来的 ,现在主流的浏览器都遵循这种策略 ,同源是一般指

http://(协议)www.google.com(主机):8080 (端口) 

 

三要素都相同 ,但实际上并不是那么严格 , 比如 IE 就会忽略对端口的判断 。

 

同源有什么作用吗 ?
 

同源的数据默认为可以安全访问的 。 比如说url http://www.google.com:xxxx/login 登录后浏览器就会把返回来的 cookies 保存起来 , 对于 http://www.google.com:xxxx/index.html 对于这个 url 浏览器会默认为跟前者同源 , 那么这个 url 可以无缝的访问到 login 保存下来的 cookies 。

 

大家都知道 Android 应用之间的文件和数据一般情况下是不能相互访问的 , 但是不正确的使用 WebView ,会打破这种状况 , 比如说以下这种使用

将该 Activity 设置 exported="true" , 其他应用就可以通过隐式启动 ,将 data 作为 url ,启动的该应用 , 让该应用加载脚本 ,遍历该应用内的文件或者私密文件 , 上传服务器 。

 

这个问题一直存在 Android 手机中 ,这个问题 Google 并没有修复它 ,只是在 4.2 后的版本把 setAllowFileAccessFromFileURLs 以及 mWebSettings.setAllowUniversalAccessFromFileURLs 设置为 false , 用户没有刻意去开启它 , 高于 Android 4.2 版本默认是安全的 。 

 

对于该问题 AgentWeb 使用的是以下设置 。

 

(4)Context 引致的 onJsAlert 失效

 

这个问题根本原因在防止泄露时候创建 new  WebView(activity.getApplicationContext()); 导致 , 很正常啊 , 因为你创建 WebView 传的是 Application , Application 本身是无法弹 Dialog 的 。

 

 所以只能无反应 !这个问题解决方案只要你创建 WebView 时候传入 Activity , 或者 自己实现 onJsAlert 方法即可。

 

(5)Android 4.4 文件访问

 

Android 4.4 WebView 内核正式有 WebKit 替换 为 Chromium 使得很多 Api 都废弃掉了,这是 Google 正式宣告抛弃 Webkit 的一个句号 。 

 

所以要兼容 Android 4.4 以下的 WebView 的应用特别难受 。回到正题 ,4.4 文件访问 ,你会发现 4.4 点击 input 标签没反应 ,瞬间一万只曹尼玛在崩腾 , 幸庆的是还有 Js 通信 ,解决方案:可以通能过 Js 访问 Java 然后打开文件选择器 ,拿到文件后 ,将文件转成 Base64 字符串回传给 Js ,因为拿到的文件路径是 Content:// 开头 JS 是无法解析的 。(这个代码跨度有点大 , 就不贴源码了 ,有兴趣可以克隆仓库看下)

 

3

WebView 封装后使用

 

App 下载

https://github.com/Justson/AgentWeb/blob/master/agentweb.apk

 

AgentWeb 在 Fragment 中使用

 

 

跟原先 WebFragment 比简洁多了 。

 

Js 调用 :

 

function callByAndroid(msg1,msg2){
  console.log("callByAndroid")
}

 

没有经过封装的

 

mWebView.loadUrl("javascript:callByAndroid("+"\"hello\""+","+"\" js\""+")");

 

封装后

 

mAgentWeb.getJsEntraceAccess().quickCallJs("callByAndroid","Hello","js");

 

Github:

https://github.com/Justson/AgentWeb

uni-app APP端集成Echarts:基于renderjs的性能优化与实战避坑指南 数据可视化是前端开发的核心能力之一,尤其在移动端应用中,清晰、流畅的图表能极大提升用户体验。其原理在于通过Canvas或SVG等技术,将抽象数据转化为直观的图形。Echarts作为业界领先的可视化库,因其丰富的图表类型和灵活的配置,成为实现这一目标的热门选择。然而,在uni-app这类跨平台框架的APP端,传统的WebView直接渲染方案常因**性能瓶颈**和**手势冲突**导致体验不佳,技术价值难以发挥。这促使开发者需寻求更优的集成方案,以应对复杂的应用场景。本文聚焦于利用uni-app的**render 阅读详情

相关推荐

Android Studio WebView实战:将H5站点快速封装为原生APP

本文详细介绍了如何使用Android Studio的WebView组件将现有的H5网站快速封装为原生APP。通过实战步骤讲解环境配置、布局设计、性能优化及常见问题处理,帮助开发者低成本实现HTML5内容到移动端的迁移,提升开发效率。

oauth7security的博客 776

一篇文章搞定《WebView的优化及封装》

上篇对WebView大家肯定都有了一个基本的认知,和入门。本篇继续对他进行一些工程上的优化。主要原因:WebView加载过慢,影响用户体验,毕竟原生是秒开的。上面说的都是每一步的优化,这些优化是可以进行结合的。提前预加载一个WebView模版,利用本地的H5资源。之后加入到WebView的缓冲池中。比如去定义一个TemplateWebView去专门处理一些常用的比较固定的WebView页面。之后在WebViewPool中去专门添加这种比较固定的WebView页面去缓存。

小孟来码的博客 5360

webview 加载h5页面,播放视频+全屏,实现简单封装

前段时间项目中用到了h5。从目前的市场来看,原生和h5的结合受到很多公司的欢迎,刚好最近微信也推出了它自己的“小程序”,这在Android程序员之间也掀起了波澜,引起大家讨论。 个人觉得Google提供的webview有很多的坑,我这次就踩了不少,比如在某些版本的系统上某个方法不会执行,或者执行的顺序不一样,有的方法会多执行一次,说白了就是兼容性做的很差,究其主要原因,是Android4

行走江湖的文艺猿 的专栏 1万+

WebView容器的封装和理解

核心 基础 简介 Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。 WebView的状态 //激活WebView为活跃状态,能正常执行网页的响应 webView.onResume() ; //当页面被失去焦点被切换到后台不可见状态,需要执行onPause //通过onPause动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行。webView.onPause();//当应用程序(存在webview)

重学Android,保持学习 1552

Android基于JsBridge封装的高效带加载进度的WebView

Tamic http://blog.youkuaiyun.com/sk719887916/article/details/52402470 概述从去年4月项目就一直用起了JsBridge,前面也针对jsBridge使用姿势介绍过一篇入门篇,《Android JsBridge实战 打造专属你的Hybrid APP》,本篇接着继续深入,通过再次优化封装,大大优化了部分代码,简化上层调用流程,快速部署你的Hyb

Tamic (大白) 1万+

WebView封装网页为APP:从原理到实战的完整指南

WebView作为移动应用开发中的核心技术,本质上是一个内置的浏览器组件,能够在原生应用中加载和显示网页内容。其工作原理是通过将网页资源嵌入到原生容器中,实现混合开发模式。这种技术方案的价值在于能够快速将现有网页内容转化为移动应用,大幅降低开发成本和时间。在实际应用场景中,WebView特别适合内容展示类、工具类网页的移动端封装,如导航软件、信息查询等常见应用。通过合理的配置优化和性能调优,WebView方案可以稳定运行并满足基本功能需求。本文基于实测经验,重点解析WebView封装方案的环境准备、打包流程

weixin_33834910的博客 560

Android 实现webview的封装示例

xml文件,相对布局,包含一个WebView和一个关闭按钮 RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/webViewLayout" android:layout_width="match_parent" android:layout

不很正派的专栏 6543

腾讯X5内核 WebView封装实战指南

腾讯X5内核是腾讯公司为了解决Android系统中WebView的性能问题,以及提升移动设备上的网页浏览体验而自主研发的内核。它起源于微信团队为微信内置的浏览器功能开发的XWeb内核,并在随后的发展中演化成了面向所有开发者的通用解决方案。腾讯X5内核的发展历程体现了其不断适应移动互联网发展的需求,从最初的版本开始,就强调对新技术的支持和对性能的极致追求。腾讯X5内核的推出,针对Android系统的兼容性和性能优化,尤其在视频播放、文件下载等场景下,提供了较为明显的优势。

weixin_35815766的博客 1348

封装解决WebView的那些坑

WebView 是 Android 最复杂以及最强大的一个控件(最多坑) , 一大堆的 setting 让人摸不着头脑 , 很多时候压根不知道这个设置有什么用 ,加上 WebViewClient 和 WebChromeClient 做为内部类 , 一堆业务逻辑 , 使得 Activity 变得乱糟糟的 ,代码可读性更是糟糕透了 , 最后被逼上梁山 , 走上了封装的道路 。 WebView 封

盆子与火山的博客 3074

封装高性能Android WebView组件

WebView是 Android 平台提供的一款强大的视图组件,用于在应用程序内嵌入一个网页浏览器。它允许开发者直接将网页内容展示给用户,而无需打开外部浏览器,从而提供了更流畅的用户体验和更好的应用集成度。为了与微信风格统一,我们可以使用Android的绘图API来自定义进度条的样式和动画效果。这里可以使用类,然后通过方法设置一个自定义的Drawable对象:-- 自定义进度条背景 --></shape></item>-- 进度条 --></item>在上面的代码中,

weixin_35972981的博客 1448

Android代码-Android-X5WebView基本封装

Android-X5WebView基本封装和使用 通过OkHttp拦截器、自定义CookieJar有效完成客户端与H5端的Cookie同步管理 监听WebView的加载进度 滚动条的设置(隐藏或者显示,内侧显示还是外侧显示) 优化X5WebView的预加载问题(使用IntentService规避风险)   项目文字说明  著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请添加转载出处,添加原文url地址),文章请勿滥用、开源项目仅供学习交流、也希望大家尊重笔者的劳动成果,谢谢。

Android WebView封装框架AgentWeb:一站式解决混合开发痛点

在Android混合开发中,WebView作为承载H5页面的核心组件,其原生API的分散性和复杂性常令开发者面临生命周期管理、文件上传、JavaScript交互、内存泄漏等诸多挑战。这些底层细节若处理不当,极易导致应用崩溃或体验下降。通过封装框架对WebView进行增强,能够统一处理进度条集成、权限申请、下载管理等重复性工作,显著提升开发效率和稳定性。AgentWeb正是这样一个面向Android的轻量级WebView封装框架,它采用“约定优于配置”的设计理念,提供了高度模块化的解决方案。该框架不仅支持优雅

weixin_30599769的博客 419

【AI生成】 LoRa无中心自组网实现方案

LoRa技术是一种低功耗广域网通信技术,它采用了扩频频率调制技术,能够实现远距离的传输。LoRa在物联网中具有重要的应用价值,可以支持大规模的设备连接并且具有较低的成本。同时,LoRa具有高度的抗干扰能力和适应性,能够在复杂的环境中实现稳定的通信。通过使用无中心自组网实现方案,可以进一步提高LoRa网络的灵活性和可靠性,实现设备之间的智能互联。LoRa无中心自组网实现方案将为物联网应用提供更加便捷和高效的通信解决方案。LoRa无中心自组网实现方案一、无中心自组网概念及优势。

qq_31310977的博客 2090

WebView的简单封装

大伙都知道Android系统中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装为一个叫做 WebView 组件。 目前越来越多的应用有使用到WebView了,在使用到webview时,会使用到各种setting。下面来做一个简单的封装,不喜勿喷~~ 废话不多说,直接上代码: package com.aroids.widget; import android.annotati...

github_37271067的博客 2001

WEBGL Shader零基础教程(四):片元着色器核心逻辑

本文系统介绍了WebGL渲染管线中片元着色器的核心概念与应用。主要内容包括:1)片元着色器在渲染管线中的定位与作用,作为逐像素处理单元接收插值数据并计算最终颜色;2)输入数据类型与使用规则,重点讲解varying变量和uniform变量的应用场景;3)颜色计算的核心逻辑,涵盖基础色、渐变、纹理采样和颜色混合;4)进阶特效实现与性能优化技巧,包括交互效果、内置函数组合和GPU计算优化;5)通过综合案例演示了纹理、波纹与交互效果的整合实现。文章提供了完整的代码示例和调试建议,为后续学习光照模型、后期处理等高级渲

分享知识,拥抱变化 1374

新能源知识库(37)三代储能电芯介绍

2025年储能电芯三代技术演进概述 截至2025年6月,储能电芯已明确划分为三代: 第一代(280Ah):2019-2023年主流,能量密度180Wh/kg,循环寿命8000次,成本降至0.6元/Wh; 第二代(314Ah):2023年起主导,容量超1kWh,能量密度提升20%,循环寿命达15000次,系统成本降低15%; 第三代(500Ah+):2024年量产,能量密度突破440Wh/L(如宁德时代587Ah、阳光电源684Ah),20尺集装箱容量达6-9MWh,零部件成本降30%。 技术路线分化:卷绕派

竹君子之家 7910

Android 中嵌套Webview所遇到的坑该如何解决呢?

      我们在Android 开发当中 经常会使用到Webview,有时候也会与其交互做一些处理,但这个时候往往会出现好多莫名其妙的问题。 例如 1 ,在Android中调用webview 想要执行webview中的js方法必须得加以下代码才会生效 WebSettings webSettings = webview.getSettings(); webSettings.se...

qq_37014804的博客 1392

实战分享:如何用Dify和MaxKb实现文档智能切分与高效检索(附代码解析)

本文详细介绍了如何结合Dify和MaxKB构建文档智能切分与高效检索系统。针对传统全文检索的不足,提出了结构感知的文档切分方案,通过解析文档层级关系并构建标题链,实现了精准的章节级检索。文章包含完整的代码实现,涵盖文档解析、智能切分、向量化策略及双索引优化,并分享了性能调优和生产环境实践经验。

qsc90123456的博客 546

Flutter 中 WebView 组件的封装与实现:从基础到实战

WebView 本质上是一个可以在应用内显示网页的视图容器。在 Flutter 中,它允许开发者将 HTML、CSS 和 JavaScript 等网页技术融入到原生应用中,实现混合开发的效果。这不仅拓宽了应用的功能边界,还能复用已有的网页资源,提升开发效率。例如,一些新闻类应用使用 WebView 展示新闻的富文本内容,电商应用利用它展示商品详情页。通过对 Flutter 中 WebView 组件的封装与实现的学习,我们了解到如何在 Flutter 应用中轻松地展示网页内容。

m0_57836225的博客 1373

Keras神经网络可视化模块keras.utils.visualize_util的安装配置方法

本文介绍了如何安装和配置keras.utils.visualize_util模块,并提供了一个简单的示例演示如何使用该模块来可视化神经网络的结构。在上述代码中,我们首先定义了一个简单的神经网络模型,该模型具有一个输入层、一个隐藏层和一个输出层,其中隐藏层具有512个神经元,输出层具有10个神经元。运行上述代码后,我们将在当前工作目录下找到一个名为model.png的文件,它显示了神经网络的结构图。这种方式有效地展示了整个过程,让我们能够更好地理解神经网络的结构,方便对其进行改进和调试。

. 892

8-bit量化在YOLOv11中的部署实践-(使用PTQ、QAT量化技术实现模型体积压缩和推理加速)

本文系统介绍了YOLOv11模型量化技术,主要包括三个核心部分:首先阐述模型量化的基础理论,包括量化分类、数学原理和性能影响;其次分析YOLOv11架构特点及其量化敏感层;最后详细讲解训练后量化(PTQ)的具体实现流程。研究表明,8-bit量化可使YOLOv11模型大小缩减至1/4,推理速度提升1.7-2.3倍,精度损失控制在1%以内。文章特别强调了校准算法选择(如最小最大值法和KL散度法)对量化效果的关键影响,并提供了完整的代码实现示例,为YOLOv11的高效部署提供实用指导。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1627

安卓使用腾讯webview踩坑

参考: 图片拍照封装 https://blog.youkuaiyun.com/villa_mou/article/details/78728417 弹窗 http://blog.youkuaiyun.com/baidu_25797177/article/details/51952880 项目需求原生功能,于是把之前的h5封装到安卓的webview中,本来以为稍微封装一下就行,,,唉,都是泪 原生webview,上,完犊子,页面整个垮掉,换方案 1.xwalk 提供一个包地址,剩下的自行百度吧,一开始搜的时候感觉是相对最好的解决方案

qq_43585229的博客 2211

学Simulink——四开关 Buck‑Boost(FSBB)变换器的无缝模式切换仿真

本文详细介绍了使用Simulink实现四开关Buck-Boost(FSBB)变换器无缝模式切换的仿真方法。FSBB变换器因其输入输出同极性、单电感和双向能量流特性,广泛应用于光伏储能、USB-PD和车载电源等场景。文章重点解决了模式切换中的直通风险和占空比跳变问题,通过统一电压PI控制、Stateflow模式仲裁和200ns死区设计,实现了Buck(26V→24V)、Pass-Through(24V±1V)和Boost(22V)三种工作模式的无缝过渡。仿真结果显示输出电压稳定在12V±0.15V,切换过程无

amy_mhd的博客 66

uniAPP的webview封装使用

uniAPP通过webview跳转到其他网址 uniApp的webview封装 一般分为微信小程序的和App的,微信小程序、H5使用.vue文件,运行时到App上会自动采用.nvue, 不采用.nvue文件时,在App中html页面的标题会自动填充到系统标题栏 微信小程序 <template> <view> <view><web-view :src="path"></web-view></view> </view&g

JavaNumans的博客 1994

SAP_ABAP_MM_BAPI清单案例教程——采购发票校验/预制_BAPI_INCOMINGINVOICE_PARK_MIRO

SAP ABAP BAPI_INCOMINGINVOICE_PARK BAPI 采购发票预制 采购发票校验 代码模版

java_zhong1990的专栏 1963

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Webview的封装

近来由于项目中大量使用webview来加载web页面,所以对webview进行封装,以便减少冗余代码,提高开发效率.一.webview的基类BaseWebActivity书写一个webView 的基类 主要负责处理webview的公共方法,这里贴出主要代码,至于 /** * @return 写一个类继承BaseWebBridge 然后返回过来 */ public abstract

舞动的精灵324的博客 800

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: android studio 断开与SVN的连接
下一篇: Android观察者模式的理解
Li_Pine
博客等级 码龄12年 17粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值