Dagger1依赖注入

Dagger2实现原理分析 Dagger是一个依赖注入框架,这个框架往往给人一种“高端,但是却很难用“的感觉。我们在使用或者阅读别人的项目时,往往会陷入dagger搭建的”迷宫里”绕不出来。导致Dagger被认为是android史上”最受冷落的优质库”。本文先通过理清依赖注入的概念,然后详细介绍Dagger一些常见的使用场景和注意事项,最后介绍一下Dagger主要功能实现的原理。帮助大家进行理解。 阅读详情


dagger官方文档
dagger1 git

1.概述

依赖注入(Dependency Injection)具体含义是:

当某个角色(一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在依赖注入器中,创建被调用者的工作不再由调用者来完成(控制反转)
Dagger作为工厂类的替代品,声明依赖、指定如何满足依赖、主导应用程序。基于JSR-330,方便每个类测试。依赖注入不仅仅用于测试,还便于创建可重用、可替换的模块。可在所有应用程序中共享相同的AuthenticationModule(验证模块),可在开发期间运行DevLoggingModule(开发者登录模块),并在生产环境中运行ProdLoggingModule(用户登录模块),以在每种场景下获得正确的行为

2.DECLARING DEPENDENCIES(声明依赖)

使用 javax.inject.Inject 注解来识别构造函数和属性:
(1)使用@Inject注解类的构造函数,当依赖注入构建实例时,Dagger会获得所需的参数值并调用此构造函数

import javax.inject.Inject;

class Thermosiphon implements Pump {
  private final Heater heater;

  @Inject
  Thermosiphon(Heater heater) {
    this.heater = heater;
  }

  @Override public void pump() {
    if (heater.isHot()) {
      System.out.println("=> => pumping => =>");
    }
  }
}

(2)Dagger直接注入属性:

import dagger.Lazy;
import javax.inject.Inject;

class CoffeeMaker {
  @Inject Lazy<Heater> heater; 
  @Inject Pump pump;

  public void brew() {
    heater.get().on();
    pump.pump();
    System.out.println(" [_]P coffee! [_]P ");
    heater.get().off();
  }
}

若类中有@Inject注解在属性上,但没有构造函数使用@Inject注解,Dagger会使用无参数构造函数(存在无参构造函数)。

Dagger不支持方法注入。

3.满足依赖关系(SATISFYING DEPENDENCIES)

默认情况下,Dagger通过构造符合类型的实例来满足每个依赖。
当请求注入一个CoffeeMaker时,通过调用new CoffeeMaker()并设置可注入的属性。
@Inject并不适用于所有地方:
接口不能被构造;
第三方类不能被注解;
必须配置可配置对象。

对于不适用@Inject的情况,使用@ Provides注解方法来满足依赖。方法的返回类型定义了它所满足的依赖项。
在任何需要Heater的时候,调用provideHeater()方法
在这里插入图片描述

@Provides注解的方法可能有自己的依赖。当需要Pump 时,返回Thermosiphon :
在这里插入图片描述
所有@Provides注解的方法必须在一个模块中,有@Module标准的类
在这里插入图片描述
按照惯例,@Provides注解的方法方法名使用前缀provide,而模块类的类名使用后缀Module。

4.建图(BUILDING THE GRAPH)

@Inject和@ Provides注释的类形成了一张通过依赖连接的对象图。通过调用ObjectGraph.create()获得此图,该函数接受一个或多个模块作为参数:
在这里插入图片描述
为了使用图,需要引导注入。这通常需要注入命令行app的主类。在示例中,使用CoffeeApp类用于启动依赖注入。要求图提供一个类的注入实例:

import javax.inject.Inject;

import dagger.ObjectGraph;

public class CoffeeApp implements Runnable {
  @Inject CoffeeMaker coffeeMaker;

  @Override public void run() {
    coffeeMaker.brew();
  }

  public static void main(String[] args) {
    ObjectGraph objectGraph = ObjectGraph.create(new DripCoffeeModule());
    CoffeeApp coffeeApp = objectGraph.get(CoffeeApp.class);
    coffeeApp.run();
  }
}

唯一缺少的是可注入类CoffeeApp不为图所知,需要显式地在@Module注解中将它注册为可注入类型。
在这里插入图片描述
这些injects允许在编译时验证整张图。尽早发现问题加快开发速度,并减少重构带来的危险。
现在已经构建了图并注入了根对象,运行coffee maker应用程序。

5.单例(SINGLETONS)

用@Singleton注解 带@ Provides的方法或可注入类。对象图将为所有使用者使用单例。
在这里插入图片描述
注入类上的@Singleton注释可作为说明文档使用,提醒维护者人员,这可能由多线程共享。

6.懒加载(LAZY INJECTIONS)

有时需要在使用时实例化对象。对于任何绑定类型T,可创建 Lazy,延迟实例化直到第一次调用Lazy的get()方法。如果T单例,那么Lazy为ObjectGraph范围内所有注解注入的同一实例。否则,每个注入点将获得其特有的Lazy实例。

class GridingCoffeeMaker {
  @Inject Lazy<Grinder> lazyGrinder;

  public void brew() {
    while (needsGrinding()) {
      // Grinder created once on first call to .get() and cached.
      lazyGrinder.get().grind();
    }
  }
}

7.PROVIDER INJECTIONS

有时需要返回多个实例,而不是只注入一个值。存在多种方法(工厂模式、构造模式),其中一个方法是注入一个Provider。Provider每次调用.get()方法时,创建一个新的T类型实例。

注意:注入Provider可能产生混乱的代码,在对象图中产生作用域错误或结构错误的对象。通常,使用Factory或Lazy或者重新组织代码的生命周期和结构,以便注入T。但是,在某些情况下使用Provider.如,servlet在设计上是单例的,仅在请求特定数据的上下文中有效。

8.限定符(QUALIFIERS)

有时类型不足以识别依赖,需要添加了一个限定符注解。任何使用@Qualifier的注解均属于限定符注解。例如@Named(javax.inject的内置限定符注解)
在这里插入图片描述
可创建自己的限定符注释,或者使用@Named注解。通过注解所需的属性或参数来运用限定符。类型和限定符注释都将用于识别依赖。

class ExpensiveCoffeeMaker {
  @Inject @Named("water") Heater waterHeater;
  @Inject @Named("hot plate") Heater hotPlateHeater;
}

通过搭配@ Provide注解方法来提供限定值。

@Provides @Named("hot plate") Heater provideHotPlateHeater() {
  return new ElectricHeater(70);
}

@Provides @Named("water") Heater provideWaterHeater() {
  return new ElectricHeater(93);
}

9.静态注入(STATIC INJECTION)

警告:这个特性谨慎使用,静态依赖关系难以测试和重用。
Dagger可以注入静态属性,使用@Inject注解声明静态属性的类必须列在模块的staticInjections 中。

@Module(
    staticInjections = LegacyCoffeeUtils.class
)
class LegacyModule {
}

使用ObjectGraph.injectStatics()方法给静态属性填值

ObjectGraph objectGraph = ObjectGraph.create(new LegacyModule());
objectGraph.injectStatics();

注意:静态注入只对直接图中的模块起作用。如果在调用plus()调用图的injectStatics(),则不会执行对扩展图中的模块的静态注入。

10.编译时验证 (COMPILE-TIME VALIDATION)

Dagger包括一个验证模块和注入的注解处理器。此处理器是严格的,如果任何绑定无效或不完整,将导致编译器错误。例如,此模块缺少Executor的绑定:

@Module
class DripCoffeeModule {
  @Provides Heater provideHeater(Executor executor) {
    return new CpuHeater(executor);
  }
}

当编译时,javac拒绝缺少的绑定:
在这里插入图片描述
通过为Executor添加一个@Provides注解的方法或将模块标记为不完整来修复此问题。不完整的模块允许有缺失的依赖。

@Module(complete = false)
class DripCoffeeModule {
  @Provides Heater provideHeater(Executor executor) {
    return new CpuHeater(executor);
  }
}

列出的注入类型未使用的模块会触发错误。

@Module(injects = Example.class)
class DripCoffeeModule {
  @Provides Heater provideHeater() {
    return new ElectricHeater();
  }
  @Provides Chiller provideChiller() {
    return new ElectricChiller();
  }
}

因为在模块中注入Example 只使用Heater,所以javac拒绝没有使用的绑定:

[ERROR] COMPILATION ERROR:
[ERROR]: Graph validation failed: You have these unused @Provider methods:
      1. coffee.DripCoffeeModule.provideChiller()
      Set library=true in your module to disable this check.

如果模块绑定将在列出的注入对象之外使用,那么将模块标记为库。

@Module(
  injects = Example.class,
  library = true
)
class DripCoffeeModule {
  @Provides Heater provideHeater() {
    return new ElectricHeater();
  }
  @Provides Chiller provideChiller() {
    return new ElectricChiller();
  }
}

充分利用编译时验证,创建一个包含所有应用程序模块的模块。注解处理器将跨模块检测问题并报告。

@Module(
    includes = {
        DripCoffeeModule.class,
        ExecutorModule.class
    }
)
public class CoffeeAppModule {
}

在编译类路径中包含Dagger的jar文件时,将自动启用注解处理器。

11.编译时代码生成(COMPILE-TIME CODE GENERATION)

编译时代码生成Dagger的注解处理器也可以生成名为CoffeeMaker I n j e c t A d a p t e r . j a v a 或 D r i p C o f f e e M o d u l e InjectAdapter.java或DripCoffeeModule InjectAdapter.java或DripCoffeeModuleModuleAdapter的源文件。这些文件是Dagger实现细节。

12.模块重写(MODULE OVERRIDES)

如果对于同一依赖有多个相互矛盾的@Provides方法,Dagger注入失败并出现错误。但是有时有必要用开发或测试的替代品来替代生产代码。在模块注解中使用overrides = true允许优先于其他模块的绑定。

public class CoffeeMakerTest {
  @Inject CoffeeMaker coffeeMaker;
  @Inject Heater heater;

  @Before public void setUp() {
    ObjectGraph.create(new TestModule()).inject(this);
  }

  @Module(
      includes = DripCoffeeModule.class,
      injects = CoffeeMakerTest.class,
      overrides = true
  )
  static class TestModule {
    @Provides @Singleton Heater provideHeater() {
      return Mockito.mock(Heater.class);
    }
  }

  @Test public void testHeaterIsTurnedOnAndThenOff() {
    Mockito.when(heater.isHot()).thenReturn(true);
    coffeeMaker.brew();
    Mockito.verify(heater, Mockito.times(1)).on();
    Mockito.verify(heater, Mockito.times(1)).off();
  }
}

覆盖最适合应用程序的小变化:
用单元测试的模拟代替实际实现。
在开发中使用伪身份验证替换LDAP身份验证。

dagger-lazy-cycle:dagger2 中使用 Lazy 支持循环依赖的提案 匕首懒惰循环 dagger2 中使用Lazy或Provider支持循环依赖的建议 Dagger 2.0 目前不支持任何类型的依赖循环。 Dagger 1 允许使用Lazy<T>或Provider<T>依赖包装器。 这里开始了一个问题: : 我已经开始使用在上述问题中发现的示例代码来展示问题。 我复制了 dagger 生成的代码,检查了生成的代码并对其进行了更改,并找到了一种在生成的代码中使用Lazy启用依赖项循环的方法。 基本上Provider<Lazy>>被传递给Bar_MembersInjector而不是Provider<Foo> 。 当Bar.lazyFoo.get()时,组件的fooProvider已初始化。 主要变化可以在这个提交中看到: : 类似的方法可能可用于Provider<T>依赖项。 立即下载

相关推荐

Blender学习笔记——制作向量场

#下载Blender - UE4 - FGA Vector Field Editor插件的压缩包,Github上的下载地址如下:https://github.com/isathar/Blender_UE4_VectorFieldEditor #下载并解压后将FGA VectorFields文件夹复制到C:\Program Files\Blender Foundation\Blender 2.83\2.83\scripts\addons目录下,此步骤可根据blender安装的位置自行调整,只要放入addon

wychao2020的博客 1723

学习Dagger2笔记:【6】Provider & Lazy

再看@Component 我们之前使用@Component都仅仅是在其注解的接口中添加一个inject方法,作为进行依赖注入的入口,但@Component的作用远不止如此 新需求 为了深入研究@Component,我们新增两个需求 需求1 在Activity显示Computer信息时,我们要求根据当前时间(System.currentTimeMillis())单双作为区别,如果单数就显示wind...

Cmd的笔记本 1035

用MATLAB从零实现六足机器人步态仿真:交替三角与波动步态保姆级教程

本文详细介绍了如何使用MATLAB从零实现六足机器人的两种经典步态仿真:交替三角支撑步态和波动步态。通过参数定义、相位设置、运动轨迹生成和三维可视化等步骤,帮助读者掌握六足机器人步态规划的核心技术。教程包含完整代码和详细解析,适合机器人爱好者和相关专业学生学习实践。

weixin_26765363的博客 225

这可能是本年度最好用的 Dagger 使用教程 三(依赖注入器的依赖、子组件、Lazy、Provider)

在上一个文章中,我们介绍了 Dagger 中的限定和范围注解,现在我们将视线转移到依赖注入器来,先介绍这个组件的依赖的两种方式,再介绍两个常用的类型。

李斯维的博客空间 2578

国产麒麟系统PXE安装-UEFI引导

注意: 适用uefi引导 适用x86_64架构 一键部署脚本扣我 1.上传ISO到PXE服务器,拷贝ISO文件 # mkdir /kylin_iso # mount -o loop Kylin-Server-10-SP1-Release-Build04-20200711-x86_64.iso /kylin_iso/ 2.配置http,获取安装源 # yum -y install httpd # mkdir /var/www/html/{ks,kylin} # 注意一定是"/kylin_iso/

河静 5053

汽车BMS技术分享及其HIL测试方案

在全球碳中和目标的战略驱动下,新能源汽车产业正以指数级速度重塑交通出行格局。动力电池作为电动汽车的"心脏",其性能与安全性不仅直接决定了车辆的续航里程、使用寿命等关键指标,更深刻影响着消费者对电动汽车的市场接受度。而电池管理系统(Battery Management System, BMS)是动力电池安全运行与性能释放的核心技术支撑。

Speedgoat的博客 2682

Dagger 2 完全解析(二),进阶使用 Lazy、Qualifier、Scope 等

Dagger 2 完全解析系列:Dagger 2 完全解析(一),Dagger 2 的基本使用与原理Dagger 2 完全解析(二),进阶使用 Lazy、Qualifier、Scope 等Dagger 2 完全解析(三),Component 的组织关系与 SubComponentDagger 2 完全解析(四),Android 中使用 Dagger 2Dagger 2 完全解析(五),Kotlin...

晨光飞舞的专栏 1090

YOLO26改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLO26-T !!! 最新的发文热点

模块是模型中的一个重要组成部分,其主要作用是在模型的初始阶段对输入图像进行处理,方便后续的特征提取和目标检测。以下是对。

Limiiiing的博客 900

依赖注入框架Dagger2—1.入门

1.依赖注入 1.1.什么是依赖? 如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。 例如下面类 A 中用到一个 B 对象,我们就说类 A 对类 B 有一个依赖。 同时,这也是一个典型的&amp;amp;amp;amp;amp;amp;amp;quot;依赖非注入&amp;amp;amp;amp;amp;amp;amp;quot;案例。 public class A { ... B b; .

点滴积累 545

Ego Planner规划算法(下)——Ego Planner程序框架

本系列文章用于学习记录Ego-Planner规划算法的相关内容,本系列文章是在在Fast Planner规划算法系列文章的基础上,展开对Ego Planner的相关介绍,主要包括Ego Planner算法流程和程序框架两部分,主要学习资料是深蓝学院的移动机器人运动规划课程

慕羽★的博客 7256

【AI智能体】Claude Code 高级编程技巧实战项目详解

Claude Code 高级编程技巧实战项目详解

congge 1万+

将基于Dagger-1开发的项目迁移到Dagger-2中

原文链接 : Dagger 1 to 2 migration process 原文作者 : Miroslaw Stanek 译文出自 : 开发技术前线 www.devtf.cn 译者 : chaossss 校对者: tiiime 状态 : 完成 我相信每一个 Android 开发者都听说过依赖注入框架,事实上几乎所有 Android 官方会议都讨论过软件设计模式。虽然

追风筝的吃货,汪~ 1502

麒麟操作系统安装教程(保姆级)

本文介绍了如何在VM中安装麒麟操作系统,文章详细的介绍了麒麟操作系统按钻过步骤。

啊渊的专栏 1万+

Android快速依赖注入框架Dagger2使用1

一、啥是Dagger2前面的概念可能开始看不懂,给点耐心,看到例子就懂了。 本篇文章需要注解方面的知识,不了解的可以先看:http://blog.csdn.net/niubitianping/article/details/601451281.1 简介Dagger2是一个Android/Java平台上快速依赖注入框架,由谷歌开发,最早的版本Dagger1 由Square公司开发。依赖注入框架主要用于

KeepStudy 6074

计算机控制技术及应用

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Evo-RL代码架构深度剖析:Actor-Learner架构与gRPC通信机制源码之旅

Evo-RL 是一个面向真实机器人(SO-101 与 AgileX PiPER)的开源**离线强化学习(offline RL)框架**,基于 LeRobot 0.4.4 构建。它的核心设计是把"操控真机的执行端"(Actor)与"训练策略的学习端"(Learner)拆成两个独立进程,两者之间用 **gRPC** 流式通信交换经验数据与网络参数。本文将带你用"源码地图 + 关键路径"的方式,一次看懂

gitblog_01090的博客 91

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android依赖注入: Dagger (Part 1)

Android依赖注入: Dagger (Part 1)在这篇文章中我将会解释什么是依赖注入,它的主要目的是什么,如何在Android项目中通过Dagger来完成依赖注入,Dagger是我认为Android中最好的依赖注入实现.这篇文章将会接着我上一篇关于Android MVP的文章,因为我知道你们很想看到在相同的项目中实现依赖注入,我相信他们能够很好地达到目的.这第一部分将会讲一些基础知识.知道依

itjinks的专栏 750

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

依赖注入Dagger2详解

为什么使用依赖注入首先我们需要知道,人们在很长的一段时间里都是利用控制反转原则规定:应用程序的流程取决于在程序运行时对象图的建立。通过抽象定义的对象交互可以实现这样的动态流程。而使用依赖注入技术或者服务定位器便可以完成运行时绑定。使用依赖注入可以带来以下好处: 依赖的注入和配置独立于组件之外。 因为对象是在一个独立、不耦合的地方初始化,所以当注入抽象方法的时候,我们只需要修改对象的实现方法,而不用大

JackChan 2532

Dagger 1:Java和Android依赖注入框架的起源与核心概念

Dagger 1是Square公司于2012年开源的编译时依赖注入框架,代表了当时Java和Android平台依赖注入技术的最高成就。它通过编译时代码生成技术彻底避免了传统反射式依赖注入框架的性能问题,为现代DI框架的发展奠定了坚实基础。Dagger 1引入了@Inject、@Module、@Provides等核心注解体系,以及ObjectGraph依赖图管理机制,为开发者提供了高性能、可测试的依...

gitblog_00739的博客 757

Dagger1迁移Dagger2指南

原文地址:https://google.github.io/dagger/dagger-1-migration.htmlDagger 1是由squre开发,而Dagger2是Dagger1的分支,由谷歌公司接手开发,目前的版本是2.10。虽然Dagger 1和Dagge 2在许多方面是相似的,但一个不是另一个的替代。在由Dagger 1向Dagger 2迁移时,由于两种版本之间的API和概念差异,还

行云间 1270

从0到1:Android-PickerView与Dagger依赖注入的无缝集成方案

你是否还在Activity中用`new TimePickerBuilder(this, listener).build()`创建选择器?这种写法正在拖慢你的开发效率: - **紧耦合灾难**:选择器创建逻辑与UI代码混杂,500行的Activity中嵌套300行Picker初始化代码 - **测试噩梦**:直接new对象导致单元测试无法Mock,关键业务逻辑难以覆盖 - **配置蔓延**:主题样...

gitblog_00463的博客 370

在Eclipse中搭建Dagger和Dagger2使用环境

目前Dagger有两个版本,一个是square的Dagger1.x,另外一个是由google主导与squre联合开发的Dagger2。本文介绍一下在Eclipse中搭建Dagger和Dagger2使用环境。例子采用的均为Dagger和Dagger2官方提供的 “咖啡”案例(Dagger1.x的案例位置在example/simple文件夹下,Dagger2的案例位置在example/simple文件

piglite的专栏 2717

Dagger2 入门详解(一)

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/53695558 文章出自:薛瑄的博客Dagger2 系列:Dagger2 入门详解(一)@Scope 看这一篇就够了——Dagger2 (二)一、Dagger2介绍1. Dagger2是什么?Dagger2在Github主页上的自我介绍是:“A fast dependency i

薛瑄的博客 2902

国产FPGA替代Xilinx Artix-7:SDR硬件迁移实战指南

FPGA是软件无线电(SDR)系统中实现确定性数据通路、实时基带处理与高速接口桥接的核心器件。其关键能力包括LVDS接收器时钟恢复、DSP加速、多电压IO Bank隔离及低相位噪声PLL等,直接决定QPSK解调精度、FFT实时性与ADC/DAC同步稳定性。在国产化替代进程中,‘封装兼容+时序可映射+协议栈可对齐’构成技术可行性三角,而真正落地难点在于开发工具链迁移、IP核参数重标定与PCB隐性适配。本文聚焦XC7A75T/100T级国产FPGA替代实践,覆盖HAL抽象、约束重构、LVDS/DDR3/PCIe

weixin_33795806的博客 409

Dagger - 快速依赖注入器(for android and java) (1)

引言 在程序中, 最重要的类是那些真正实现功能的类:比如BarcodeDecoder(条形码解码器), KoopaPhysicsEngine(某某引擎), AudioStreamer(音频流)。这些类往往有些依赖类, 比如BarcodeCameraFinder(条形码图形识别器), DefaultPhysicsEngine(默认物理引擎), 和 HttpStreamer(http输出

580

android 注入框架对比,依赖注入框架性能对比

依赖注入(DI)技术在安卓开发领域已经非常流行了。DI可以减少重复代码的编写,更便于调试和测试,使得开发出优秀的APP更加简单。尽管各种DI框架看着都非常强大,但也需要非常注意它们对APP性能带来的开销。本文中我们对比了三个最流行的DI框架,来帮助开发者了解它们各自的优劣。我们比较的是以下三个DI框架:Roboguice和Dagger的工作原理有所差异,Roboguice在运行时利用反射进行依赖注...

weixin_42395980的博客 609

Dagger2.1不是Dagger2

一、前言 在学习android architecture components(简称acc)时下载了google官方demo,demo里有一部分是关于dagger+mvvm(mvp)+acc的,本以为阅读起来没有压力但结果却是一脸懵逼,是的,dagger的写法以及注解完全陌生。难道dagger更新了?本着落后就要挨打的原则去google了一番,发现国内资料通篇都是dagger原本的用法,并没有找...

verymrq的博客 793
上一篇: Jersey
下一篇: zookeeper 概念与应用 内部原理
但行益事莫问前程
但行益事莫问前程 新星创作者: 数据库技术领域 新星创作者: 数据库技术领域
博客等级 码龄7年 8490粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值