代理模式之通俗易懂

基于单目视觉的四旋翼定点降落——如何通过mavros控制pixhawk(二)     一直拖了这么久没有更新,怪我太懒啦~~~ 今天要特别感谢舒仔仔同学,我的好队友帮我写了这篇博文。这篇文章主要讲了如何通过mavros来控制pixhawk。硬件逻辑是这样子,我们先搞一个odroid(土豪上TX2),再用usb线将odroid与pixhawk连接。所以,odroid发送控制指令来控制pixhawk飞行。pixhawk与外界的通信协议是mavlink。ROS下面有个包叫mavr... 阅读详情

1、是什么

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用
办事要求人,所以找代理。
结构型设计模式
在这里插入图片描述

2、干嘛用

代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。

远程代理
虚拟代理
安全代理
智能代理
(1) 当客户端对象需要访问远程主机中的对象时可以使用远程代理。
(2) 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。
(3) 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。
(4) 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。
(5) 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。

spring框架中的aop技术

3、怎么用

案例:
疫情期间,公司非法裁员,员工找律师代理跟公司打官司。

1、静态代理

程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
组成
一个委托类和代理类之间的约束接口,一个代理类,一个委托类,一个工厂类

代码实现:

首先得有一个接口,通用的接口是代理模式实现的基础,这个接口有打官司的功能

public interface Lawsuit {
    void dolawsuit();
}

//被代理类

public class Mylawsuit implements Lawsuit {
    @Override
    public void dolawsuit() {
        System.out.println("跟公司打官司");
    }
}

//代理类

public class LawsuitBylawyer implements Lawsuit {
    private Lawsuit lawsuit;

    public LawsuitBylawyer(Lawsuit lawsuit) {
        this.lawsuit = lawsuit;
    }

    @Override
    public void dolawsuit() {
        System.out.println("代理全权代理");
        lawsuit.dolawsuit();
        System.out.println("打得李晶丁卓满地找牙");
    }
}

//代理工厂

public class SubjectStaticFactory {
    public static Lawsuit getInstance() {
        return new LawsuitBylawyer(new Mylawsuit());
    }
}

//测试

public class Test {
    public static void main(String[] args) {
        Lawsuit instance = SubjectStaticFactory.getInstance();
        instance.dolawsuit();
    }
}

在这里插入图片描述

2、动态代理

基于JDK技术 动态代理类技术核心 Proxy类和一个 InvocationHandler 接口
基于CGlib 动态代理模式 基于继承被代理类生成代理子类,不用实现接口。只需要被代理类是非final 类即可。(cglib动态代理底层是借助asm字节码技术
基于 Aspectj 实现动态代理(修改目标类的字节,织入代理的字节,在程序编译的时候 插入动态代理的字节码,不会生成全新的Class )
基于 instrumentation 实现动态代理(修改目标类的字节码、类装载的时候动态拦截去修改,基于javaagent) -javaagent:spring-instrument-4.3.8.RELEASE.jar (类装载的时候 插入动态代理的字节码,不会生成全新的Class )

(1)、基于JDK技术 动态代理

XXXInvocationHandler 类 实现InvocationHandler接口,这个类中持有一个被代理对象(委托类)的实例target。
该类别JDK Proxy类回调InvocationHandler 接口中有一个invoke方法,当一个代理实例的方法被调用时,代理方法将被编码并分发到 InvocationHandler接口的invoke方法执行。

invoke方法

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
…
Object result = method.invoke(target, args);
…
return result;
}

invoke参数解释
proxy 代表动态生成的 动态代理 对象实例
method 代表被调用委托类的接口方法,和生成的代理类实例调用的接口方法是一致的,它对应的Method 实例
args 代表调用接口方法对应的Object参数数组,如果接口是无参,则为null; 对于原始数据类型返回的他的包装类型。

代码实现

//通用的接口

public interface Lawsuit {
    void dolawsuit();
}

//被代理类

public class Mylawsuit implements Lawsuit {
    @Override
    public void dolawsuit() {
        System.out.println("跟公司打官司");
    }
}

//动态代理类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * 全能代理类
 */
public class ProxyHandler implements InvocationHandler {

    private Object target;

    public ProxyHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        /**
         * 在转调具体目标对象之前,可以执行一些功能处理
         */
        System.out.println("被动态代理类回调执行, 代理类 proxyClass =" + proxy.getClass()
                + " 方法名: " + method.getName() + "方法. 方法返回类型:" + method.getReturnType()
                + " 接口方法入参数组: " + (args == null ? "null" : Arrays.toString(args)));
        System.out.println("代理全权代理");
        Object invoke = method.invoke(target, args);
        System.out.println("打得李晶满地找牙");
        return invoke;
    }
}

//动态代理调用

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class Test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        System.out.println("-------------------第一种创建代理类方法--------------");
        //创建一个实例对象,这个对象是被代理的对象,委托类
        Mylawsuit mylawsuit = new Mylawsuit();
        //创建一个与代理类相关联的InvocationHandler,每一个代理类都有一个关联的 InvocationHandler,并将代理类引用传递进去
        InvocationHandler handler = new ProxyHandler(mylawsuit);
        Lawsuit lawsuitProxy = (Lawsuit) Proxy.newProxyInstance(Lawsuit.class.getClassLoader(), new Class<?>[]{Lawsuit.class}, handler);
        lawsuitProxy.dolawsuit();

        System.out.println("-------------------第二种创建代理类方法--------------");        /**
         *  动态代理对象步骤
         *      1、 创建一个与代理对象相关联的 InvocationHandler,以及真实的委托类实例
         *      2、Proxy类的getProxyClass静态方法生成一个动态代理类stuProxyClass,该类继承Proxy类,实现 Person.java接口;JDK动态代理的特点是代理类必须继承Proxy类
         *      3、通过代理类 proxyClass 获得他的带InvocationHandler 接口的构造函数 ProxyConstructor
         *      4、通过 构造函数实例 ProxyConstructor 实例化一个代理对象,并将  InvocationHandler 接口实例传递给代理类。
         */

        // 1、创建 InvocationHandler 实例并设置代理的目标类对象
        Mylawsuit mylawsuit2 = new Mylawsuit();
        InvocationHandler Handlertwo = new ProxyHandler(mylawsuit2);
        // 2 创建代理类,是一个字节码文件, 把 proxyClass 保存起来就能看到 他继承Proxy 类,实现Person接口
        Class<?> proxyClass = Proxy.getProxyClass(Lawsuit.class.getClassLoader(), new Class<?>[]{Lawsuit.class});
        /** 代理类信息 */
        System.out.println("package2 = " + proxyClass.getPackage() + " SimpleName = " + proxyClass.getSimpleName()
                + " name =" + proxyClass.getName() + " CanonicalName = " + "" + proxyClass.getCanonicalName()
                + " 实现的接口 Interfaces = " + Arrays.toString(proxyClass.getInterfaces())
                + " superClass = " + proxyClass.getSuperclass() + " methods =" + Arrays.toString(proxyClass.getMethods()));

        // 3、  通过 proxyClass 获得 一个带有InvocationHandler参数的构造器constructor
        Constructor<?> ProxyConstructor = proxyClass.getConstructor(InvocationHandler.class);

        // 4、通过构造器创建一个  动态代理类 实例
        Lawsuit stuProxy = (Lawsuit) ProxyConstructor.newInstance(Handlertwo);
        /** 检测生成的类是否是代理类 */
        System.out.println("stuProxy isProxy " + Proxy.isProxyClass(stuProxy.getClass()));
        /** 获取 代理类关联的 InvocationHandler 是哪个*/
        InvocationHandler handlerObject = Proxy.getInvocationHandler(stuProxy);
        System.out.println(handlerObject.getClass().getName());
        stuProxy.dolawsuit();
    }
}

(2)、基于CGlib 技术动态代理代理类实现 (基于继承)

Cglib是针对类来实现代理的,他的原理是对代理的目标类生成一个子类,并覆盖其中方法实现增强,因为底层是基于创建被代理类的一个子类,所以它避免了JDK动态代理类的缺陷。

但因为采用的是继承,所以不能对final修饰的类进行代理。final修饰的类不可继承。

导入maven 依赖

<!-- cglib 动态代理依赖 begin -->
 <dependency>
   <groupId>cglib</groupId>
   <artifactId>cglib</artifactId>
   <version>3.2.5</version>
   </dependency>
   <!-- cglib 动态代理依赖 stop -->

//被代理类,普通类

public class Mylawsuit {
    public void dolawsuit() {
        System.out.println("跟公司打官司");
    }
}

方法拦截器 实现 MethodInterceptor 接口

一个切面,用于在方法拦截器中intercept 方法中调用真正业务方法之前 之后处理逻辑

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibMethodInterceptor implements MethodInterceptor {
    /**
     * 用于生成 Cglib 动态代理类工具方法
     *
     * @param target 代表需要 被代理的 委托类的 Class 对象
     * @return
     */
    public Object proxyInterceptor(Class target) {
        /** 创建cglib 代理类 start */
        // 创建加强器,用来创建动态代理类
        Enhancer enhancer = new Enhancer();
        // 为代理类指定需要代理的类,也即是父类
        enhancer.setSuperclass(target);
        // 设置方法拦截器回调引用,对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept() 方法进行拦截
        enhancer.setCallback(this);
        // 获取动态代理类对象并返回
        return enhancer.create();
        /** 创建cglib 代理类 end */
    }

    /**
     * 功能主要是在调用业务类方法之前 之后添加统计时间的方法逻辑.
     * intercept 因为  具有 MethodProxy proxy 参数的原因 不再需要代理类的引用对象了,直接通过proxy 对象访问被代理对象的方法(这种方式更快)。
     * 当然 也可以通过反射机制,通过 method 引用实例    Object result = method.invoke(target, args); 形式反射调用被代理类方法,
     * target 实例代表被代理类对象引用, 初始化 CglibMethodInterceptor 时候被赋值 。但是Cglib不推荐使用这种方式
     *
     * @param obj    代表Cglib 生成的动态代理类 对象本身
     * @param method 代理类中被拦截的接口方法 Method 实例
     * @param args   接口方法参数
     * @param proxy  用于调用父类真正的业务类方法。可以直接调用被代理类接口方法
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("代理全权代理");
        Object invokeSuper = proxy.invokeSuper(obj, args);
        System.out.println("打得李晶满地找牙");
        return invokeSuper;
    }
}

Cglib测试类

public class CglibTest {
    public static void main(String[] args) {
        CglibMethodInterceptor cglibMethodInterceptor = new CglibMethodInterceptor();
        Mylawsuit o = (Mylawsuit) cglibMethodInterceptor.proxyInterceptor(Mylawsuit.class);
        o.dolawsuit();
    }
}

Cglib 总结

CGlib可以传入接口也可以传入普通的类,接口使用实现的方式,普通类使用会使用继承的方式生成代理类.
由于是继承方式,如果是 static方法,private方法,final方法等描述的方法是不能被代理的
做了方法访问优化,使用建立方法索引的方式避免了传统JDK动态代理需要通过Method方法反射调用.
提供callback 和filter设计,可以灵活地给不同的方法绑定不同的callback。编码更方便灵活。
CGLIB会默认代理Object中equals,toString,hashCode,clone等方法。比JDK代理多了clone。

PCL 从LAS文件中获取点云的颜色【2026最新版】 PCL从LAS文件中获取点云的RGB信息(pcl::PointXYZRGB)并进行可视化。博客长期更新,本文最新更新时间为:2026年5月4日。 阅读详情

相关推荐

【转载】参数估计(Parameter Estimation):频率学派(最大似然估计MLE、最大后验估计MAP)与贝叶斯学派(贝叶斯估计BPE)

基础 频率学派与贝叶斯学派 http://www.douban.com/group/topic/16719644/ http://www.zhihu.com/question/20587681 最大似然估计(Maximum likelihood estimation,MLE) http://baike.baidu.com/view/1918804.htm http://baike.baidu.co

影 的专栏 3413

一文读懂Java中的设计模式——代理模式,以翻译场景举例,特别通俗易懂!

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。目的:为其他对象提供一种代理以控制对这个对象的访问。

liwenxiang629的博客 805

MuJoCo 动捕接口 Mocap 直接操控机械臂(附代码)

动作捕捉(Motion Capture,简称 Mocap)是一种记录并处理人或物体动作的技术,在影视、游戏、机器人等领域应用广泛。通过上下左右以及alt_l,alt_r可以控制hand这个hody跟着mocap进行同步,这里将quat固定为Z朝下。首先在 scene.xml 中修改添加 mocap 和 equality。下面介绍如何配置 Mocap 以及使用按键进行末端控制。控制核心代码,通过按键控制mocap的pos和quat。

darcsdn 879

代理模式的深度解析

代理模式 结构型设计模式 GoF23种设计模式之一 静态代理 动态代理 CGLIB动态代理

三冬暖 1574

Qt QChart实战:从零打造一个实时温度监控仪表盘(附完整源码)

本文详细介绍了如何使用Qt QChart模块从零构建一个工业级实时温度监控仪表盘。通过实战案例,展示了波形图的绘制、坐标轴配置、数据流模拟等关键技术,并提供了完整的源码实现,帮助开发者快速掌握Qt在数据可视化领域的应用。

weixin_42537919的博客 242

手把手教你用Cadence Virtuoso仿真一个5GHz CMOS分频器:从原理图到后仿,避开那些教科书上没写的坑

本文详细介绍了在Cadence Virtuoso环境中设计5GHz CMOS分频器的完整流程,从原理图设计到后仿真优化,特别关注实际工程中容易被忽视的关键问题。内容涵盖分频器核心指标解析、锁存器拓扑选择、接口设计匹配以及后仿真优化策略,为射频集成电路设计提供实用避坑指南。

weixin_26934905的博客 262

通俗易懂讲解代理模式

什么是代理模式? 代理模式的定义:代理模式给某一对象提供一个代理对象,并由代理对象控制对原有对象的引用。通俗的来说就是我们所说的中介。 举个例子来介绍: 现在包租婆要租房子,一方面通过自己给客户介绍,另外一方面是将房子给中介公司,让其帮忙代理出租房子,用图展示如下: 代理模式涉及到如何角色: 客户端 代理对象 目标对象 代理对象和目标对象的公共接口 代理模式的优点 隔离作用:在某些情况下,一...

猿了个猿的博客 1294

【Audio】基于STM32 I2S移植WM8978 Audio Codec驱动

1. WM8978简介 WM8978是一款低功耗,高质量的立体声编解码器,专为便携式应用,如数码相机或数码摄像机等。 该芯片集成了立体声差分麦克风的前置放大器,并包括扬声器、耳机和差分或立体声线输出的驱动器。外部组件要求减少,因为不需要单独的麦克风或耳机放大器。 WM8978的功能框图如下所示: 2. WM8978硬件连接 使用STM32F429+WM8978硬件平台,通过I2S接口来读写音频数据,I2C接口发送写命令控制WM8978相关功能。 STM32F429与WM8978的引脚连接如下:

ZHONGCAI0901的博客 1万+

代理模式(动态代理)简单通俗易懂的例子

静态代理的缺点:如果接口中增加方法,所有实现类要实现这个方法外所有代理类也要实现这个方法。动态代理:目的:代理类不重写接口的方法,在程序运行中动态绑定要代理的方法;public interface MoveAble2 { void run(); void use(); }public class Jeep2 implements MoveAble2 { public vo...

weixin_40839342的博客 1499

从原理图到PCB:手把手教你绘制DRV8301驱动板(附完整代码与避坑指南)

本文详细介绍了如何从原理图设计到PCB布局,手把手教你绘制DRV8301驱动板,特别适用于FOC(磁场定向控制)系统开发。内容涵盖元器件选型、电源树架构设计、栅极驱动电路、PCB布局技巧、焊接调试及代码配置,并附有完整代码与常见问题避坑指南,帮助工程师快速掌握DRV8301驱动板的设计与优化。

weixin_33716941的博客 394

# YOLOv11-seg改进系列 | 引入CVPR MetaFormer的C3k2_PoolingFormerCGLU模块,池化Token混合+CGLU门控MLP

本文引入 CVPR 2022 论文(MetaFormer/PoolFormer)提出的 MetaFormer 元架构设计,以Pooling Token 混合器 + ConvolutionalGLU(CGLU)MLP构成,将其封装为,用于替换 YOLOv11-seg 的 C3k2 块。对比维度C3k2(基线)C3k2_PoolingFormerCGLU(本文)参数量(n scale)2.46M≈2.49M9.6≈9.69.7(+1.0%)架构范式单阶段卷积MetaFormer 双阶段。

qq_44224801的博客 843

通俗易懂讲解代理模式以及相关特点

代理模式 代理模式是生产开发中一个非常经典的设计模式,许多优秀的框架中都用来用到了这种设计。 如struts2的拦截器,mybatis中拦截器插件、AspectJ和Spring中的AOP等等… 下面我面来谈谈什么是代理模式。 ​ 代理模式的定义:为其他访问对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中...

qq_37430539的博客 859

Pulseaudio之同步/异步(十一)

PulseAudio是一个声音服务器,一个后台进程从一个或多个音源(进程或输入设备)接受声音输入 然后重定向声音到一个或多个槽(声卡,远程网络PulseAudio服务,或其他进程)。 PulseAudio的主要特点包括: 可对每一个应用程序进行音量控制Per-application volume controls 可扩展的插件与支持可装载模块架构 兼容性许多流行的音频应用程序 支持多重音源和多重输出 低延时操作和支持延迟测量 一个对处理器资源效率零拷贝内存架构 能够发现本地网络上使用PulseAu

Android系统攻城狮 995

通俗易懂的讲解一下Java的代理模式

一、基本概念 代理模式是对象的结构模式。 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用(接口的引用) 二、静态代理 静态代理是指,代理类在程序运行前就已经定义好,其与**目标类(被代理类)**的关系在程序运行前就已经确立。 静态代理类似于企业与企业的法律顾问间的关系。法律顾问与企业的代理关系,并不是在“官司“发生后才建立的,而是之前就确立好的一种关系。 而动态代理就是外面打...

qq_38464250的博客 503

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

通俗易懂设计模式解析——代理模式

前言   今天讲的是结构型设计模式中的最后一个,这个模式也就是代理模式,在前段时间我写的一篇关于正向代理和反向代理的文章。虽说此代理非彼代理。但是代理一词还是具有相似的含义的。这里我们继续使用文章中的代购一个例子来讲述一下代理模式吧,人不方便去购买哪些物品,这时就有一个中间人,他来购买。他代替我去购买。他也就充当了那个代理的职责。我们继续往下看吧。 代理模式介绍 一、来由   在软件系统的开放中,有一些对象存在,但是直接访问会给使用者带来一些麻烦,或者使用起来不那么方便,这是就是需要一个代理对象来...

imherer的博客 267

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

javascript 代理模式(通俗易懂)

所谓的的代理模式就是为一个对象找一个替代对象,以便对原对象进行访问。 使用代理的原因是我们不愿意或者不想对原对象进行直接操作,我们使用代理就是让它帮原对象进行一系列的操作,等这些东西做完后告诉原对象就行了。就像我们生活的那些明星的助理经纪人一样。 我们举一个明星买鞋子的例子。 1.明星自己去买鞋。 // 定义一个鞋子类 var Shoes = function(name){ t

缘自世界 818

VC中sqlite的使用

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

通俗易懂的讲解一下Java的代理模式如何实现

一、代理模式的基本介绍 何为代理模式呢? 就是为对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象,这样做的好处是可以在目标对象实现的基础上,增强额外的功能操作( 在调用这个方法前做前置处理,调用这个方法后 做后置处理。),即扩展对象的功能(类似明星需要经纪人一个道理,比如明星接广告,那么广告上需要和经纪人商量这事,而不是直接和明星去谈这件事)。 二、代理模式的分类及实现 1、静态代理 静态代理在使用的时候,需要定义接口,被代理对象(目标对象)与代理对象一起实现相同的接口。 具体实现:

阿福聊编程 339

通俗易懂的JAVA设计模式之代理模式

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,代理模式就是中介。在不改变源码的情况下,实现对目标对象的功能扩展。 代理模式按照代理创建的时期来分类的话,可以分为静态代理和动态代理。静态代理是程序员创建源代码,再对其变异,在运行之前代理类.class文件就已经被创建了,动态代理是由程序在运行时通过反射机制动态创建的。 静态代理实例 静态代理可以做到在符合开闭原则的情况下...

MaoJ的博客 347

通俗易懂的java设计模式(6)-代理模式

为某个对象提供一个代理对象,通过这个代理对象,可以控制对原对象的访问。通俗的解释:我们电脑桌面上的一个个快接方式,当我们点击这个快捷方式的时候,我们就间接地访问到了这个程序。

qq_28356977的博客 839

C++设计模式之代理模式--通俗易懂

前言 代理模式属于设计模式中的构造型设计模式之一,又叫结构型设计模式,它可以为其它的对象提供一层代理机制,就是要访问其它对象不是直接去访问的,而是统一由代理类负则。你们肯定也听过代理服务器的嘛,比如翻墙,就是提供一层中间机制。 模式的结构 这张图就能很形象的说明结构了: subject(抽象主题角色):真实主题与代理主题的共同接口。 RealSubject(真实主题角色):定义了代理角色所代表的...

Dachao0707的博客 378

通俗易懂的Java设计模式之 --代理模式

代理模式

zmxnn的博客 183

最通俗易懂的代理模式讲解与实现

本文主要介绍常见的两种代理模式即静态代理和动态代理的实现 为什么要使用代理模式 当你需要为方法进行补充以及增加新的参数时但又不能修改接口的时候,比如下面的例子。 接口约定 package task.Agent; public interface People { public void show(); } 接口实现 package task.Agent; public class y...

weixin_43853364的博客 469

最通俗易懂的设计模式 之 静态代理模式

静态代理模式模式 静态代理模式是一个理解起来比较容易的设计模式 文章目录静态代理模式模式一、静态代理角色二、上代码1.以租房子为例1.抽象租客与中介的关系1.抽象租房子接口2.新建房东实现这个租房子接口3.新建代理类模仿中介租房子4.客户实际是面向代理类,也就是中介租房子,但是实际上还是调用房东的方法。2.下面用我们工程中的实例进行进一步的改进1.注意了‘1.抽象增删改2.实现类3.重头戏我想要在中间打log怎么办呢,这时候就需要一个代理类了4.用户直接访问代理类总结 一、静态代理角色 二、上代码

sgy86的博客 264

从零搭建直播高并发环境:架构、缓存与压测实战

高并发是后端架构设计的核心命题,尤其在直播场景中,业务接口、视频流与状态同步三条链路交织,对系统承载能力提出极高要求。从最基础的技术原理出发,可以梳理出一条从服务器初始化、组件选型到缓存设计与异步化改造的完整路径。通过引入Redis扛住热点数据读写,利用RabbitMQ削峰写流量,并以JMeter进行系统性压测验证,能够清晰揭示每一层的分工价值与安全限流策略。区别于零散的知识点,一套可落地的单机高并发环境背景,展示了如何用务实方案支撑数千并发请求,为后端开发者理解高并发系统提供了从理论到实践的完整参考。适用

weixin_34074740的博客 359
上一篇: 工厂模式通俗易懂
下一篇: 单例模式之通俗易懂
沐果果
博客等级 码龄10年 19粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值