id - Android、iOS

Android 和 IOS 设备唯一ID如何选择 我们在做Android/IOS应用或游戏的时候,或许总会碰到要获取设备唯一id来标识或跟踪玩家。但随着系统安全性的提高,加强用户的隐私安全,获取设备唯一ID变得越来越困难了,下面我们来分析一下,看看哪些还可以满足我们需求,同时,如果您有关于获取设备唯一ID的新发现,欢迎留言讨论。 阅读详情

问题起源

问题来自于使用 appium inspector 时,同一元素安卓端与IOS端locator 的id 表现不同,安卓有id, 但是iOS没有id 只有 Accessiblity id , 基于此,撰写本片文章;

为什么 Android 有 ID,而 iOS 没有?

  • Android Inspector 可以看到 id

  • iOS Inspector 却没有 id

  • 同一个 RN 页面,两端显示的属性完全不同

于是很容易产生一个误解:

「是不是 Appium 对 iOS 支持不好?」

答案是否定的。

真正原因不是 Appium,而是 Android 与 iOS 从诞生开始就采用了完全不同的 UI 设计哲学。Appium 只是读取系统提供的信息,并不会凭空创造属性。

 Android:为什么每个控件几乎都有 ID?

Android 支持给 View 分配 Resource ID,但并不要求每个 View 都必须有 Resource ID。

Android 于 2008 年发布,由 Google 设计。Google 希望 Android 成为一个开放、可扩展、便于开发的平台,因此提出了一个核心思想:

Everything is a Resource(万物皆资源)。

Android 从一开始就是一个 声明式 UI(XML)+ Resource 系统。在 Android 中,字符串、颜色、图片、布局、动画,甚至按钮的编号,都属于 Resource。

例如:

<Button
    android:id="@+id/login_button"/>

Android 并不会把 "login_button" 这个字符串保存到每一个 Button 中。为了提高运行效率,Android 在编译 APK 时,会提前完成资源的管理工作。

整个过程可以分为 4 个阶段:

第一步:扫描所有 Resource(Resource Collect)

Android 编译 APK 时,aapt2(Android Asset Packaging Tool 2)首先会扫描整个 res/ 目录同时会收集所有资源(例如:@string/app_name等)
第二步:建立 Resource Table(资源映射表)

收集所有资源以后,Android 会建立一张资源映射表(Resource Table),其作用就是将资源名称(Resource Name)映射(Mapping)到唯一的 Resource ID;

注: Resource Table(二进制的一个资源表),将资源名称映射(Mapping)到一个唯一的 32 位无符号整数 Resource ID (无符号--> 可以表示更多的资源且本身不会进行计算更符合"标识符(Identifier)"的语义,之所以需要映射是因为CPU更擅长处理整数)

第三步:生成 R 类

注:R 类只是 开发者访问 Resource Table 的一层类型安全封装。

建立 Resource Table 后,Android 自动生成:

public final class R {

    public static final class id {

        public static final int login_button = 0x7f080012;

        public static final int password_edit = 0x7f080013;

    }

}

因此开发者可以写:findViewById(R.id.login_button);  而底层就是使用的映射 0x7f080012 去访问;

第四步:运行时绑定到 View

当 LayoutInflater 加载 XML:

<Button
    android:id="@+id/login_button"/>

内部会执行类似:

Button button = new Button();

button.setId(R.id.login_button);

最终:

Button

id = 0x7f080012

以后button.getId(); 就可以拿到0x7f080012;

这里的 @+id/login_button 并不是普通字符串,而是告诉 Android:

在 Resource Table 中创建一个新的资源编号。

需要注意的是,android:id 是一个可选属性,只有开发者主动声明后,aapt2 才会在编译阶段将其加入 Resource Table,并生成对应的 Resource ID。运行时,拥有 Resource ID 的 View 才会暴露 resource-id 属性

并不是每个 View 都需要被程序访问(Reference)。只有需要被程序引用、操作或区分的 View,才需要 android:id。

程序运行后,每个 View 都知道自己的 Resource ID,因此 UIAutomator 可以直接读取: resource-id = login_button

Appium Inspector 又把它包装成:Find By → id,所以很容易让人误会Android 有一种叫 Appium ID 的东西。实际上没有,只是:Appium 的 id 定位策略,在 Android 平台上,底层最终匹配的是 Android 的 resource-id

为什么 Google 要这样设计?

Google 希望把"资源"从"代码"中解耦出来,并在编译阶段完成资源管理,从而获得更高的性能、更好的可维护性和更强的扩展能力;

整个设计目的可以总结成四点:统一管理所有资源、代码与资源解耦、编译期完成资源管理、提高运行效率

iOS:为什么没有 Resource ID?

Android 和 iOS 从第一天开始的设计思想完全不同:Android 更强调 开发效率与开放性;而 Apple 从诞生开始更强调 用户体验、一致性和系统控制力。

  • Android 设计目标:资源(Resource)驱动 UI。
  • iOS 设计目标:对象(Object)驱动 UI。

Android 最初(2008 年)大量采用 XML 描述 UI,但是XML 本身只是文本,系统解析 XML 时,需要知道xml 当中描述的UI究竟是哪个 Button,于是Google 建立了 Resource Table 来实现资源的映射;

因此Android 必须给每一个 View 一个 Resource ID。否则 xml 解析之后就根本不知道谁是谁。

至于iOS, iPhone 第一代发布的时间为2007 年;当时 Apple 的理念完全为:Everything is an Object, 即整个 UIKit 都建立在 Objective-C 对象之上。

UIButton *loginButton = [[UIButton alloc] init];

loginButton 是一个指针变量 ,保存了这个对象地址;相当于使用这个对象的地址作为唯一的标识,利用已经存在的规则而并非像 Google 一样去创建“新规则”;

为什么后来iOS又增加 Accessibility Identifier?

如果没有 Resource ID,那么自动化测试怎么办?

答案是:Accessibility 最初根本不是为了自动化测试而设计的。

Accessibility 的历史

iOS 最初没有 Resource ID,是因为 UIKit 采用对象驱动架构,开发者始终通过对象引用访问控件,不需要资源映射。

Apple 从很早就开始投入无障碍(Accessibility)能力,希望:

  • 视障用户能够操作手机

  • VoiceOver 能读出按钮名称

  • 残障人士能够正常使用 iPhone

于是系统需要知道,这是一个按钮、它叫什么、它能不能点击,Apple 为了支持 VoiceOver 等无障碍功能,引入了 Accessibility Framework,让每个控件拥有可供辅助技术识别的"语义信息"。

随着 XCUITest 和 Appium 的发展,Apple 又在 Accessibility Framework 中增加了 accessibilityIdentifier,它不会参与无障碍朗读,而是提供一个稳定、不会随对象地址变化的唯一标识,因此逐渐成为 iOS 自动化测试最推荐的定位方式。

另外accessibilityLabel 与 accessibilityIdentifier 有着不同的含义:

button.accessibilityLabel = "登录"

button.accessibilityIdentifier = "login_button"

  • accessibilityLabel: 给用户(无障碍)是使用,会被 VoiceOver 朗读,自动化测试可用使用,但不推荐,容易因文案变化失效
  • accessibilityIdentifier:给开发/测试工具,不会被 VoiceOver 朗读,推荐自动化测试使用,稳定且不受文案影响;

因此现在 iOS 自动化最佳实践通常会要求前端(iOS 开发)为关键控件设置 accessibilityIdentifier(很多跨平台框架会将 testID 映射到它),而不是依赖界面显示文本进行定位。

testID

关于 testID :testID 并不是 iOS、Android 或 Appium 官方提供的概念。 它实际上是跨平台框架(尤其是 React Native)为了统一自动化测试而抽象出来的一个属性。

随着跨平台框架的发展(尤其是 React Native),开发者希望:同一套代码,同时支持 Android 和 iOS。但是两个平台的定位方式完全不同,安卓依赖resource-id , iOS依赖accessibilityIdentifier;

于是 React Native 定义了一个统一的属性:

<Button testID="login_button" />

开发者只需要写一次:

testID="login_button"

React Native 会根据不同的平台,自动转换成对应的原生属性。

关于 testID 在不同平台如何映射:

  • iOS 几乎就是直接映射: testID="login_button"  → view.accessibilityIdentifier = "login_button"
  • Android :testID 会被桥接到 Android 原生,使 UIAutomator/Appium 能够识别这个测试标识。 (Android 并不会识别 testID。识别 testID 的是 React Native。React Native 在创建 Android View 时,把 testID 主动调用 Android 原生 API 写到了 View 对象里)

注:关于“桥接”,就是把 JS 属性翻译成 Java API 调用

上面使用 view.setTag(R.id.react_test_id, testID) 是 React Native Android 多个版本中的典型实现方式,用于帮助理解"桥接"的过程。React Native 内部实现会随着版本(尤其是 Fabric 新架构)演进而调整,Appium/UIAutomator 最终读取该标识的具体细节也可能有所变化。但核心思想始终一致:testID 是 React Native 定义的属性,React Native 负责把它转换为原生 View 上可供测试框架读取的信息,而不是 Android Resource System 为它生成一个新的 resource-id。

在 Appium Inspector 中,很多时候仍然会以 resource-id 或可识别的测试属性形式呈现,这也是为什么不少人感觉它像 resource-id。

总的来说:

iOS 没有 Resource ID 并不是缺少一个功能,而是因为它从架构设计上就不需要这一层"资源映射"。 Android 在创建 View 之前需要先解析资源并完成"资源名 → Resource ID"的映射;而 iOS 创建出来的就是 UIView、UIButton 等对象,开发过程中一直通过对象引用来访问它们,因此没有引入类似 Android Resource Table 的机制。直到后来为了支持无障碍和 UI 自动化测试,Apple 才增加了 accessibilityIdentifier,它只是 UIView 的一个普通字符串属性,而不是像 Android Resource ID 那样参与编译和资源管理

为什么 React Native 两个平台都能定位?

React Native 能让两个平台都能定位,并不是因为 Android 和 iOS 都认识 testID,而是因为 React Native 在原生层分别做了不同的适配,而 Appium 又在自动化层分别对 UiAutomator2 和 XCUITest 做了统一封装。

简单来说就是,React Native 把 JS API 翻译成 Android / iOS 的原生 API。Appium 把统一的自动化 API 翻译成 Android / iOS 的自动化框架

React Native 和 Appium 看成两个不同层面的"适配器(Adapter)",它们都遵循了经典的软件设计原则——抽象(Abstraction)+ 平台适配(Platform-specific Implementation)。

  • React Native 面向的是开发者,它抽象了 UI 开发接口(如 testID、style、onPress),开发者只需要编写一套 JavaScript/JSX,React Native 再根据平台分别调用 Android 和 iOS 的原生 API。
  • Appium 面向的是自动化测试开发者,它抽象了自动化操作接口(如 findElement、click、sendKeys),底层再分别调用 Android 的 UiAutomator2 和 iOS 的 XCUITest。

这也是跨平台框架最核心的思想:对开发者暴露一套统一 API,对底层平台做不同实现(Platform-specific Implementation)。testID 只是这个思想的一个典型例子

回到我们这次的截图

Android:resource-id = field_name

因此:Find By  → id : field_name

iOS:name = field_name

因此:Find By → accessibility id : field_name

说明这一页 RN 已经设置了 testID。

如果没有设置:Android 可能仍能依赖 Resource ID;iOS 很可能只能使用 XPath 或 Class Chain。

Q: ios 的accessibility identifier 是不会改变的吧(只要前端写了 testid)

一般情况下,只要前端写的是固定 testID,iOS 上对应的 accessibilityIdentifier 就是稳定的,不会因为按钮位置、页面布局或文案变化而自动改变。

例如:

<View testID="field_name" />

只要代码中的 "field_name" 没被修改,React Native 在 iOS 端映射出来的标识通常也会保持 "field_name"。Apple 将 accessibilityIdentifier 定义为供 UI 自动化脚本识别元素的字符串;它本身不会由系统随机生成或随着布局变化自动变化。

但需要注意:稳定不等于永远不会变。

以下情况仍可能导致定位失效:

  • 开发把 testID="field_name" 改成了其他值;
  • testID 是动态拼接的,例如 field_${index},列表顺序变化后值也可能变化;
  • 开发删除了 testID,或者把它移动到了外层/内层组件;
  • 多个元素使用了相同 testID,导致定位不唯一;
  • 组件重构后,testID 没有继续传递到底层原生 View;
  • Inspector 中看到的是 label 或 name 的回退值,而不是真正固定的 identifier;
  • 页面元素尚未创建、被销毁重建,或处于不可访问的树结构中。

React Native 也明确说明 Android 与 iOS 的无障碍实现存在平台差异,因此同一个属性在两端的最终暴露形式可能不完全一致

建立知识体系

不要死记:

Android 用 id,iOS 用 accessibility id。

真正应该记住的是下面这张思维图:

Android(开放、资源驱动)
android:id
      │
Resource ID
      │
UIAutomator
      │
Appium ID
​
​
iOS(对象驱动、无障碍复用)
UIView
      │
Accessibility Identifier
      │
Accessibility Tree
      │
XCTest
      │
WebDriverAgent
      │
Appium Accessibility ID
如何解决安卓/IOS获取蓝牙ID不一致问题 不知道大家对低能蓝牙的技术应用了解的怎么样,其实这是一个比较广的应用,比如可以应用于一些信标、家庭娱乐或者医疗方面都有应用。 01 前言 因为小程序官方是支持接入低能蓝牙(BLE)的,所以在一个项目中也尝试使用如何接入蓝牙,我们从微信的官方网站就可以清楚知道如何使用,但是其中也是有很多坑的。本着学习的心态,自己也手把手带你摸坑,一起处理一些平台兼容性的问题以及一些逻辑判断问题。 02 问题抛... 阅读详情

相关推荐

设备唯一ID获取,支持安卓/iOS/鸿蒙Next(uni-device-id)UTS插件

1.获取设备唯一ID、设备唯一标识,支持安卓(AndroidId/OAID/IMEI/MEID/MacAddress/Serial/UUID/设备基础信息),iOS(Identifier/UUID),鸿蒙(AAID/ODID)。2.iOS使用keychain持久存储UUID,应用卸载后UUID不变。3.鸿蒙使用AssetMap存储uuid,应用卸载后UUID不变。

qq_35195386的博客 2799

IOS和Android生成设备唯一ID

文章目录IOS系统Android系统 对于移动开发者来说, 经常需要追踪用户使用了哪台设备登录. 但是随着手机系统越来越完善, 对安全性要求也越来越高. IOS已经无法获取IMEI, 网络MAC地址信息, Android获取IMEI需要用户权限, MAC地址未来也可能获取不到.因此需要使用其它手机来给设备生成一个ID. IOS系统 NSString* deviceId = [[[UIDevice...

wzj_whut的专栏 2410

跨平台设备唯一ID获取全攻略:安卓/iOS/鸿蒙Next的UTS插件实践

本文详细介绍了使用uni-device-id UTS插件跨平台获取设备唯一ID的全攻略。针对安卓、iOS和鸿蒙Next系统,文章深入解析了插件如何通过内置优先级策略(如优先获取OAID、AAID)确保标识符的稳定性与合规性,并提供了关键API使用、分平台配置权限及实战避坑指南,帮助开发者高效解决用户识别、行为分析等业务需求。

g8f9d0s1a2的博客 788

android 无appid分享_App ID 和Bundle ID 有什么不同?ios面试攻克篇(六)

'写在前面的话'这些是我对iOS面试时会碰到的问题的解决方法,整理出来分享给大家,有些错误不要笑了,希望对大家有所帮助。大家有更好的解决办法也欢迎沟通交流。一直以来都有写点儿东西的想法,就从笔记、从阅读开始吧,加油!'1、基础概念Bundle identifier就是应用的标识符,表明应用和其他App的区别。Bundle ID唯一地定义每个App。 它在Xcode中指定。 单个Xcode项目可以有...

weixin_39639518的博客 1364

跨平台设备唯一ID获取全攻略:安卓/iOS/鸿蒙Next的实战解析(uni-device-id)

本文详细解析了如何在安卓、iOS和鸿蒙Next平台上获取设备唯一ID的实战方法,重点介绍了uni-device-id插件的使用技巧和跨平台解决方案。通过对比不同平台的ID获取策略和权限管理,帮助开发者避免常见陷阱,实现精准的用户识别和行为分析。

weixin_42549496的博客 201

跨平台设备ID获取实战:uni-device-id插件在安卓/iOS/鸿蒙Next的完整配置指南

本文详细介绍了如何使用uni-device-id插件在安卓、iOS和鸿蒙Next三大平台上稳定获取设备唯一ID。文章提供了从项目初始化、权限配置到实战代码的完整指南,深入解析了各平台的差异与最佳实践,帮助开发者高效解决跨平台设备标识难题,并确保符合隐私规范。

weixin_29224589的博客 182

android获取设备唯一标识_彻底解决安卓/IOS获取蓝牙ID不一致的问题

​不知道大家对低能蓝牙的技术应用了解的怎么样,其实这是一个比较广的应用,比如可以应用于一些信标、家庭娱乐或者医疗方面都有应用。01 前言因为小程序官方是支持接入低能蓝牙(BLE)的,所以在一个项目中也尝试使用如何接入蓝牙,我们从微信的官方网站就可以清楚知道如何使用,但是其中也是有很多坑的。本着学习的心态,自己也手把手带你摸坑,一起处理一些平台兼容性的问题以及一些逻辑判断问题。02 问题抛出因为蓝牙...

weixin_39603132的博客 2429

vins-mono保存、重载地图、evo工具测试

下面咱们来对vins-mono的重定位vins-mono官方源码地址:https://github.com/HKUST-Aerial-Robotics/VINS-Mono https://blog.youkuaiyun.com/learning_tortosie/article/details/83182258 运行这条: roslaunch benchmark_publisher publish.launc...

追 1万+

跨平台设备ID获取全攻略:uni-device-id插件在安卓/iOS/鸿蒙Next的实战应用

本文详细介绍了uni-device-id插件在跨平台开发中获取设备唯一ID的实战应用。针对安卓、iOS及鸿蒙Next系统的不同隐私规则与API限制,该插件提供了统一接口,整合了OAID、Android ID、Identifier等标识符,并阐述了集成配置、核心API使用及多平台适配策略,帮助开发者构建稳定可靠的设备识别方案。

dog123的博客 222

LT9611EX芯片实战:如何用双端口MIPI转HDMI1.4打造高清播放器(附配置代码)

本文详细介绍了如何使用龙迅半导体的LT9611EX芯片实现双端口MIPI转HDMI1.4的高清播放器开发。内容涵盖芯片特性、硬件设计要点、寄存器配置技巧及完整代码实现,特别适合嵌入式视频处理应用,如机顶盒和便携式媒体播放器。

weixin_29256771的博客 322

ADS笔记,新旧两组仿真数据进行绘图和列表对比

原理图器件参数的不同,怎么进行对比观看,操作如下。

彭辉荣的博客 3869

【Flutter】Flutter 中的 Android / iOS 特殊配置 ② ( Android 应用包名 Application ID 设置 | iOS 捆绑包标识符 Bundle ID 设置)

一、Android 应用包名 Application ID 设置 二、iOS 捆绑包标识符 Bundle ID 设置

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 462

Mac用户必看:PD虚拟机网络初始化失败的3分钟修复指南(附详细截图)

本文针对Mac用户在Parallels Desktop(PD虚拟机)启动时遇到的“网络初始化失败”问题,提供了快速诊断与修复指南。核心原因是macOS系统更新后权限未正确授予。文章通过详细的三步修复法(关闭进程、修改配置文件、重新授权重启),帮助用户在3分钟内恢复虚拟机网络连接,并附有排查清单与预防建议。

weixin_29231027的博客 538

android ios 如何获取设备唯一id

title: android ios 如何获取设备唯一id tags: android,ios,unique_id, flutter, uniapp keywords: unique_id,iOS, uniapp插件, android,设备id,设备唯一标识,unique_device_id,flutter插件 description: 设备唯一id如何获取,安卓获取设备唯一标识;iOS设备唯一标识 前言 设备id,也就是和设备可以一一对应,并且每次获取都是相同的这么一个字符串,在早些年,系统api是开放.

胡汉三的博客 2116

OpenCV图像去畸变实战指南:从原理到参数调优(附完整代码与效果对比)

本文详细解析了OpenCV图像去畸变的原理与实战方法,对比了三种核心函数(标准、鱼眼、全景模型)的适用场景与效果。重点提供了完整的代码示例,并深入探讨了alpha、焦距、中心点等关键参数的调优技巧,以帮助开发者有效矫正镜头畸变,提升计算机视觉任务精度。

life6的博客 553

基于OpenCV实现暗通道先验去雾算法及改进,效果惊人

深度技术文,前方高能

公号:一条coding 2万+

设备ID隐私与合规:如何用uni-device-id插件安全获取安卓/iOS/鸿蒙设备标识

本文深入解析了Android、iOS和鸿蒙系统下设备ID的隐私合规获取方案,重点介绍了uni-device-id插件的分层策略实现安全标识采集。针对GDPR、CCPA等隐私法规要求,提供跨平台统一管理的最佳实践,包括匿名标识符优先、权限动态检测等关键技术,帮助开发者在保障用户隐私的同时满足业务需求。

tomato的博客 779

一层一责,一聚合一包:DDD分层架构下的微服务代码模型、三重边界与服务数据协作

领域模型画得再清楚,落不进代码也是空谈。本文以一个可运行的客户中心微服务为线索,先对比整洁架构、六边形架构与DDD分层架构,指出三者共同守护的那条隔离核心业务的红线;再把DDD分层落成四个一级目录、以聚合为单位分包、一个聚合一个仓储的代码模型,拆解实体、聚合根、值对象、领域事件、领域服务与仓储的设计要点;随后厘清逻辑、物理、代码三重边界,并用检查器实测:干净代码零越界,拆出积分聚合时领域代码无需改动;注入九处越界后,必须先重构才能拆分。最后梳理服务调用三场景与PO、DO、DTO、VO的协作。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 177万+

android 获取蓝牙设备id_小程序中,iOS设备获取蓝牙设备的Mac地址

遇到的问题在使用蓝牙的过程中,我们需要获取蓝牙设备的Mac地址。在Android设备上,onBluetoothDeviceFound方法中,deviceId是蓝牙设备的Mac地址。而在 iOS设备上,deviceId则是蓝牙设备的uuid。我们想要在iOS设备上获取Mac地址,就需要自己想办法。 解决的方法通过查阅一些相关资料,发现有些蓝牙设备有180A这个服务id,该服务id中的2A23特征值可...

weixin_42533910的博客 2145

AI算力网络与通信领域QoS保障的测试方法

在当今数字化时代,AI技术蓬勃发展,AI算力网络应运而生。它将分布在不同地理位置的算力资源进行整合,以高效地支持各种AI应用,如深度学习训练、智能图像识别等。而通信领域则是信息传输的基石,确保数据能够准确、快速地在不同节点之间传递。QoS保障在通信领域至关重要,它可以确保不同类型的业务(如语音通话、视频会议、在线游戏等)获得与其需求相匹配的服务质量。在AI算力网络中,QoS保障同样不可或缺,因为AI任务对网络的带宽、延迟、可靠性等指标有严格要求。

AI算力网络与通信的博客 526

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Unity在Android平台和iOS平台获取设备id

Android中方法 public class UnityPlayerActivity extends Activity { @Override protected void onCreate (Bundle savedInstanceState) { } //获取设备id public String OnGetDeviceID() { ...

渔夫 3259

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

unity 如何正确的获取 iOS、Android 和 Windows 应用商店的广告 ID。

【代码】unity 如何正确的获取 iOS、Android 和 Windows 应用商店的广告 ID。

u013745685的博客 230

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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

React Native中如何调用iOS的Face ID和Android的生物识别,react-native-biometrics

在React Native中调用Android和iOS的Face ID(iOS特有)或类似的功能(如Android上的生物识别,通常是通过指纹或面部识别),你需要分别处理两个平台,因为这两个操作系统提供的API和框架不同。react-native-biometrics

low神 1285

设备唯一代码获取相关

获取设备唯一标识IOS获取UUID,KeychainAccess中保存的keychain-access-groups为根证书idconst char * Utils::getDeviceId() { NSBundle *baudel = [NSBundle mainBundle]; NSString * kcaPath =[baudel pathForResource:@"Keyc

叫我上上的博客 704

获取Android、iOS 设备ID

iOS 命令行方式 $ xcrun simctl list 这行命令会列出你的所以模拟器信息,里面有类似 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 的代码,就是模拟器 UDID。 从 Xcode 获取 打开模拟器,从菜单中打开 Hardware - devices - manage devices。 然后你会看到模拟器信息界面,里面有个 i

jianglianye21的博客 1539
上一篇: sgi-stl3.0 - 手搓平衡二叉搜索树(AVL)
秦少游在淮海
博客等级 码龄3年 1071粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值