精通安卓性能优化-第七章(二)

修改注册表导致开机时电脑显示“无法登陆到你的账户”的问题解决方案 1.问题描述:开机电脑显示“无法登陆到你的账户:通常可以通过从你的账户注销,然后重新登陆来解决问题,如果不立即注销,你创建的任何文件或进行的任何更改都将会丢失。” 2.问题原因:想要修改cmd中的用户名(红色部分),修改了注册表,重启时出现问题。 3.问题解决: win+R输入cmd,确定进入注册表界面,将下面的地址复制进地址栏(你也可以自己按目录查找),双击ProfileImage... 阅读详情

关闭Broadcast Receiver

为了保存电量,应用应该避免执行无目的的代码。在上面的实例中,当用户界面不在最前的时候去更新Textview的text是没有价值的,仅仅无必要的从电池提取能量。
除了ACTION_BATTERY_CHANGED的sticky intent包含电池信息,Android定义了其他的四个intent,你的应用可以使用:
(1) ACTION_BATTERY_LOW
(2) ACTION_BATTERY_OKAY
(3) ACTION_POWER_CONNECTED
(4) ACTION_POWER_DISCONNECTED
尽管简单的在应用manifest中声明一个receiver,不能收到ACTION_BATTERY_CHANGED的broadcast intent(这个receiver需要显式的在代码中调用registerReceiver()),其他的intent允许在应用的manifest里面注册,如Listing 7-2。

Listing 7-2 在Manifest中声明receiver

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.apress.proandroid.ch07" android:versionCode="1"
        android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".BatteryInfoActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".BatteryReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_LOW" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_OKAY" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

Listing 7-3给出了broadcast receiver的一个简单实现。我们定义了一个BatteryReceiver处理所有的四个action。

Listing 7-3 BatteryReceiver实现

public class BatteryReceiver extends BroadcastReceiver {
    private static final String TAG = "BatteryReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        String text;

        // 在这里处理4个action
        if (Intent.ACTION_BATTERY_LOW.equals(action)) {
            text = "Low power";
        } else if (Intent.ACTION_BATTERY_OKAY.equals(action)) {
            text = "Power okay (not low anymore)";
        } else if (Intent.ACTION_POWER_CONNECTED.equals(action)) {
            text = "Power now connected";
        } else if (Intent.ACTION_POWER_DISCONNECTED.equals(action)) {
            text = "Power now disconnected";
        } else {
            return;
        }

        Log.i(TAG, text);
        Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
    }
}

就像现在,应用可以被认为有一个严重的缺陷。事实上,其中任何一个action发生应用将启动(如果还没有start ready)当。尽管这可能是设计行为,在许多情况下可能需要的行为不同。比如在这个情况下,我们可以说只有当应用在最前的时候显示toast有意义,总是显示的话可能会干扰其他应用,使得用户体验变差。
当应用没有在运行,或者在后台运行,我们希望关闭这些Toast。两种方式去实现:
(1) 可以在应用中添加一个标志位,在activity的onResume里面设置为True,在onPause()设置为false,修改receicer的onReceive()方法去检测这个标志
(2) 我们可以仅当应用是foreground应用的时候开启broadcast receiver
尽管第一种方式工作的很好,不会阻止应用从四种Action触发的时候启动。这最终导致没有必要的指令被执行,依然会从电池提取电量。另外,你需要在多个文件里面修改这个标志,因为你的应用会定义多个activity。
第二种方法更好一些,我们可以保证指令仅当我们有一个明确的目的时候去执行,因此电量仅为了合理的理由消耗。为了达到这个目的,我们需要在应用中做两件事:
(1) 默认关闭receiver
(2) 在onResume()开启receiver并且在onPause()关闭

关闭和开启Broadcast Receiver

Listing 7-4显示了如何在应用的manifest文件中关闭broadcast receiver。
Listing 7-4 在Manifest中关闭Broadcast Receiver

...
<receiver android:name=".BatteryReceiver" android:enable="false" >
...

NOTE:<application>标签有自己的enabled属性。broadcast receiver仅在application和receiver的enabled属性都为true的时候才会开启,其他的情况下关闭。

Listing 7-5给出了如何在onResume()开启和在onPause()关闭broadcast receiver。

Listing 7-5 开启和关闭Broadcast Receiver

public class BatteryInfoActivity extends Activity {
    
    ...
    
    private void enableBatteryReceiver(boolean enabled) {
        PackageManager pm = getPackageManager();
        ComponentName receiverName = new ComponentName(this, BatteryReceiver.class);
        int newState;

        if (enabled) {
            newState = PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
        } else {
            newState = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
        }

        pm.setComponentEnabledSetting(receiverName, newState, PackageManager.DONT_KILL_APP);
    }

    ...

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mBatteryChangedReceiver);

        enableBatteryReceiver(false);  // 关闭battery receiver

        // 当应用没在前台为了保存电能注销receiver
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mBatteryChangedReceiver == null) {
            createBatteryReceiver();
        }

        registerReceiver(mBatteryChangedReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

        enableBatteryReceiver(true);  // 开启battery receiver
    }

    ...

}

仅在确实需要的时候开启broadcast receiver在电能消耗上有很大的不同。尽管这是开发的时候很容易忽视的一个方面,需要特别注意receiver,他们仅在需要的时候被开启。

网络

许多应用在设备和服务器之间传递数据,或者设备之间传递数据。就像电池状态,应用需要从设备的网络连接获取信息。ConnectivityManager类提供可供应用访问网络信息的API。Android通常有多种数据连接可用:
(1) Bluetooth
(2) Ethernet
(3) Wi-Fi
(4) WiMAX
(5) Mobile(EDGE, UMTS, LTE)
Listing 7-6给出了如何获取活动的链接以及所有的链接的信息。
Listing 7-6 网络信息

private void showNetworkInfoToast() {
    ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

    // 仅仅显示active链接
    NetworkInfo info = cm.getActiveNetworkInfo();
    if (info != null) {
        Toast.makeText(this, "Active: " + info.toString(), Toast.LENGTH_LONG().show();
    }

    // 显示所有链接
    NetworkInfo[] array = cm.getAllNetworkInfo();
    if (array != null) {
        String s = "All: ";
        for (NetworkInfo i : array) {
            s += i.toString() + "\n";
        }
        Toast.makeText(this, s, Toast.LENGTH_LONG).show();
    }
} 

NOTE: 应用需要ACCESS_NETWORK_STATE权限去获取网络信息。

因为聚焦于最大化电池使用时间,我们需要注意到如下事情:
(1) 后台数据设置
(2) 数据传输率

后台数据

用户可以设置指定是否允许后台数据传输,预期可以节省电池电量。如果你的应用不在前台的时候需要数据传输,需要检测标志位,如Listing 7-7所示。 Service通常需要在初始化任何传输前检查这个设置。

Listing 7-7 检测后台数据设置

private void transferData(byte[] array) {
    ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    boolean backgroundDataSetting = cm.getBackgroundDataSetting();
    
    if(backgroundDataSetting) {
        // transfer data
    } else {
        // 兑现设置不传输数据
    }
}

因为这是一个自愿的检测,你的应用实际上可能忽略这个设置,在任何情况下传输数据。然而,因为这可能和用户的意愿抵触,潜在的降低前台数据传输的速度,并且影响电池使用时间,这样的行为可能导致用户卸载掉你的应用。
为了当后台的数据设置改变的时候接到通知,可以在Java代码中注册一个receiver,使用ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED去构建intent filer或者在应用的manifest文件使用andoird.net.conn.BACKGOUND_DATA_SETTING_CHANGED。因为这个设置控制后台数据传输,实际上比在onResume()开启receiver和在onPause()关闭receiver更有意义。

NOTE:getBackgoundDataSetting()方法在4.0弃用了,会always返回true。另外,当后台数据传输不可用network可能会被断开。

数据传输

传输率变化范围很广,GPRS数据传输通常少于100K每秒,而LTE或者Wifi连接通常达到几M。除了连接类型,NetworkInfo类还指定了连接的子类型。当连接是TYPE_MOBILE的时候这很重要。Android定义了如下的连接子类型(在TelephonyManager类):


子类型随着新技术创建和开发而添加。比如,LTE子类型在API 11添加,HSPAP子类型在API 13添加。如果你的代码依赖于这些值,保证你处理了这种情况,即应用存在他不知道的数值;否则可能导致应用不能传输数据。当有新的子类型添加,需要更新你的代码,所以请关注每一个版本的Android SDK。改变列表在http://d.android.com/sdk/api_diff/13/changes.html给出,比如。
直观上你的应用应该选择更快的连接。即使3G射频芯片消耗比Wifi射频芯片消耗更少的电量,Wifi传输率可能最终意味着WIFI传输能够减少电量消耗,因为传输可以在很短的时间内完成。

NOTE:因为数据计划现在通常允许有限数量的数据传输(比如,¥30/2GB每月),Wifi连接经常被作为第一选择。同样的,你的应用可以使用NetworkInfo.isRoaming()去了解设备当前是否在漫游,因为这可以添加额外的消费,当isRoaming()返回true的时候,需要避免传输数据。

Table 7-2给出了T-Mobile G1手机不同的组件内存消耗(也叫HTC Dream, or Era G1)。尽管这个手机现在有些老(在2008晚期发布),数值同样给出了每个组件提取多少电量一个很好的概述。

Table 7-2 Android G1手机电能消耗(源自: Google I/O 2009)


尽管精确的数值会随不同设备变化,了解你的应用使用多少电能很重要。因为G1有一个1150mAh的电池,下载和播放视频的应用(比如,YouTube)在使用3G连接的情况下,大约在3个小时清空电池:3G需要150mA,CPU需要90mA,LCD需要90mA,总共330mA,或者3个半小时的使用(假设没有其他应用运行)。
如果你可以控制什么样的数据传输,可以考虑在传输前压缩数据。尽管CPU需要在数据使用前需要解压缩(因此需要更多的电量),数据传输将更快,射频芯片(比如,3G,Wifi)可以更快的关闭,以保存电池的寿命。考虑的事情包括:
(1) 使用GZIP压缩文本数据,使用GZIPInputStream去访问数据
(2) 如果可能使用JPEG而不是PNG
(3) 使用匹配设备分辨率的资源(比如,如果需要resize到96*54,没有必要去下载1920*1080的图片)
传输速度越慢(比如,EDGE),压缩的重要性越大,因为你希望去减少射频芯片开启的时间。
因为Android运行在越来越多的设备上,从手机到平板,从机顶盒到网络笔记本,为所有这些设备产生资源很乏味。然而,使用合适的资源可以大幅增加电池的寿命,因此使你的应用更加合意。除了保存电能,更快的下载和上传将使你的应用响应更好。

自然语言处理NLP星空智能对话机器人系列:Gavin大咖 Transformer 101问答集 第一问 自然语言处理NLP星空智能对话机器人系列:Transformer 101问答 [让天下没有难学的Transformer] 你问我答系列之一 Gavin大咖第一问: Transformer中的可训练Queries、Keys和Values矩阵从哪儿来? 以上是智华解答,供同学们参考。 星空智能对话机器人系列博客 NLP星空智能对话机器人系列:第二次星空智能对话机器人Zoom线上演示安排 NLP星空智能对话机器人系列:StarSpace: Embed All The Things NLP星空智能对 阅读详情

相关推荐

Vivado实战:AXI转PCIe IP核配置全流程(含性能优化技巧)

本文详细介绍了在Vivado环境中配置AXI转PCIe IP核的全流程,包括工程准备、IP核参数设置、BAR空间配置、中断系统优化以及TLP传输效率提升等关键步骤。特别分享了经过验证的性能优化技巧,帮助开发者显著提升PCIe链路的吞吐量和稳定性,适用于视频采集、高速数据记录等应用场景。

weixin_30892037的博客 551

Android动态获取手机是否是充电状态

Android动态获取手机是否是充电状态

ShiXinXin_Harbour的博客 5916

MT4-EA自动化交易研究笔记(2022-04-22)

自从接触到mt4的EA自动化交易,更让我这个10多年的老程序员看到了曙光,目前来看也确实出了一点成果,只是是否能稳定盈利有待时间的考验,所以开此专栏,一来做做记录与分析,更好的优化我的EA,二来也希望能与更多的高手交流,以完善我的交易系统

t35254056的博客 2290

接收充电状态和电量的系统广播

public class BroadcastR_PowerListener extends BroadcastReceiver { private static final String ACTION_POWER_CONNECTED = "android.intent.action.ACTION_POWER_CONNECTED"; private static final Str

WavingBear 2818

热测试芯片(TTC)在ASIC热设计中的关键作用与应用

热测试芯片(TTC)是半导体热管理领域的重要工具,通过物理仿真技术精确测量芯片温度分布。其核心原理是利用金属膜电阻和二极管传感器阵列,实现微米级空间分辨率和毫秒级动态响应。在工程实践中,TTC能有效预防热岛效应、优化散热设计,特别适用于AI加速芯片、3D堆叠封装等先进半导体器件。相比传统热仿真软件,TTC提供更真实的温度数据,帮助工程师在流片前发现潜在热问题。随着1mm微型单元技术的突破,TTC已能检测0.3mm²微小区域的热变化,满足GaN/SiC等宽禁带半导体器件的测试需求。

weixin_33688840的博客 507

Zabbix7.4监控系统在Rocky Linux10.0上的完整部署流程(含MariaDB配置)

本文详细介绍了在Rocky Linux 10.0操作系统上部署企业级监控系统Zabbix 7.4的完整流程,并重点阐述了与MariaDB数据库的深度集成与性能优化配置。内容涵盖从系统环境准备、数据库安装与安全加固、Zabbix核心组件部署,到服务配置、Web界面初始化以及生产环境高级调优的全方位实战指南,旨在帮助用户构建稳定高效的监控平台。

weixin_29200741的博客 328

android常用广播

//关闭或打开飞行模式时的广播 Intent.ACTION_AIRPLANE_M; //充电状态,或者电池的电量发生变化;//电池的充电状态、电荷级别改变,不能通过组建声; Intent.ACTION_BATTERY_CH; //表示电池电量低 Intent.ACTION_BATTERY_LO; //表示电池电量充足 Intent.ACTION_BATTERY

qq_18944923的博客 996

论文解读——YOLOv11(目标检测)

YOLOv11提供了多种型号和功能,以满足不同应用场景的需求。对象检测对象检测是YOLOv11的基本功能之一。在训练时,YOLOv11能够检测图像中的对象,并输出对象的边界框和类别信息。这一功能在自动驾驶、智能安防等领域具有广泛应用。图像分割图像分割是YOLOv11的另一个重要功能。与对象检测不同,图像分割不仅检测对象的边界框,还能够对图像中的对象进行像素级别的分割。这使得YOLOv11在医疗影像分析、工业制造等领域具有更高的应用价值。姿态检测姿态检测是YOLOv11的一个独特功能。

qq_38220914的博客 4457

ACTION_POWER_DISCONNECTED广播使用解析

在做项目的时候,要求拔出USB接口要删除指定文件,达到某功能;就想到利用ACTION_POWER_DISCONNECTED广播。 1、 配置文件 AndroidManifest.xml

结合项目案例,记录点点滴滴,自己回顾,分享他人o__o 1万+

泛微OAe9-自定义资源看板

OA中,有一个很好用的功能:会议室预约。对于一间设立的会议室,同一时间段内,肯定会有不同的人预约同一间会议室,并且,在资源看板里,能看清各个时间段会议室的占用情况,可是会议室资源是有限的,显然不可能让多个人在同一时间段内预约同一间会议室,如会议室已占用,其他人再次申请时,应当拒绝预约。

小松鼠的博客 1848

把 SAP 输出稳稳落到 PDF:从 SPAD 前端打印到 ABAP 程序级转换的一套方法

摘要:本文介绍了三种在SAP系统中将报表输出转为PDF文件的方法。路线A通过SPAD配置前端输出设备,结合Windows打印机设置实现用户交互式PDF保存;路线B在SP01事务码中将已有Spool请求另存为PDF,适用于补救导出;路线C通过ABAP程序自动转换Spool为PDF,适合批量处理。文章详细说明了配置步骤,并针对常见问题(如乱码、文件格式错误等)提供了排查思路。三种方案分别适用于不同场景,用户可根据实际需求选择最合适的PDF导出方式。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 217

Android电量和插拔电源状态广播监听

Android电量和插拔电源状态广播监听Android电量广播状态有3种,电量低,电量充满,电量发生改变。 Action是:Intent.ACTION_BATTERY_CHANGE Intent.ACTION_BATTERY_LOW Intent.ACTION_BATTERY_OKAYAndroid的插拔电源广播的Action是:Intent.ACTION_POWER_CONNECTED Inte

Widsom的博客 1万+

PCL 建筑物点云立面和平面分割提取【2025最新版】

在建筑物点云中,立面点和平面点的法向量存在明显的差异,根据法向量在Z方向的分量设置相应得阈值即可实现立面点与平面点的分割。

点云侠的博客 1960

精通安卓性能优化(Pro Android Apps Performance Optimization)-前言

最近在做安卓性能优化相关的事情,想起曾看到的《Pro Android Apps Performance Optimization》,那个时候刚刚开始接触安卓,还在学习安卓四大组件,没有到专注的考虑性能问题的地步。当时欣慰的发现和作者(Herve Guihot)为同一家公司工作,不过这位大牛在美国分部,没有当面请教的机会。 市面早已经有这本书的翻译版,也有人在论坛发布自己的译文,不过更喜欢读原版,...

路漫漫 其修远 2692

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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

精通安卓性能优化-第七章(一)

第七章 最大化电池使用时间

路漫漫 其修远 788

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

精通安卓性能优化-第七章(三)

定位 任何房地产经纪人将告诉你3个最重要的事情是:locaiton, location, location。Android理解这件事,并且允许应用知道设备在哪里。(不会告诉你设备正在一个好学区,尽管我很确定有个这样的应用)Listing 7-8给出了如何使用系统的定位服务请求location更新。

路漫漫 其修远 1094

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android性能优化问题方案的总结~

虽然总说“英雄不问出处”,但大厂卡学历是默认的“潜规则”。不过最近一个老弟,让我挺振奋的!人家完全靠实力上岸。他就属于死磕型的,是我近2年见过的少有的Android性能优化高手。 要说他也挺聪明,贼会选领域。你出去随便问,10个大牛9个都会说精通性能优化对一名Android开发来说性价比最高! 这不仅是大厂永恒的敲门砖,更是工作中最能突显价值的金字招牌。近几年面试进一步向深、向广。 做了哪些性能优化呢(启动速度、电量、页面、内存…); 如何减少APP启动时间; 内存优化,对于内存泄露就必须得了解; 还比如

248

精通安卓性能优化-第七章(四)

传感器 传感器是有趣的。每个人都喜欢并且希望去使用它们。使用传感器的方式和使用Location Provider的方式相似:应用针对指定的传感器注册一个sensor listener,会被通知更新。Listing 7-15给出了你如何注册一个设备加速器的listener。 Listing 7-15 注册一个加速器的传感器

路漫漫 其修远 834

精通安卓游戏开发(一)

这本书是学习高级 Android 应用开发的实用指南。本书帮助掌握 Android 的核心概念,并在实际项目中快速应用知识。在整本书中,创建了一个应用,并在每一章中不断进化,以便读者可以轻松地跟随并吸收概念。本书分为十二章。前三章专注于应用的设计,解释了设计的基本概念以及 Android 中使用的编程模式。接下来的几章旨在改进应用,访问服务器端以下载要在应用中显示的信息。一旦应用功能完成,它将使用 Material Design 组件和其他第三方库进行改进。

龙哥盟 475

针对 Android/安卓系统进阶一对一训练营!

大家好,我是code小生,今天的推文是针对Android系统开发的进阶课程,是付费的,而且不是那种几毛几块的课程,感兴趣可以继续看下去!以下,是正文:安卓入门,主要以学习各种控件的使用方式...

weixin_38754349的博客 427

史上最全Android性能优化总结,经典收藏

前言 众所周知,移动开发已经来到了后半场,为了能够在众多开发者中脱颖而出,我们需要对某一个领域有深入地研究与心得,对于Android开发者来说,目前,有几个好的细分领域值得我们去建立自己的技术壁垒,如下所示: 1、性能优化专家:具备深度性能优化与体系化APM建设的能力。 2、架构师:具有丰富的应用架构设计经验与心得,对Android Framework层与热门三方库的实现原理与架构设计了如指掌。 3、音视频/图像处理专家:毫无疑问,掌握NDK,深入音视频与图像处理领域能让我们在未来几年大放异彩。 4、大前端

Android23333的博客 1769

精通安卓应用开发(一)

本书是学习高级 Android 应用开发的实用指南。本书帮助掌握 Android 的核心概念,并在实际项目中快速应用知识。在整本书中,创建了一个应用,并在每一章中进化,以便读者可以轻松地跟随并吸收概念。本书共分为十二章。前三章主要关注应用的设计,解释了设计的基本概念以及在 Android 中使用的编程模式。接下来的章节旨在改进应用,访问服务器端以下载应用中要显示的信息。应用功能完成后,将使用 Material Design 组件和其他第三方库进行改进。在结束之前,为应用添加了额外服务,如位置服务、分析、崩溃

龙哥盟 445

全网最详Android framework从入门到精通【程序员必看】

Android Framework在Android开发中扮演着至关重要的角色。它提供了丰富的功能和工具,使得开发者能够轻松创建高质量、稳定可靠的Android应用程序。因此,对于Android开发者来说,熟练掌握Android Framework是必不可少的。在这里为大家提供一份《Android framework从入门到精通》,祝大家学完后都能升职加薪。有需要的朋友可以扫描下方二维码,免费获取更多相关学习资料。

Gaga246的博客 8889

大厂为什么在招聘安卓架构师时,为啥都需要丰富的性能优化经验?

前言 众所周知,移动开发已经来到了后半场,为了能够在众多开发者中脱颖而出,我们需要对某一个领域有深入地研究与心得,对于Android开发者来说,目前,有几个好的细分领域值得我们去建立自己的技术壁垒,如下所示: 1、性能优化专家:具备深度性能优化与体系化APM建设的能力。 2、架构师:具有丰富的应用架构设计经验与心得,对Android Framework层与热门三方库的实现原理与架构设计了如指掌。 3、音视频/图像处理专家:毫无疑问,掌握NDK,深入音视频与图像处理领域能让我们在未来几年大放异彩。 4、大前端

zhireshini233的博客 177

安卓插件化开发!美团点评APP在移动网络性能优化的实践,Android篇

写在前面 1月初失业,找了近2个多月的工作了,还没找到心仪的工作,感觉心好慌,不知道该怎么办了?找不到工作的时候压力很大,有人说自信会很受打击,还有人说会很绝望,是人生的低谷……尽管很多时候我们自己知道,我不是找不到工作,只是找不到理想中的好工作。但这也不能改变你的空白期正在一天一天变长,不妥协的那份坚定正在一天一天动摇的事实。 朋友推荐给我这份文档,狂刷五遍之后,最近刚刚获得字节跳动等多家公司的offer,今天将这份文档分享给大家,希望正在找工作或准备找工作的朋友都可以获得自己心仪公司的offer。 第一

380

破解Android Framework学习之谜:从困境到精通的进阶之路

在Android开发的广阔天地中,Android Framework无疑是一片既充满机遇又布满挑战的深水区。它不仅是构建应用程序的基础,更是一个优秀开发者能力的试金石。缺乏有效的问题解决方法论实践环境的限制,以及深入理解与应用能力的不足。

yihanss的博客 757
上一篇: 精通安卓性能优化-第七章(一)
下一篇: 精通安卓性能优化-第七章(三)
北冥_有鱼
博客等级 码龄19年 14粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值