这一年半以来,关于 Android,我都写了些什么?(一)

安卓自定义半圆弧形菜单 安卓开发自定义ViewGroup实现半圆弧形菜单 ,可实时修改菜单按钮数量,效果如下使用方法1.布局文件添加一下属性:<com.yhongm.arcmenu.ArcMenu app:main_btn_img="@drawable/main_btn" //中心按钮的背景 android:id="@+id/arcMenu"android:layout_width="match_parent"andr 阅读详情

这一年半以来,关于 Android,我都写了什么文章

16年7月份毕业,转眼从学校到公司已经一年半的时间了。在16年年末写过一篇年终总结,当时立下一个关于写作的目标,打算17年至少每个月产出一篇。看了下我的发文记录,额。。。勉勉强强达到了吧。

今年以来我始终觉得没什么可写的,原因可以算是找到了正确获取知识的办法,关于我想写的东西,网上已经有很成熟很完善的文章了,所以自然不需要重复造轮子。

从分享知识的角度来说,确实如此,但是技术博客作为未来复习的笔记,也十分有意义。就好像以前上数学课,上课确实听懂了,但是不做习题,不做笔记,是不可能完全消化这个知识的,编程也是如此,看书/看文章获取知识,写 demo 巩固,最后在项目中应用,不断填坑,方可真正吸收。

以上说了这么多,其实就是我打算最近复习一下,这一年半我写了哪些知识点,准备复习一下,温故而知新,还是蛮有意义的。

Android 进程创建流程

Android 进程的创建可以分为三个阶段:

  1. 发起进程:比如从桌面点击图标进入,那么发起进程就是 Launcher 进程,如果是 A 应用进入到 B 应用,那么发起进程就是 A 应用所在的进程。发起进程会通过 Binder 发送一个消息到 system_service 进程。system_service 就是 framework 层的系统服务进程。
  2. system_service 进程调用 Process.start 方法,通过 socket 将消息发送的 zygote 进程。
  3. zygote 进程最终 fork 出应用真正的进程,并且通过 invokeStaticMain 方法,通过反射,调用 ActivityThread 的 main 方法,真正的进入了程序的入口。

Android 进程的种类级别

前台进程:
有正在与用户交互的 Activity;调用了 startForeground 的 Service,或者 Service bind 了一个前台交互的 Activity,Service 正在调用生命周期方法,BoradCastReceiver 正在调用 onReceive 方法。
可见进程:
Activity 调用了 onPause 方法,但是并没有调用 onStop,或者一个 Service 绑定了这样的一个 Activity。
服务进程:
当 Activity 调用了 startService 并且不属于以上两种情况下,这个进程就是服务进程。
后台进程:
当前进程的组件已经调用了 onStop,这个时候在内存紧张的时候,有可能会被系统回收,系统回收后台进程的时候,会遵循 LRU 算法,保证最近使用的那个进程,最后被回收。
空进程:
已经没有任何存活组件的进程,通常空进程都是留给下次进入做缓冲的。

Android 进程清理机制

Android 系统是基于 Linux 系统的,Linux 系统清理进程通过 Low Memory Killer 机制完成。Low Memory Killer 会分析此进程的 adj 所占的级别,以及这个进程所占的内存大小两方面来分析。不同种类的进程 adj 值是不同的,adj 值越高,越可能被系统回收,当 adj 值相同时,会先回收所占内存更大的那个。

前台进程:adj = 0;可见进程 adj = 1;服务进程 adj = 5;后台进程 adj = 7;空进程 adj = 9;

所以对于一个 app 进程如何才能“绿色”的保活呢?提升其 adj 的值才是正确的思路,这个我们未来再说。

Android 线程的管理

先来说说进程和线程的区别吧:进程就是一个拥有资源的单位,有独立的内存地址,不同进程之间,内存是不可共享的;线程是最小执行和调度的单元,不同的线程可共享进程中的堆内存;对于 Linux 系统来说,无论进程还是线程,都是一个可执行的 task_struck 结构体。

在 Android 中,尽可能的要用线程池去管理线程,不要直接 new Thread().start,因为使用线程池控制线程可以合理利用空闲线程,并且对线程进行回收,高效的利用资源。

Excutors 中有几个工厂静态方法,来创建几个不同的线程池:

newCachedThreadPool:无 corethread,maxthread 数为 Integer.MAX,空闲线程超过60s时,会被回收。

newFixedThreadPool:Thread 数量固定的线程池,线程空闲也不会被回收,当线程无空闲的时候,任务会被放在 LinkedBlockQueue 中。

newSingleThreadPool:单一线程,不会被超时回收,任务会依次执行。

newScheduleThreadPool:创建一个线程池,可以指定核心线程数和最大线程数,每间隔一定时间去执行任务。

线程的任务处理方法,首先判断核心线程有没有满,如果没有满,即使有空闲的,也会创建一个新线程,如果满了,则优先复用空闲线程,其次才会创建新线程,如果线程达到了最大线程数,则将任务放入任务队列中,如果最后任务队列都满了,那就会抛出异常,或者进行其他处理。

其实这几个线程池都是对 ThreadPoolExecutor 的封装,设置不同的参数罢了。

对于非常消耗 CPU 的任务,尽量不要让核心线程数超过 CPU 核心数 。Runtime.getRuntime().availableProcessors

对于I/O操作频繁的任务,可以尽可能多的创建线程数。

以上就是对 Android 线程池的创建和使用的总结。

Context 的原理用法以及和四大组件的关系

Context 是一个顶层抽象类,掌管着 Android 的资源和组件。
直接子类:ContextWrapper(包装类) ContextImpl(实现类) MockContext(测试用的)

ContextWrapper 的直接子类:Application、Service、ContextThemeWrapper,ContextThemeWrapper 的子类是 Activity(因为 Activity 中有 theme 属性)

ContextWrapper 本身并没有真正实现 Context 的方法,而是持有了一个 mBase 变量,这个 mBase 就是 ContextImpl,通过 mBase 来实现 Context 的方法,这就是装饰模式。

ContextWrapper 和 ContextImpl 是何时建立联系的呢?在 ActivityThread 的 main 方法中,调用了 mThread.attach 方法,将 AMS(Activity Service 等调度者) 与 ApplicationThread(四大组件事件接受者,通过 mH 通知到主线程) 建立联系。

当 BIND_APPLICATION、LAUNCH_ACTIVITY、START_SERVICE 事件到来之时,会 new 一个 ContextImpl 然后调用 setOuterContext,这样就将二者建立了联系。

未来我们再去详细探究 Application、Service、Activity 的启动流程,和被调度的流程吧。

Context 的使用

不同对象的 Context 在使用上是有区别的,比如只有 Activity 的 context 才可以 show a dialog。对于和 View 相关的 context,只可以用 Activity 的,但其他的 Context,比如调数据库、系统服务等等,尽量还是使用 Application 的 Context,毕竟 Application 的 Context 生命周期是伴随着进程本身的,不会造成内存泄漏。

context.getApplicationContext

与 Context 相关联的资源都是同一份,通过 ResourceManager 获取,都指向了同一个文件夹下,只不过不同的 Context 对这个资源处理的方式不同才导致了这个差异。

内存泄漏

刚刚我们提到了 Context 使用不当导致的内存泄漏,内存泄漏在 java 中就是“该松手时不松手”,本来应该被 java gc 掉的对象,但是依然有着引用可达它。所以这个时候造成了内存泄漏。在 Android 中,内存泄漏有 90% 都是因为 Activity 已经 onDestory 了,但是依然有其他对象引用着它,导致它无法被 gc 回收掉。

所以理所当然的,当这个 Activity 中有一些对象引用着它,并且其生命周期超过了 Activity 本身之时,就会造成内存泄漏。

Handler:
Handler 通常都会怎么用呢?

Handler mHandler = new Handler()

如果在 Activity 中这样声明一个内部类的话,是可能造成内存泄漏的,为什么呢?因为在 Java 中非静态的内部类会持有外部类的引用,当 Activity 已经 onDestory 了,但是主线程的 MessageQueue 依然还有没处理的消息,则 Handler 一直抓着 Activity 不让其被 GC 回收。

正确的用法:

private SafeHandler mHandler = new SafeHandler(this);

private static class SafeHandler extands Handler {
    private final WeakReference<SimpleActivity> mRef;
    public SafeHandler(SimpleActivity activity){
        mRef = new WeakReference<>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        SimpleActivity activity = mRef.get();
        if(activity != null){
        }
    }
}

静态变量:
静态变量有什么特性呢?随着类(ClassLoader)的创建而创建,被所有类的对象共用,也就是说可能会有一些线程安全问题。随着类的销毁而被销毁,类什么时候被销毁呢?是在 ClassLoader 销毁这个类的时候,也就是在这个进程被杀死的时候。

所以一个静态变量的生命周期是与所在的 app 进程同步的,比如你在一个 activity 中保有了一个 static 的 Context(this),即使 Activity 调用了 onDestory ,这个 Context 依然是无法回收的。

与之情况相似的还有单例模式,因为单例模式也是占用内存,无法释放,所以如果传入了 Context,尽量使用 Application 的 Context 防止内存泄漏。

匿名内部类:
比如 new Thread(new Runnable()) 的这种情况所造成的内存泄漏,也是匿名内部类会持有外部类的强引用,导致 Activity 无法被回收。

View 和属性动画导致的内存泄漏

因为动画持有 View 的引用,View 持有 Activity 的引用,所以要避免 Activity 被销毁了,但是 View 依然抓着它不让它回收。比如要在 activity onDestory 之前 dissmiss dialog,停止循环的属性动画等等。

LeakCanary 原理分析

既然上面说到了内存泄漏,我们也知道在 Android 上有一个非常好用的开源库检测内存泄漏,那就是 LeakCanary,本着知其所以然的态度,大致看了下 LeakCanary 的源码,分析下原理:

  1. 在一个 Activity 调用 onDestory 之时,是 LeakCanary 开始进行检测的入口,检测的类是 RefWatcher 类 的 watch 方法。首先会给这个 Activity 创建一个唯一的 ReferenceKey,并且使用一个带 ReferenceQueue 参数的构造方法,创建一个 WeakReference,其目的是,当 Activity 被 GC 回收之时,会出现在这个 ReferenceQueue 中。如果反复 GC ,Activity 的对象都不在队列里,说明就可能发生了内存泄漏,进行进一步分析。
  2. 接着调用了 watchExecutor.execute 方法,其目的是向主线程推一个消息执行 ensureGone 方法,为了不影响主线程其他任务的调用,这个消息只有在主线程空闲的时候执行。
  3. ensureGone 方法:
void ensureGone(KeyedWeakReference reference, long watchStartNanoTime) {
    ...

    removeWeaklyReachableReferences();
    if (gone(reference) || debuggerControl.isDebuggerAttached()) {
        return;
    }
    gcTrigger.runGc();      // 手动执行一次gc
    removeWeaklyReachableReferences();
    if (!gone(reference)) {

        long startDumpHeap = System.nanoTime();
        long gcDurationMs = NANOSECONDS.toMillis(startDumpHeap - gcStartNanoTime);

        File heapDumpFile = heapDumper.dumpHeap();
        if (heapDumpFile == null) {
            // Could not dump the heap, abort.
            Log.d(TAG, "Could not dump the heap, abort.");
            return;
        }
        long heapDumpDurationMs = NANOSECONDS.toMillis(System.nanoTime() - startDumpHeap);

        heapdumpListener.analyze(new HeapDump(heapDumpFile, reference.key, reference.name, excludedRefs,
                watchDurationMs, gcDurationMs, heapDumpDurationMs));
    }
  }

removeWeaklyReachableReferences 这个方法的目的就是移除弱引用,如果当前 Activity 的弱引用还在 retainedKeys 中,那么说明就还没被移除,则手动调用一次 GC,重复上述的判断,如果发现 Activity 的引用还在 retainedKeys 中,也就是说,这个 Activity 对象并没有按照期望,被回收到 ReferenceQueue 中,则说明它极有可能发生了内存泄漏。
4. 既然判断出现了内存泄漏,那么下一步就是定位分析了。上面代码中 heapDumpFile 这个就是我们要分析的内存文件,因为这个步骤比较耗时,所以被放进了一个新的进程里,HeapAnalyzerService 这个服务就跑在这个进程里进行内存泄漏分析,HeapAnalyzerService 通过调用 HeapAnalyzer 使用 HAHA 解析这个内存文件。
5. 得益于唯一的 reference key, HeapAnalyzer 找到 KeyedWeakReference,定位内存泄漏。
6. HeapAnalyzer 计算 到 GC roots 的最短强引用路径,并确定是否是泄漏。如果是的话,建立导致泄漏的引用链。
7. 引用链传递到 APP 进程中的 DisplayLeakService, 并以通知的形式展示出来。

上面就是 LeakCanary 的原理分析,LeakCanary 的问题是无法检测出 Service 的内存泄漏的。如果最底层的MainActivity一直未走onDestroy生命周期(它在Activity栈的最底层),无法检测出它的调用栈的内存泄漏。

先复习这么多吧,一篇一篇的来。我发现很多知识点一年以后重新看,理解会比当时更加深刻,更全面,所以时常复习是很重要的。

Android开发 实现Zxing二维码半屏扫描 最近接到一个半屏扫描二位码的需求,要实现界面的上半屏是扫描二维码,下半屏是扫描结果数据的显示。接到这个需求第一时间想到的是,印象中人生中没有实现过半屏扫描二维码的工作经验!!!难受啊,但是为了保持自己的专业性!就硬着头皮答应了下来:“OK,没问题,我改一下就好” 我是不是答应的太快了??我代码都还没看过呢!!作为一个专业的Android工程师,这样评估一个需求工作量是完成不靠谱的!哎,答应都答应... 阅读详情

相关推荐

android 固定进度刻度,Android 效果之带刻度的半圆环进度条小述

一、背景最近准备要做一个类似仪表盘样式的半圆环带刻度可拖动的进度条来展示和设置温度,网上找了找demo,都和实际的需求有点区别,感觉这种功能实现起来不难,就索性自己弄了一个。二、正文在开始之前,我们来看下实际的运行效果,看看能不能满足正在查找资料的小伙伴的项目需求:效果就是这样的啦,没什么特别的地方,我们来看下实现方法吧,如果对于自定义View的流程还有些不清楚,可以查看一下自定义简单View及获...

weixin_36283702的博客 1968

内存泄漏检测库LeakCanary的源码浅析

循序渐进的讲解Android中内存泄漏检测库LeakCanary的实现原理。为了帮助同学们更好地理解LeakCanary的实现原理,在讲解之前还梳理了LeakCanary中的基础知识点及基本使用。

浏览器主页被360篡改?教你彻底解决并预防再次发生

通过本文介绍的快捷方式修复、注册表清理、启动项管理三步法,可解决99%的浏览器主页篡改问题。权限最小化原则:非管理员账户日常使用,关键系统目录设置写保护定期安全审计:每月检查启动项/计划任务/浏览器扩展备份还原机制:创建系统还原点,重要操作前做好快照安全意识培养:不安装来源不明的软件,谨慎处理软件安装向导中的附加选项浏览器安全是系统防护的重要环节,建议结合EDR(终端检测与响应)方案构建立体防护体系。对于普通用户,保持系统更新、使用官方渠道下载软件、定期清理系统垃圾,即可有效预防绝大多数安全威胁。

nntxthml的博客 1万+

android 监控gc是否正在进行,带你学开源项目:LeakCanary-如何检测 Activity 是否泄漏...

OOM 是 Android 开发中常见的问题,而内存泄漏往往是罪魁祸首。为了简单方便的检测内存泄漏,Square 开源了 LeakCanary ,它可以实时监测 Activity 是否发生了泄漏,一旦发现就会自动弹出提示及相关的泄漏信息供分析。本文的目的是试图通过分析 LeakCanary 源码来探讨它的 Activity 泄漏检测机制。LeakCanary 使用方式为了将 LeakCanary...

weixin_31925811的博客 550

如何使用JMeter进行大模型的压力测试?

使用JMeter进行大模型的压力测试,核心是通过模拟高并发请求,测试大模型在极限负载下的性能表现(如响应时间、吞吐量、错误率、资源瓶颈等)。通过以上步骤,可系统性评估大模型在高压下的性能极限,为优化模型(如量化、蒸馏)、扩容硬件(增加GPU)或调整接口限流策略提供数据依据。)、请求方式(POST)、认证方式(API Key放在Header)、请求参数(作用:避免瞬间高压压垮系统,更精准找到瓶颈点。等)、响应格式(同步/流式)。需获取:API地址(如。通过CSV文件引入不同。

alankuo的专栏 789

CANoe实战:LIN Slave一致性测试全流程解析

本文详细解析了使用CANoe进行LIN Slave一致性测试的全流程,包括测试概述、环境搭建、模块集成、测试用例详解及报告分析。通过实际案例分享,帮助工程师掌握LIN 2.0/2.1/2.2、SAE J2602和ISO 17987等标准的自动化测试方法,提升汽车电子从节点的可靠性和兼容性验证效率。

weixin_42665725的博客 532

leakcanary源码学习

本文主要注重内存泄漏的流程进行源码学习 文章目录leakcanary源码学习使用重点对象介绍注册监听垃圾回收调用gc前调用gc后内存泄漏查找流程end leakcanary源码学习 使用 在Android中使用leakcanary只需要一步 LeakCanary.install(this); 重点对象介绍 public static @NonNull RefWatcher install(@Non...

谢耀眼 523

DP链路训练从HPD触发到通道对齐:原理与调试实战

高速数字接口的稳定工作依赖物理层信号的精确协商,链路训练正是DisplayPort接口中确保源端与接收端在速率、摆幅和时序上达成一致的关键机制。HPD作为链路状态变化的触发信号,与通道对齐一同构成了训练流程的首尾环节。理解从时钟恢复到均衡再到多通道对齐的完整过程,有助于快速定位显示异常问题。在工程实践中,借助DPCD寄存器交互和AUX通道日志,可以系统性地排查训练失败原因。围绕链路训练全流程进行剖析,重点探讨HPD触发机制、训练图案选择、寄存器配置以及链路降级策略,为显示方案开发与调试提供工程参考。

weixin_30110543的博客 234

毕业两年总结

文章目录: 现状 想成为什么样的人 做了什么有意义的事,距离目标还有多远 认知上有什么进步 价值 职业观 人际交往 有没有更认识自己是什么样的人 有什么后悔的事 自己需要反复看的话 总结 去年七月写了《毕业一年总结》,一转眼就又是七月。过去这一年经历了不少事,回头看看,大多数选择还是比较满意的。今天趁着有空,对毕业后的第二年做个总结吧。 文章主要内容: 现状 想成为什...

张拭心的博客 shixinzhang 1万+

Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框架构思

最近因为工作原因需要使用Qt开发一个类似于Visio的流程图组件,需满足基本的流程图功能,图元类型可自定义扩展,不同图元存有各类自定义数据,可以保存为xml文件,可以读取xml文件生成流程图等等。

qq_43793182的博客 1万+

SAP中MRP运行计划行超限问题的分析与解决

SAP中基于生产性物料的采购特点,通常会采用采购计划协议的方式进行采购。其具体的采购计划通常来自于成品计划独立需求,然后通过物料清单,经由MRP跑出。 在采购计划协议中的计划行中,存在一个计划行号,随着MRP在不断跑出新的计划行,该行号资源会消耗完。当计划行号消耗完后,MRP不会再跑出新的计划行。且在MD04或MD02中看不到类似提示信息。此时可以通过MD05来查看是否出现类似下图的提示信息。 ...

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 3845

如何用Qt写一个安卓Android应用

至此环境就搭建好了,宝子们就可以掏出你Android系统的手坤用数据线连接电脑了,然后打开你手机的设置,找到关于本机,再然后连点几下版本号让手机处于开发者模式 ,在开发者选项中打开USB调试就OK啦。这里就可以绑定SDJ,NDK,JDK的路径了,JDK的路径会自动绑定你下载的,如果不是也很好找,一般就在C:\program Files(x86)\Java这个目录下。中间会让你选择安装目录,选择安装到你空间比较充足的地方就好了,比较简单就不放图了。

qq_59840326的博客 1万+

【LaTex】3.4 立体几何

本文介绍了使用LaTeX的tikz包绘制立体几何图形的两种方法。首先展示了基础立方体的绘制代码,通过定义8个顶点坐标并连接各边完成绘制。接着讲解了scope功能在3D绘图中的应用,包括标准平面(xy、xz、yz)的绘制方法,以及任意平面的定义技巧。重点说明了如何通过定义平面原点、x和y方向单位向量来创建旋转后的绘图平面,并以45°旋转的yz平面为例演示了圆的绘制。文章提供了完整的代码示例和对应的效果图示,展示了tikz在3D绘图中的灵活性和强大功能。

你的指尖有改变世界的力量 2455

作为Android IOS 前端开发工作一年半感想

作为“程序员”参与开发也有一年半的时间了谈谈自己目前的感想以及对将来的展望 首先还是感谢公司给我这个工作岗位 尽管公司很小 作为一个半路出家的人也确实学到了很多 18年下半年入职 首先接触的是iOS的相关开发工作(因为上一个做iOS的要离职了) 从一开始的学习绘制页面到之后的调接口接收数据并显示大概用了一个多月 自己能独立在公司原有的项目上做一下简单的修改了 后来那个做iOS的同事离职之后我也算正...

x895931708的博客 617

模型实战(32)之 yolo26 实现对全身关键点数据集 的训练与关键点检测

模型实战(32)之 yolo26 实现对全身关键点数据集 的训练与关键点检测

yohnyang的博客 89

深度学习工具包 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")

安卓手机是一年一换好,还是三年一换好?你觉得多久换最好

随着手机更新换代的速度越来越快,平均每个月都有三四台新机发布,面对种类繁多的新机,很多人都会考虑这样一个问题,安卓手机到底是一年一换好还是三年一换好呢?今天小编将和大家一起探讨这个问题。 1.电池续航 一般手机电池使用一年左右,手机续航就会明显下降,从刚开始时的一天一冲到需要一天两充甚至是一天三充,如果是千元机很多人都会考虑再买一部,旗舰机大家都会选择更换电池再战几年。 2.系统优化 手机是“...

whf741的博客 2230

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python开发app-如何用python写一个安卓APP?(上)

嘿嘿!被我骗进来了吧!有这种想法的人不在少数,但谁都明白这是不明智的,然而不明智不代表不可行,不管怎样,有一点永远不会变,那就是有这种想法的靓仔靓女一定和小瓦一样帅气逼人!噢耶~Let's Go~~ ——聪明的瓦肯人1 针对这个问题 我劝大伙儿谨慎尝试 谨慎尝试 为什么咧 我把大家骗进来的目的 就是让大家看看 什么叫做 好惨一男的 不过放心 你依然可以看到 这个问题的 可能有效解决方案 然后 你就...

weixin_37988176的博客 3506

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

配置Android Studio安卓模拟器

以上是创建AVD的两个方法,希望能对你有所帮助。

2301_81385743的博客 2万+

手写笔记软件android,有笔没笔一样写 五款安卓手写笔记APP

智能手机的出现极大方便了我们的生活,现在的白领们开会都很少拿纸笔,直接用手机就能随时记下信息。不但在之后方便检索,也能省下不少纸张。比如iOS平台上的墨笔和UPAD,就是手写笔记类应用中最强的两款,可惜这两款应用都是iOS独占,没有安卓版本。不过这也使得安卓平台上出现了诸多有自己特点的应用,今天我就给大家介绍几款完全不输给墨笔和UPAD的手写笔记应用。好写笔记《好写笔记》是一款专注文字记录的应用,...

weixin_35851240的博客 2万+

python玩转android_如何用python玩跳一跳 ?(安卓版)

微信小程序的游戏相信大家都很爱玩,用手机方便而且玩起来简单。其实,我们也可以用python来玩跳一跳,一起试试吧~以win10系统+安卓手机为例第一步、安装python2.7默认安装到C盘就行安装的时候,需要如上图所示,选择add python.exe to path,安装之后打开命令行工具输入python --version出现版本号,说明python安装成功。如果报错,就需要重新安装或者配置环...

weixin_39724748的博客 106

android写轮眼,打造iOS般流畅的安卓 神器写轮眼使用教程

原标题:打造iOS般流畅的安卓 神器写轮眼使用教程 (网络图片)自安卓诞生之初,它和iOS就好像走在两个极端的劲敌,无论是外在的设计还是内在的理念都有着面显的分歧,就好比《星球大战》里面的银河共和国和银河帝国,两者针锋相对,无时无刻都在竞争。 (网络图片)但安卓系统的开放性带来极大的便利之余也带来了不少问题,同样是同年份的手机,安卓手机用久了往往不及iPhone那么流畅,虽说现在iOS也没有以前那...

weixin_29534399的博客 2073

python能做安卓脚本吗,用python写安卓脚本

在相关文件中,本人也提供了一份优快云中积分下载的WebDriverAgent.rar文件,有需要者可参考相关网络资料进行配置。(Win10系统:右键“此电脑”→“属性”→“高级系统设置”→“环境变量”→双击“Path”,将adb文件夹的路径添加进去即可。②根据起跳的精准性更改机型对应的config.json 文件中的press_coefficient参数,直到获得最佳取值。将相关文件中提供的adb.zip文件解压,将解压后的文件夹添加到环境变量中。手机端打开微信小程序“跳一跳”并点击“开始游戏”。

Fixf4556的博客 1036

android手机寿命,手机平均寿命出炉,安卓只有约一年半,再看看苹果就明白了!...

买手机首先要考虑的一个点,是到底买安卓还是买苹果。关于这个问题的争论一直都没停止过,其中有人表示苹果手机买的时候肉疼,但是由于它的生命周期更长,因此平摊到每一年的成本就更低,何况iPhone用几年以后卖二手,价值也更高。手机平均寿命出炉,安卓只有约一年半,再看看苹果就明白了! (来自:丽丽小吃货)根据研究报告宣称,其实安卓手机的平均寿命,仅仅是1.6年,当然了,使用安卓系统的品牌太多,良莠不齐的因...

weixin_33657316的博客 5883

一年半Android工作经验剑指杭州:我是如何拿下头条、阿里和滴滴 offer 的

IPC常用方式 使用Bundle、使用文件共享、使用Messenger、使用AIDL、使用ContentProvider、使用Socket。BroadcastReceiver的不同类型,普通广播,系统广播、有序广播、粘性广播、应用类广播。内存泄漏:内存泄露的几种场景,如单例模式引出的泄露、静态变量导致的泄露、属性动画导致的内存泄露等。RxJava常用组合、合并操作符 combineLatest、join、merge、zip等。RxJava过滤操作符 filter、ofType、sample、take等。

2501_90433058的博客 883

对文章“如何用Qt写一个安卓Android应用“的补充

此外,SDK 还提供了如 Android Debug Bridge(ADB)这样的调试工具,它允许开发者在真实设备或模拟器上与应用进行交互,检查应用的运行状态、查看日志信息等,有助于快速定位和解决开发过程中出现的问题。通过 JNI,Java 代码可以调用 C/C++ 代码里的函数,反之亦然。总结一下,JDK 提供了基础的运行环境,NDK 让你能编写高性能的 C/C++ 代码,JNI 实现了 Java 和 C/C++ 代码之间的通信,而 SDK 则负责将所有代码打包成可以在手机上安装和运行的应用。

qq_59840326的博客 910
上一篇: 在 Android 上,一个完整的 UDP 通信模块应该是怎样的?
下一篇: Android 一套完整的 Socket 解决方案
MeloDev
博客等级 码龄11年 93粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值