答应我,我踩过的坑你别再踩了好嘛,那些年社招的坑坑洼洼

NX/UG二次开发—CAM—设置程序修剪边界Boundary 最近做了一个设置CAM程序边界的小工具,分享一下经验(官方的代码在文章末尾处),以下均以修剪边界曲线为例。 以下为官方提供的源码: /***************************** Include Files **********************************/ #include <stdlib.h> #include <uf.h> #include <uf_obj.h> #include <uf_object_type 阅读详情

回想起前年左右,自己去社招的时候,一连串下来问了好多现在都是历历在目。回想起以前才觉得纸上得来终觉浅,绝知此事要躬行

所有的面试题答案并不是百分百的标准,要靠你自己的感悟和有自己的想法,才能独树一帜脱颖而出的。所有仅供参考

所有的都在这个PDF中有所汇总,983页花了几十个小时整理出来的。还是比较全面的有Android,Java小知识,到性能优化.线程.View.OpenCV.NDK.大厂面试,算法等等,大家可以联系我看看对自身有没有用

更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我联系我获取

1丶如何进行单元测试,如何保证 App 稳定 ?
要测试 Android 应用程序,通常会创建以下类型自动单元测试
  • 本地测试: 只在本地机器 JVM 上运行,以最小化执行时间,这种单元测试不依赖于 Android 框架,或者即使有依赖,也很方便使用模拟框架来模拟依赖,以达到隔离 Android 依赖的目的,模拟框架如Google 推荐的 Mockito;
  • 检测测试: 真机或模拟器上运行的单元测试,由于需要跑到设备上,比较慢,这些测试可以访问仪器(Android 系统)信息,比如被测应用程序的上下文,一般地,依赖不太方便通过模拟框架模拟时采用这种方式;

注意: 单元测试不适合测试复杂的 UI 交互事件

  • App 的稳定主要决定于整体的系统架构设计,同时也不可忽略代码编程的细节规范,正所谓**“千里之堤,溃于蚁穴”**,一旦考虑不周,看似无关紧要的代码片段可能会带来整体软件系统的崩溃,所以上线之前除了自己 本地化测试之外还需要进行 y Monkey 压力测试
  • 少部分面试官可能会延伸,如 Gradle自动化测试、机型适配测试等
2 、 Android 中如何查看一个对象的回收情况 ?

首先要了解 Java 四种引用类型的场景和使用(强引用、软引用、弱引用、虛引用)

  • 举个场景例子: SoftReference 对象是用来保存软引用的,但它同时也是一个 Java 对象,所以当软引用对象被回收之后,虽然这个 SoftReference 对象的 get 方法返回null,但 SoftReference 对象本身并不是 null,而此时这个 SoftReference 对象已经不再具有存在的价值,需要一个适当的清除机制,避免大量SoftReference 对象带来的内存泄露
  • 因此,Java 提供 ReferenceQueue 来处理引用对象的回收情况。当 SoftReference 所引用的对象被 GC 后,JVM 会先将 softReference 对象添加到ReferenceQueue 这个队列中。当我们调用 ReferenceQueue 的 的 poll() 方法,如果这个队列中不是空队列,那么将返回并移除前面添加的那个Reference 对象
public static void main(String[] args) throws InterruptedException {
          
          //假设当前JVM内存只有8m
         Person person = new Person( "/K=" );
         ReferenceQueue Person> queue = new ReferenceQueue>( );
         Sof tReference Person> softReference = new SoftReference<Person>(person, queue );

         реrѕоn = null;// 去掉强引用, new Person ( "/K=" );的这个对象只有软引用了

         Person anotherPerson = new Person( "/L=" )//没有足够的空间同事保留两个Person对象,所以触发GC机制
         Thread.sleep(1000);

         Sys tem. err . println( "软引用的对象 ------" > softReference.get( ));

         Reference softPollRef = queue . poll( );
         if (softPollRef != null) f
              System.err.println( " SoftReference对象中保存的软引用对象已经被GC,准备清理SoftReference对象");
                //清理softReference
         }
}
3丶压缩APK大小
一个完整 APK 包含以下目录(将 APK 文件拖到 Android Studio):
  • META-INF/: 包含 CERT.SF 和 CERT.RSA 签名文件以及 MANIFEST.MF 清单文件。
  • assets/: 包含应用可以使用 AssetManager 对象检索的应用资源。
  • res/: 包含未编译到的资源 resources.arsc。
  • lib/: 包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像 armeabi armeabi-v7a , arm64-v8a , x86 , x86_64 ,和mips。
  • resources.arsc: 包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的 XML 内容。打包工具提取此 XML 内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc8文件中的内容路径 ,例如布局文件和图像。
  • classes.dex:包含以 Dalvik / ART 虚拟机可理解的X DEX 文件格式编译的类。
  • AndroidManifest.xml: 包含核心 Android 清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件.该文件使用 Android 的二进制XML 格式。
  • lib、class.dex 和 res 占用了超过 90%的空间,所以这三块是优化 Apk 大小的重点(实际情况不唯一)
减少 res ,压缩图文文件

图片文件压缩是针对 jpg 和 png 格式的图片。我们通常会放置多套不同分辨率的图片以适配不同的屏幕,这里可以进行适当的删减。在实际使用中,只保留一到两套就足够了(保留一套的话建议保留xxhdpi,两套的话就加上 hdpi),然后再对剩余的图片进行压缩(jpg 采用优图压缩,png 尝试采用pngquant 压缩)

减少 dex
  • 添加资源混淆
buildTypes {
      release  {
            shrinkResources true
            minifyEnabled  true
            proguardFiles  getDefaultProguardFile("proguard-android. txt"),’proguard-rules.pro’
      }
}
  • shrinkResources 为 true 表示移除未引用资源,和代码压缩协同工作。
  • minifyEnabled 为 true 表示通过 ProGuard 启用代码压缩,配合 proguardFiles 的配置对代码进行混淆并移除未使用的代码。
  • 代码混淆在压缩 apk 的同时,也提升了安全性。
减少 lib
  • 由于引用了很多第三方库,lib 文件夹占用的空间通常都很大,特别是有 so 库的情况下。很多 so 库会同时引入 armeabi、armeabi-v7a 和 x86 这几种类型,这里可以只保留 armeabi 或 armeabi-v7a 的其中一个就可以了,实际上微信等主流 app 都是这么做的。
  • 只需在 build.gradle 直接配置即可,NDK 配置同理
defaultConfig {
      ndk  {
             abiFilters 'armeabi'
      }
}
4丶插件化原理分析

插件化是指将 APK 分为 宿主和 插件的部分。把需要实现的模块或功能当做一个独立的提取出来,在 APP 运行时,我们可以动态的 载入或者 替换插件部分,减少 宿主的规模

  • 宿主: 就是当前运行的 APP。
  • 插件: 相对于插件化技术来说,就是要加载运行的apk 类文件

而 热修复则是从修复 bug 的角度出发,强调的是在不需要二次安装应用的前提下修复已知的 bug。

类加载机制:

Android 中常用的两种类加载器, DexClassLoader和 PathClassLoader,它们都继承于BaseDexClassLoader,两者 区别在于PathClassLoader 只能加载 内部存储目录dex/jar/apk 文件。DexClassLoader 支持加载 指定目录(不限于内部)的 dex/jar/apk 文件

插件通信:

通过给插件 apk 生成相应的 DexClassLoader 便可以访问其中的类,可分为单 DexClassLoader 和多DexClassLoader 两种结构。

  • 若使用多 ClassLoader 机制,主工程引用插件中类需要先通过插件的 ClassLoader 加载该类再通过 反
    射调用其方法。插件化框架一般会通过统一的入口去管理对各个插件中类的访问,并且做一定的限制。
  • 若使用单 ClassLoader 机制,主工程则可以 直接通过类名去访问插件中的类。该方式有个弊端,若两个不同的插件工程引用了一个库的不同版本,则程序可能会出错。
资源加载:

原理在于通过反射将插件 apk 的路径加入AssetManager 中并创建 Resource 对象加载资源,有两种处理方式:

  • 合并式: addAssetPath 时加入所有插件和主工程的路径;由于 AssetManager 中加入了所有插件和主工程的路径,因此生成的Resource 可以同时访问插件和主工程的资源。但是由于主工程和各个插件都是独立编译的,生成的资源 id 会存在相同的情况,在访问时会产生资源冲突。
  • 独立式: 各个插件只添加自己 apk 路径,各个插件的资源是互相隔离的,不过如果想要实现资源的共享,必须拿到对应的 Resource对象。
5 、组件化原理

引入组件化的原因: 项目随着需求的增加规模变得越来越大,规模的增大导致了各种业务错中复杂的交织在一起,每个业务模块之间,代码没有约束,带来了代码边界的模糊,代码冲突时有发生, 更改一个小问题可能引起一些新的问题, 牵一发而动全身,增加一个新需求,需要熟悉相关的代码逻辑,增加开发时间

  • 避免重复造轮子,可以节省开发和维护的成本。
  • 可以通过组件和模块为业务基准合理地安排人力,提高开发效率。
  • 不同的项目可以共用一个组件或模块,确保整体技术方案的统一性。
  • 为未来插件化共用同一套底层模型做准备。

组件化开发流程就是把一个功能完整的 App 或模块拆分成多个子模块( Module ),每个子模块可以 独立编译运行,也可以任意组合成另一个新的 App 或模块,每个模块即不相互依赖但又可以相互交互,但是最终发布的时候是将这些组件合并统一成一个 apk,遇到某些特殊情况甚至可以升级或者

6、跨组件通信
跨组件通信场景:
  • 第一种是组件之间的页面跳转 (Activity 到Activity, Fragment 到 Fragment, Activity 到Fragment, Fragment 到 Activity) 以及跳转时的数据传递 (基础数据类型和可序列化的自定义类型)
  • 第二种是组件之间的自定义类和自定义方法的调用(组件向外提供服务)
跨组件通信方案分析:
  • 第一种 组件之间的页面跳转实现简单,跳转时想传递不同类型的数据提供有相应的 API 即可。
  • 第二种组件之间的自定义类和 自定义方法的调用要稍微复杂点,需要 ARouter 配合架构中的 公共服务(CommonService) 实现:
    • 提供服务的业务模块: 在公共服务(CommonService) 中声明 Service接口 (含有需要被调用的自定义方法), 然后在自己的模块中实现这个 Service 接口, 再通过 ARouter API 暴露实现类。
    • 使用服务的业务模块: 通过 ARouter 的 API 拿到这个Service 接口(多态持有, 实际持有实现类), 即可调用 Service 接口中声明的自定义方法, 这样就可以达到模块之间的交互。
  • 此外,可以使用 AndroidEventBus 其独有的Tag, 可以在开发时更容易定位发送事件和接受事件的代码, 如果以组件名来作为 Tag 的前缀进行分组, 也可以更好的统一管理和查看每个组件的事件, 当然也不建议大家过多使用 EventBus。
如何管理过多的路由表?
  • RouterHub 存在于基础库, 可以被看作是所有组件都需要遵守的通讯协议, 里面不仅可以放路由地址常量, 还可以放跨组件传递数据时命名的各种 Key 值,再配以适当注释, 任何组件开发人员不需要事先沟通只要依赖了这个协议, 就知道了各自该怎样协同工作, 既提高了效率又降低了出错风险, 约定的东西自然要比口头上说强。
  • Tips: 如果您觉得把每个路由地址都写在基础库的RouterHub 中, 太麻烦了, 也可以在每个组件内部建立一个私有 RouterHub, 将不需要跨组件的路由地址放入私有 RouterHub 中管理, 只将需要跨组件的路由地址放入基础库的公有 RouterHub 中管理, 如果您不需要集中管理所有路由地址的话, 这也是比较推荐的一种方式。
ARouter 路由原理:

ARouter维护了一个路由表 Warehouse,其中保存着全部的模块跳转关系,ARouter 路由跳转实际上还是调用了 startActivity 的跳转,使用了原生的Framework 机制,只是通过 apt 注解的形式制造出跳转规则,并人为地拦截跳转和设置跳转条件

7 、 Hook 以及插桩技术

Hook 是一种用于 改变 API执行结果的技术,能够将系统的API 函数执行 重定向(应用的 触发事件和 后台逻辑处理是根据事件流程一步步地向下执行。而 Hook 的意思,就是在事件传送到终点前截获并监控事件的传输,像个钩子钩上事件一样,并且能够在钩上事件时,处理一些自己特定的事件,例如逆向破解 App)

Android 中的 Hook 机制,大致有两个方式:
  • 要 root 权限,直接 Hook 系统,可以干掉所有的App。
  • 无 root 权限,但是只能 Hook 自身 app,对系统其它 App 无能为力。

插桩是以静态的方式修改第三方的代码,也就是从编译阶段,对源代码(中间代码)进行编译,而后重新打包,是静态的篡改; 而 Hook则不需要再编译阶段修改第三方的源码或中间代码,是在运行时通过反射的方式修改调用,是一种 动态的篡改

8 、说下 Measurepec 这个类

作用: 通过宽测量值 widthMeasureSpec 和高测量值heightMeasureSpec 决定 View 的大小

组成: 一个 32 位 int 值,高 2 位代表 SpecMode(测量模式),低 30 位代表 SpecSize( 某种测量模式下的规格大小)。

三种模式:

  • UNSPECIFIED: 父容器不对 View 有任何限制,要多大有多大。常用于系统内部。
  • EXACTLY(精确模式): 父视图为子视图指定一个确切的尺寸 SpecSize。对应 LyaoutParams 中的match_parent 或具体数值。
  • AT_MOST(最大模式): 父容器为子视图指定一个最大尺寸 SpecSize,View 的大小不能大于这个值。对应LayoutParams 中的 wrap_content。
9丶图片加载库Glide

图片加载库: Fresco 丶Glide 、o Picasso 等

Glide 的设计:
  • Glide 的生命周期绑定: 可以控制图片的加载状态与当前页面的生命周期同步,使整个加载过程随着页面的状态而启动/恢复,停止,销毁
  • Glide 的缓存设计: 通过(三级缓存,Lru 算法,Bitmap 复用)对 Resource 进行缓存设计
  • Glide 的完整加载过程: 采用 Engine 引擎类暴露了一系列方法供 Request 操作
10 、区别 Animation 和 和 Animator
  • 动画的种类: 前者只有 透明度, 旋转, 平移, 伸缩 4 种属性,而对于后者,只要是该控件的属性,且有 setter 该属性的方法就都可以对该属性执行一种 动态变化的效果。
  • 可操作的对象: 前者只能对 I UI 组件执行动画,但属性动画几乎可以对任何对象执行动画(不管它是否显示在屏幕上)。
  • 动画播放顺序: 在 Animator 中,AnimatorSet正是通过
    playTogether() 、playSequentially() 、animSet.play().with()、before()、after()这些方法来控制多个动画协同工作,从而做到对动画播放顺序的精确控制
// animation主要用于tween动画
   //根据资源得到动画
   Animation roitateAnimation = AnimationUtils.loadAnimation(this,R.anim.rotata_anim);
  //播放动画完成之后,保留动画最后的状态
   rotateAnimation.setFillAfter(true);
 //播放动画
  btnRotate.startAnimation(rotateAnimation);

// animator主要用于属性动画
   objectAnimator animator = objectanimator.ofFloat(textview,"alpha,1f,0f,1f);
   animator.setDuration(5000);
   animator,start();

   AnimatorSet animatorSet = new AnimatorSet();
    //移动
        objectAnimator ty = object Animator.ofFloat(btn,"translationY",0,300);
          ty.setDuration(1000);
   //旋转
       objectAnimator ty = objectAnimator.ofFloat(btn, "rotationY", 0,1080);
   //透明度
       objectAnimator alpha = objectAnimator.ofFloat(btn, "alpha", 1,0,0.5f,1);
   //缩放
       objectAnimator sx = objectAnimator.ofFloat(btn, "scaleX",1,0.5f);
   //一起播放
        // animatorSet.playTogether(items);
        animatorSet.play(ry),with(sx).after(ty).before(alpha);
        animatorSet.start();

更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我联系我获取

03. 线性规划与混合整数规划 (LP/MIP) 本文介绍了OR-Tools中的线性规划(LP)和混合整数规划(MIP)求解器。主要内容包括:1) LP/MIP的基本概念和数学形式,对比了LP、MIP、ILP和BIP的区别;2) OR-Tools支持的求解器类型,如GLOP、SCIP等,以及它们各自的特点和适用场景;3) 详细展示了如何使用GLOP求解器进行线性规划求解,包括变量定义、约束添加和目标函数设置;4) 介绍了SCIP求解器的配置和使用方法;5) 讨论了变量类型、约束类型、多目标优化等进阶功能。文章通过Java代码示例演示了如何实现一个完整的优化 阅读详情

相关推荐

WorkBuddy结合DeepSeek与Skill:文献检索自动化与Token成本控制实战

Agent工具与大模型API的结合正重塑知识工作者的日常流程。在实际工程中,调用大模型处理批量任务常面临Token消耗过快、成本不可控的痛点,而国产大模型DeepSeek以极低的API定价和兼容OpenAI接口的特性,为规模化文本处理提供了“Token自由”的可能。同时,可复用的Skill机制能够将特定领域的工作流固化为标准化步骤,让Agent自动执行检索式生成、文献筛选与摘要归纳等复杂操作。本文从这一技术背景出发,以科研文献检索为应用场景,演示如何利用WorkBuddy、DeepSeek API与自建文献

weixin_29061509的博客 485

简易measure系统的开发

简易测量系统的开发容器思想是,定义一个measure接口,方便用户对于测量方法的扩展,和一个container用于储存将要测量的对象。基于测量方法和测量对象的不确定,所以在接口中和container类中的方法参数都使用Object父类,易于系统的扩展和更好的满足实用性。   (一)接口measure代码如下: //放入com.yc.measuresys的包中 package com.yc.m

hellokitven的博客 989

ADS 2013安装教程

1.2013和2014安装过程是一样的,运行ads2013_06_shp_windows文件进行安装 2.点击“NEXT”。 3.选择I accept,然后点击“NEXT”。 4.选择“complete”,然后点击“NEXT”。 5.选择安装路径,最好默认安装路径,安装路径不要有中文,然后点击“NEXT”。 6.点击“NEXT”. 7.如下路径默认安装,然后点击“NEXT”。 8.点击“NEXT”。 ...

谢谢关注“小鱼教你模数电”,各平台同号 6007

Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了。但是,正如上篇文章当中所说到的,属性动画对补间动画进行了很大幅度的改进,之前补间动画可以做到的属性动画也能做到,补间动画做不到的现在属性动画也可以做到了。因此,今天我们就来学习一下属性动画的高级用法,看看如何实现一些补间动画所无法实现的功能。 阅读本篇文章需要你对属性动画有一定的了解,并且掌握属性动画的基本用法,如果你还对属性动画不够了解的话,建议先去阅读 Andr

郭霖的专栏 12万+

MQTT在智能家居中的实战:用Android手机控制ESP8266设备(基于EMQX)

本文详细介绍了如何利用MQTT协议构建一个完整的智能家居控制系统,通过Android手机App远程操控ESP8266设备。文章提供了从EMQX服务器部署、ESP8266端Arduino固件开发到Android客户端搭建的完整实战指南,并深入探讨了系统联调、稳定性优化与安全加固等关键环节,为物联网开发者提供了一套可复用的解决方案。

ujm567890的博客 457

基于simulink的低通滤波器(Low-pass Filter, LPF)

摘要:本文详细介绍了如何在Simulink中搭建低通滤波器进行噪声抑制仿真。通过定义系统需求(50Hz信号+250Hz噪声)、添加信号源、设计6阶巴特沃斯低通滤波器(截止频率100Hz)、连接各模块并配置仿真参数,最终实现高频噪声的有效滤除。该教程包含从模型创建到结果分析的完整流程,为信号处理系统开发提供了基础框架,并可进一步扩展为自适应滤波等高级应用。所需MATLAB版本为R2023a及以上,需安装Simulink和DSPSystemToolbox。

amy_mhd的博客 1303

找工作面试会遇到哪些坑(社招篇)

找工作面试会遇到哪些坑(社招篇) 前言 几个月前,我写的那篇文章《2018-09-02-找工作面试会遇到哪些坑(校招篇)》,阅读量还不错。今天,我就针对社招找工作写一篇。 (温馨提示:今天的社招篇,与上次的校招篇相比,会有一小部分内容的重合,毕竟校招和社招还是有一些共同点的。) 先简单介绍一下我的个人履历:我于2013年6月毕业于一个很普通的二本学校,2016年6月毕业于电子科技大学。从学校毕业后...

weixin_34087307的博客 5155

TypeError: XGBClassifier.fit() got an unexpected keyword argument ‘early_stopping_rounds‘ 解决方案

本文主要介绍了TypeError: XGBClassifier.fit() got an unexpected keyword argument 'early_stopping_rounds’解决方案,希望能对使用XGBoost的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

Android 混淆总结(直接copy)

# Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in D:\android-sdk-windows/tools/proguard/proguard-android.txt # You can edit the incl

在路上、、、 5931

2026年最值得学习的十大 SAP 开发技术

在这辞旧迎新之际,我想和大家聊聊我心中的2026年我仍然愿意持续投入时间去学习的一些 SAP 开发技术。因为笔者水平和视野局限,加上这份清单有笔者主观兴趣爱好在内,可能大家对清单上罗列的技术有不同意见,欢迎大家在评论区发表自己的见解。下面是笔者列出的十个技术方向,排名不分先后。因为精力有限,2026年我很可能只会选择其中一两个自己最感兴趣的方向去深耕。每项技术后面都提供了链接,方便大家看完就开始学习。

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

YOLOv13:目标检测的全面攻略与实战指南

本文是关于 YOLOv13 的全攻略文章。先回顾 YOLO 系列发展,点明 YOLOv13 在该系列中的创新地位,阐述其基于 HyperACE、FullPAD 和轻量级卷积替换等技术的独特优势。深入剖析各核心技术原理,通过与其他版本及实际场景对比展现其性能优势。介绍项目结构与使用方式,分享数据增强、锚框优化等实用技巧,并列举安防监控、自动驾驶等领域应用案例。最后总结 YOLOv13 价值,展望目标检测技术未来发展趋势,为读者提供全面的 YOLOv13 学习与实践指导。

邓邓子的博客 3434

一个屌丝程序猿的人生(八十九)

  由于周六跑了一下午,周日林萧没有再出去溜达,而是在宿舍宅了一天,看了一天的《非诚勿扰》。   每次看到节目上,那些女嘉宾为了一些腰缠万贯的男嘉宾,争得头破血流的时候,林萧都不由得感慨,这年头,真是特么的有钱就是爷。   不过林萧对此一点也不羡慕,因为他始终认为,建立在金钱之上的婚姻,是无法持久的,毕竟谁能保证富裕始终伴随着自己。   他还是更倾向于始于爱情,然后再两个人一起奋斗的婚姻,这...

weixin_30699741的博客 217

RT-DETR-R18 上下文信息融合:引入全局特征提升遮挡目标检测

"""轻量化全局特征提取器(2层Transformer编码器)"""# 特征投影层(将多尺度特征统一维度)# 轻量化Transformer编码器(分组卷积优化)# 全局特征池化(输出 [bs, hidden_dim])# local_features: 多尺度特征列表 [C3, C4, C5],各 [bs, c, h, w]# 统一投影至 hidden_dim 并展平为序列# Transformer编码全局上下文# 全局池化得到全局向量。

走向CTO的路上... 495

调侃童年

童年 幸福的味道

qingzizheng的专栏 395

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

李阳和他的疯狂英语

今天在翻看之前在人人网中的日志时,发现一篇关于的文章引起了我的注意,我觉得还是有必要和大家分享下的,这篇文章算是一个私人评论,来源是出自eygle的一篇转载。http://ww...

小麦苗DBA宝典 1533

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

李阳和他的疯狂英语(r5笔记第46天)

今天在翻看之前在人人网中的日志时,发现一篇关于<李阳和他的疯狂英语的创业史和衰落史>的文章引起了我的注意,我觉得还是有必要和大家分享下的,这篇文章算是一个私人...

杨建荣的学习笔记 1146

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

帝都机器人便利店_飘了?帝都这几家网红便利店,竟藏着“米其林”早餐!

...越来越多的人开始得胃病他们忽略了早餐的重要听小北一句:在忙也要记得买一份早餐!新能源车准入新规锁定4家常去的便利店全家|7-11|罗森|便利蜂到底哪些值得买哪些又是不建议买的雷区先说好了,别饿着肚子看7-11驻扎在地铁站附近, 方便通勤路上能够购买到早饭,出地铁刚好去店里转一圈儿,齐活!面包向来都是简单的代名词更是一种方便许多上班族喜欢用面包作为早餐既当饱又方便“啃”可可火山包评分:★★★☆...

weixin_30014783的博客 241

山村鬼事秘史(二)

  二)  农历八月二十七,天晴,有大风。不宜祭祀,动土。  大煞易除,小煞难治。  我辈之耻也。   --------摘自《欧阳秘史》  时间过的很快,西北角的庙在第二天就已请人来建,两天后建好了。但是这块破成两半的铜镜却无法复原。阴阳师傅有儿子,但是年幼。还好他的妻子见过一点。做了个法事,仍旧把它埋在原来的地方。所有人的尸体都准备这天出殡,黄历上明明写的不宜祭祀,动土,但是不知道是谁先说要今天

与爱相随 1860

八月二十五日----晴

昨天晚上睡觉还比较舒服,比前天舒服多了 昨天一天都没有多少精神,到下午的时候问了乔哥,我什么时候可以离开了,乔哥给我交代了要做的事情我都做完了,应该可以走了,不过心情不是很好~~~下午的时候,我又问了一下乔哥,他说就这一两天~~ 下午我把所有的资料都整理出来,给了小甘`~~~(我这里的师傅,呵呵)~~~ 晚上回到学校,心情不是很平静~~到京工的时候,看到人好多,没有进去~~,到校园里面走走,学校好...

love19820823 184

是谁在我的心里打了个结(二十一)托付

黄琳家不在景洪,那晚我们一直呆在车里直到天亮,因为她告诉我说那时候去找旅店住不划算何况大半夜的也找不到,人家都关门了。所以就这样,我和她躺在卧铺上一直睡到天亮。 早上大约八点半左右,我们又坐在另一辆车上。听着发动机的嗡嗡作响,通过收费站,我们又上路了。 前面的路很长,一直都是在颠簸中摇晃前行,也许一会儿,或者很长的几小时过后,我又要听到乘务员小姑娘传来的喜悦通知,然后就...

weixin_30344795的博客 240

夏日物语

一>乌鸦的呱呱呱呱实在是难听,我简直要崩溃了,可我还没有娶媳妇,为了不因为我的英年早逝而导致我们狐狸一族的衰退,我离开了。离开时候,我哭了,因为不舍,因为留恋,我是一只狐狸,一只爱哭鼻子的小狐狸。 在自然界,所有生物都是同等的人(这是后来我的一个哲学大师朋友告诉我的),所以我很伤心,因为我抛弃了陪伴了很长一段岁月的乌鸦,以后,也许再也没有人会和我争吵,没有人会为了树叶与树叶是不是相同而

wangsican的专栏 684

做phodal的御用编辑,其实我是拒绝的

前情回顾:极客爱情 2.1 | 从你的编程世界路过极客爱情 2.2 | 你究竟有多少个女神 极客爱情 2.3 | 和技术宅约会是这样的极客爱情 2.4 | ...

Phodal's zenthink 593

失约Infiniti:SUV与风险投资的随想

经不起Infiniti的再三邀请,答应去新建的东方赛车场试驾。想起半年前曾经有一次停在一辆Infiniti的越野车旁边(当时什么型号没注意),感觉自己在它身旁就如同夏利在我身旁...

csf1969的博客 217

LLM Agent评测:为什么测试环境“缰绳”是公平对比的关键?

在大语言模型(LLM)应用开发中,Agent(智能体)的基准测试是评估其实际性能的核心环节。其原理在于,Agent并非静态模型,而是一个由提示词、工具调用、规划循环等组件构成的动态系统。因此,测试的“缰绳”(Harness)——即驱动和评估Agent的完整环境与规则——直接决定了评测结果的可靠性与公平性。从技术价值看,一个设计良好的测试缰绳能确保对比聚焦于Agent框架的设计优劣,而非不公平的测试设置,这对于技术选型与性能优化至关重要。在实际应用场景中,无论是开源框架对比还是企业内部选型,都需要在提示词工程

weixin_33754065的博客 462
上一篇: 当年他问我service,我是这样回答的
下一篇: 带你手把手重读 Handler 源码,聊聊那些你所不知道一二三
初壹十五a
博客等级 码龄8年 146粉丝 257原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值