04-C#.Net-委托和事件-面试题

【.NET程序员面试题----初级】第一卷 //1.递归算法求30位数字 publicstaticintMyFoun_04(intn) { //一组数值排序如下1、1、2、3、5、8、13、21、34....用递归求30位数字 if(n<=1) { return1; } returnMyFoun_04(n - 1) + MyFoun_04(n - 2); } ... 阅读详情

题 1:委托的本质是什么?请解释委托的底层实现原理。

出题意图
考察候选人对委托的深层理解,是否知道委托不仅仅是语法糖,而是有具体的底层实现。

解答思路

  1. 先说明委托的表面定义
  2. 深入到底层实现(类的本质)
  3. 说明继承关系和关键方法

参考答案

委托的本质是一个类(Class),继承自 System.MulticastDelegate,MulticastDelegate 又继承自 System.Delegate。

当我们定义一个委托时:

public delegate void MyDelegate(int x);

编译器会自动生成一个类,大致等价于:

public sealed class MyDelegate : MulticastDelegate
{
    public MyDelegate(object target, IntPtr method);
    public void Invoke(int x);
    public IAsyncResult BeginInvoke(int x, AsyncCallback callback, object state);
    public void EndInvoke(IAsyncResult result);
}

关键点:

  • 委托是引用类型,存储在堆上
  • 委托实例包含两个重要信息:目标对象(target)和方法指针(method)
  • Invoke 方法用于同步调用
  • BeginInvoke/EndInvoke 用于异步调用(.NET Core 已废弃)
  • 所有委托都是多播委托,可以包含多个方法的调用列表

可以通过 ILSpy 等反编译工具查看委托编译后的真实结构来验证这一点。


题 2:委托和事件有什么区别?为什么要有事件?

出题意图
考察候选人是否理解事件的设计目的,以及事件相对于委托的安全性优势。

解答思路

  1. 说明两者的关系
  2. 列举具体区别
  3. 解释事件存在的必要性

参考答案

关系: 事件是特殊的委托,使用 event 关键字修饰。

主要区别:

特性委托事件
外部赋值可以用 = 直接赋值只能用 += 和 -=
外部调用可以在类外部直接调用只能在类内部调用
子类访问子类可以调用父类的委托子类不能调用父类的事件
安全性较低,容易被误操作较高,受保护
public class Publisher
{
    public Action MyDelegate;      // 委托
    public event Action MyEvent;   // 事件

    public void Trigger()
    {
        MyDelegate?.Invoke();  // 内部可以调用
        MyEvent?.Invoke();     // 内部可以调用
    }
}

Publisher pub = new Publisher();

// 委托的问题
pub.MyDelegate = Handler2;        // 直接赋值,覆盖了之前所有订阅
pub.MyDelegate = null;            // 清空所有订阅
pub.MyDelegate?.Invoke();         // 外部可以随意触发

// 事件的保护
pub.MyEvent += Handler1;          // 只能添加
// pub.MyEvent = null;            // 编译错误
// pub.MyEvent?.Invoke();         // 编译错误

为什么要有事件:

  1. 封装性:防止外部代码随意触发或清空订阅列表
  2. 安全性:避免误操作导致的 bug
  3. 语义明确:事件表达"发布-订阅"的意图更清晰

题 3:什么是多播委托?如何安全地移除委托中的方法?

出题意图
考察候选人对多播委托机制的理解,以及实际使用中的注意事项。

解答思路

  1. 解释多播委托的概念
  2. 说明移除的机制和规则
  3. 重点讲解移除的陷阱

参考答案

所有委托都继承自 MulticastDelegate,因此所有委托都是多播委托。多播委托可以通过 += 注册多个方法,形成一个调用链,执行时按注册顺序依次调用。

移除规则:

  • 使用 -= 操作符移除
  • 从后往前逐个匹配,匹配到第一个后移除并停止
  • 没有匹配到则不做任何操作

移除的陷阱:

Action action = DoSomething;

// 陷阱1:实例方法必须是同一个实例
Student s1 = new Student();
action += s1.Study;
action -= new Student().Study;  // 失败:不是同一个实例

// 陷阱2:Lambda 表达式无法移除
action += () => Console.WriteLine("Hello");
action -= () => Console.WriteLine("Hello");  // 失败:每次生成不同的方法对象

正确的移除方式:

// 保存引用后再移除
Action handler = () => Console.WriteLine("Hello");
action += handler;
action -= handler;  // 成功

// 命名方法直接移除
action += NamedMethod;
action -= NamedMethod;  // 成功

多播委托的异步执行:

// 错误:多播委托不能直接异步调用
// action.BeginInvoke(null, null);  // 运行时异常

// 正确:遍历调用列表,逐个异步执行
foreach (Action handler in action.GetInvocationList())
{
    handler.BeginInvoke(null, null);
}

补充: 多播委托有返回值时,只能获取最后一个方法的返回值。


题 4:请解释观察者模式,并说明委托/事件如何实现观察者模式?

出题意图
考察候选人对设计模式的理解,以及委托/事件在实际设计中的应用。

解答思路

  1. 解释观察者模式的概念和要素
  2. 说明委托/事件实现方式
  3. 对比传统面向对象实现方式的优劣

参考答案

观察者模式(发布-订阅模式): 定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新。

三大要素:

  1. 发布者(Subject):维护订阅者列表,触发事件
  2. 订阅者(Observer):订阅事件,响应通知
  3. 订阅关系:通过 += 建立

委托/事件实现:

public class Cat
{
    public event Action CatMiao;

    public void Miao()
    {
        Console.WriteLine("猫:喵~");
        CatMiao?.Invoke();
    }
}

Cat cat = new Cat();
cat.CatMiao += () => Console.WriteLine("狗:汪汪!");
cat.CatMiao += () => Console.WriteLine("老鼠:快跑!");
cat.Miao();

传统面向对象实现:

public interface IObserver
{
    void Update();
}

public class Cat
{
    private List<IObserver> observers = new List<IObserver>();

    public void Attach(IObserver o) => observers.Add(o);

    public void Miao()
    {
        Console.WriteLine("猫:喵~");
        foreach (var o in observers) o.Update();
    }
}

两种方式对比:

特性传统OOP方式委托/事件方式
代码量多(需要接口和列表管理)少(语言内置支持)
类型约束订阅者必须实现接口任何匹配签名的方法
灵活性较低较高

优势: 猫不需要知道谁在监听,添加新订阅者不需要修改猫的代码,职责单一,耦合低。


题 5:Action 和 Func 有什么区别?为什么 .NET 要提供这两个内置委托?

出题意图
考察候选人对框架设计的理解,以及泛型委托的使用场景。

解答思路

  1. 说明两者的定义和区别
  2. 解释为什么需要内置委托

参考答案

核心区别:

特性ActionFunc
返回值无(void)有(最后一个泛型参数)
参数数量0-16 个0-16 个输入 + 1 个输出
使用场景执行操作、触发事件计算、转换、查询
// Action:执行操作,无返回值
Action greet = () => Console.WriteLine("Hello");
Action<string, int> print = (name, age) => Console.WriteLine($"{name}: {age}");

// Func:有返回值,最后一个泛型参数是返回值类型
Func<int> getNumber = () => 42;
Func<int, int, int> add = (a, b) => a + b;
Func<string, bool> isLong = s => s.Length > 10;

为什么需要内置委托:

  1. 统一类型系统:避免各个库各自定义委托,类型不兼容
  2. 减少类型数量:委托本质是类,自定义委托过多会增加程序集大小
  3. 提高互操作性:LINQ、Task 等框架大量使用 Action/Func,统一后可以直接传递
// LINQ 大量使用 Func
numbers.Where(x => x % 2 == 0);   // Func<int, bool>
numbers.Select(x => x * x);        // Func<int, int>

// Task 使用 Action/Func
Task.Run(() => DoWork());           // Action
Task.Run(() => ComputeResult());    // Func<T>

使用建议: 优先使用 Action/Func,只有当委托有特殊语义时才定义自定义委托(如 EventHandler)。


题 6:委托会导致内存泄漏吗?如何避免?

出题意图
考察候选人对内存管理的理解,以及实际项目中的问题排查能力。

解答思路

  1. 说明委托导致内存泄漏的原理
  2. 举例说明典型场景
  3. 提供解决方案

参考答案

会导致内存泄漏。

原理: 委托/事件会持有订阅者的强引用。如果发布者的生命周期比订阅者长,且订阅者没有取消订阅,订阅者对象将无法被 GC 回收。

典型场景:

public class Publisher
{
    public event Action DataChanged;
}

public class Subscriber
{
    private byte[] largeData = new byte[1024 * 1024 * 10];  // 10MB

    public Subscriber(Publisher publisher)
    {
        publisher.DataChanged += OnDataChanged;  // 订阅,但没有取消
    }

    private void OnDataChanged() { }
}

// 内存泄漏:publisher 是长生命周期对象
Publisher publisher = new Publisher();
for (int i = 0; i < 100; i++)
{
    var sub = new Subscriber(publisher);
    // sub 离开作用域,但无法被 GC 回收
    // 因为 publisher 的事件持有它的引用
}
// 约 1GB 内存无法释放

解决方案:

  1. 实现 IDisposable,在 Dispose 中取消订阅
public class Subscriber : IDisposable
{
    private Publisher _publisher;

    public Subscriber(Publisher publisher)
    {
        _publisher = publisher;
        _publisher.DataChanged += OnDataChanged;
    }

    public void Dispose()
    {
        _publisher.DataChanged -= OnDataChanged;  // 取消订阅
    }

    private void OnDataChanged() { }
}

using (var sub = new Subscriber(publisher))
{
    // 使用完自动 Dispose,取消订阅
}
  1. 使用静态方法(不持有实例引用)
publisher.DataChanged += StaticHandler;  // 静态方法不持有实例引用

最佳实践:

  • 订阅必取消:在对象销毁前必须取消所有事件订阅
  • 避免用匿名方法订阅长生命周期事件(无法取消订阅)
  • 静态事件尤其危险,订阅后几乎不会被 GC 回收

题 7:委托和接口有什么区别?什么时候用委托,什么时候用接口?

出题意图
考察候选人对语言特性的理解和架构设计能力。

解答思路

  1. 说明两者的本质区别
  2. 给出选择建议并举例

参考答案

本质区别:

特性委托接口
本质类型安全的函数指针契约/协议
封装封装单个方法封装一组方法和属性
多播支持不支持
状态通常无状态可以有状态

选择委托的场景:

  • 只需要一个方法(回调、事件通知)
  • 方法无状态(简单策略、过滤条件)
  • 需要多播(一对多通知)
// 委托:简单回调
public void DownloadAsync(string url, Action<string> onComplete)
{
    Task.Run(() => onComplete(Download(url)));
}

// 委托:简单策略(LINQ 风格)
public void Process(Func<int, bool> filter, Action<int> callback)
{
    foreach (var item in data.Where(filter)) callback(item);
}

选择接口的场景:

  • 需要多个相关方法协同工作
  • 需要维护内部状态
  • 需要依赖注入
// 接口:复杂行为,多个方法
public interface IPaymentProcessor
{
    bool ValidateAccount();
    PaymentResult Process(decimal amount);
    void Refund(string transactionId);
}

总结: 委托轻量灵活,适合简单场景;接口结构规范,适合复杂场景。两者不是非此即彼,实际项目中经常混合使用。


题 8:什么是委托的闭包?有哪些常见陷阱?

出题意图
考察候选人对闭包的理解和常见陷阱的认知,这是实际开发中容易踩坑的地方。

解答思路

  1. 解释闭包的概念
  2. 列举常见陷阱并给出解决方案

参考答案

闭包定义: Lambda 表达式或匿名方法可以访问并捕获其外部作用域的变量,即使外部方法已经返回,被捕获的变量依然存活。

public Func<int> CreateCounter()
{
    int count = 0;
    return () => ++count;  // 捕获外部变量 count
}

var counter = CreateCounter();
Console.WriteLine(counter());  // 1
Console.WriteLine(counter());  // 2
Console.WriteLine(counter());  // 3

陷阱1:循环中捕获循环变量(最常见)

// 错误:所有 Lambda 捕获的是同一个变量 i
var actions = new List<Action>();
for (int i = 0; i < 5; i++)
{
    actions.Add(() => Console.WriteLine(i));
}
foreach (var a in actions) a();  // 输出:5 5 5 5 5

// 正确:用局部变量捕获当前值
for (int i = 0; i < 5; i++)
{
    int temp = i;
    actions.Add(() => Console.WriteLine(temp));
}
foreach (var a in actions) a();  // 输出:0 1 2 3 4

陷阱2:捕获的是引用,不是值

int x = 10;
Action action = () => Console.WriteLine(x);
x = 20;
action();  // 输出:20,不是 10

陷阱3:闭包捕获 this 可能导致内存泄漏

public class MyClass
{
    public Action GetAction()
    {
        return () => Console.WriteLine(this.Value);  // 捕获 this
    }
}

// 如果 action 被长生命周期对象持有,MyClass 实例无法被 GC 回收
var action = new MyClass().GetAction();

底层原理: 编译器会将闭包中捕获的变量提升到一个编译器生成的类中,Lambda 表达式变成该类的方法,这就是为什么捕获的是引用而不是值。

最佳实践:

  • 循环中需要捕获当前值时,用局部变量做一次拷贝
  • 注意闭包的生命周期,避免意外延长对象存活时间
  • 需要捕获值语义时,显式拷贝到局部变量

回答技巧

  1. 结构化回答:先说概念,再说原理,最后举例
  2. 对比说明:通过对比突出特点(委托 vs 事件、委托 vs 接口)
  3. 结合实际:联系实际项目经验,说明在哪些场景下用过
  4. 提及注意事项:展示对细节的关注(内存泄漏、闭包陷阱等)
C#每日面试题-委托和事件的区别 在C#面试中,“委托和事件的区别”绝对是高频考点,不少同学能说出“事件是特殊的委托”,但要讲清背后的设计逻辑、使用边界和核心差异,却容易含糊。今天这篇文章,我们从“是什么”到“为什么不同”,再到“实际怎么用”,用最简单的语言把这个知识点讲透,兼顾易懂性和深度。 阅读详情

相关推荐

七境·C#全栈开发资源包

本文档提供了一套完整的C#全栈开发学习资源包,包含1.2GB的源码、文档和电子书。内容按照"七境"学习路径划分,从基础语法到微服务部署,涵盖C#12新特性、ASP.NET Core、EF Core、Blazor/Vue3前端集成、微服务架构及Docker/K8s部署等核心技术。每个阶段配有学习导图、代码示例、实战项目和自测题,适合零基础学习者、转语言开发者及求职者使用。资源包结构清晰,包含10个核心模块,提供从理论到实践的完整学习闭环。

星心源·七境智慧体系创始人。以东方修心为核,AI为翼,构建2300+智能体、72历史人物技能卡、全息网络协议v3.1。专注传统文化谋略典籍的AI化重生与独立文明生态建设。不追浪潮,立山头。万华筒·自在境。 392

面试:1.C#中的委托是什么?事件是一种委托吗?

问题来源:https://blog.csdn.net/qq_33575542/article/details/82805857#%E4%BB%80%E4%B9%88%E6%98%AF%E5%8D%8F%E5%90%8C%E7%A8%8B%E5%BA%8F%EF%BC%9F   1.C#中的委托是什么?事件是一种委托吗? 1.1什么是委托 委托是一种定义方法签名的类型 、 委托是一种在对象...

qq_35422344的博客 4151

DFRobot MGC3130电容式手势传感器库深度解析

电容式近场感应(Electric Near Field Sensing)是一种非接触、抗干扰的三维空间感知技术,其原理基于人体介电特性对高频电场的扰动响应,具备低功耗、高鲁棒性与零物理接触等核心优势。该技术广泛应用于医疗人机交互、工业HMI、智能家电等对可靠性与环境适应性要求严苛的嵌入式场景。DFRobot_MGC3130库正是面向Microchip MGC3130芯片的工程化实现,封装了I²C驱动、ASU硬件加速调度及多层抽象API,支持手势识别、触控检测与接近唤醒等功能动态切换。结合电容式近场感应与嵌入

weixin_34620658的博客 547

.NET面试题系列(十)委托与事件

委托 有了委托的存在,使得方法可以作为参数传递给另一个方法。 int Max(int x,int y) { return x>y?x:y; } int Min(int x,int y) { return x<y?x:y; } 上面两个函数的共同特点:具有相同的返回值和参数列表。在C++里,我们使用函数指针来指代(被授权,代表)这两个函...

weixin_30401605的博客 1355

GLDAS数据高效处理指南:基于Matlab的NC4转GeoTIFF实战解析

本文提供了一份基于Matlab的GLDAS数据处理实战指南,详细解析了如何将NetCDF4格式的GLDAS数据高效、准确地批量转换为GIS友好的GeoTIFF格式。文章核心内容包括数据理解、环境搭建、核心代码逐步拆解、效率提升技巧以及常见避坑方案,旨在帮助全球生态、水文与气候领域的研究者打通数据预处理的关键环节,提升科研工作效率。

weixin_29094775的博客 310

基于Codex/Claude Code的学术技能包:13个Skill实现科研全流程自动化

写论文最头疼的是什么?是面对海量文献无从下手,还是实验数据一团乱麻,或者是好不容易有了结果,却卡在写作和格式调整上?如果你也经历过从选题到投稿的完整科研周期,就会明白每个环节都可能消耗大量时间精力。今天要分享的这套工具链,正是为了解决这些痛点而生——基于 Codex 和 Claude Code 平台的学术技能包(Academic Skills),它通过 13 个精心设计的 Skill,将一篇论文从 0 到 1 的全流程自动化、标准化,让你能更专注于研究本身。 这套技能包并非单一工具,而是一个覆盖文献阅读、数

weixin_33979203的博客 541

面试问题 ---C#中的委托

一、C#委托是什么的? 在正式介绍委托之前,我想下看看生活中委托的例子——生活中,如果如果我们需要打官司,在法庭上是由律师为我们辩护的,然而律师真真执行的是当事人的陈词,这时候律师就是一个委托对象,当事人委托律师这个对象去帮自己辩护。这就是我们生活中委托的例子的。然而C#中委托的概念也就好比律师对象(从中可以得出委托是一个类,,因为只有类才有对象的概念,从而也体现了C#是面向对象的语言)。...

weixin_30339457的博客 657

在Ultralytics YOLO中添加/更换模块详细指南

使用参数继承 my_module_args: &my_args [64, 3, 0.5] # 定义参数模板 backbone: - [-1, 1, MyModule, *my_args] # 引用参数。

MR_Colorful的博客 2583

【C#基础 /.net core 高频面试题】

前阵子人事安排了好几个人过来技术面,每次都要花费不少时间结合面试者简历筛选面试题,特此博主花了点时间整理了.net C# 比较基础且重要的技术栈面试题。非常适合应届毕业生或者想转行.net的同学,想拿高薪的行业大牛可以直接跳过。ps:以下部分问题的回答可能相对概述,是结合我公司实际想考察的重点来写的,如果觉得不够详细可以自行百度。

素弦的博客 1071

Android AVB 分析(十二)嵌入式设备安全中的 dm-verity 简介

上一篇 《Android AVB 分析(十一)bootloader 是如何进行 verify boot 检查的?》 分析了 bootloader 中是如何调用 libavb 函数库验证 vbmeta 和 boot 等分区的。接下来就打算写一篇介绍 dm-verity 原理的文章,然后再写一篇徒手 dm-verity 实践的文章,结果偶然发现了本篇的英文原版。写得太好,我觉得自己完全没有必要再写原理了。由于原文是英文,有些英语不太好的朋友不一定能完全理解。我花了点时间,结合 AI 将英语原文翻译成中文。

洛奇看世界 3595

电路设计仿真软件:Mentor Graphics_(11).MentorGraphics软件操作与技巧

/ 定义自定义仿真命令// 加载设计文件// 运行仿真// 主函数return 1;return 0;// 自定义设计检查// 获取设计中的所有模块// 遍历所有模块// 检查模块名称是否符合规范if (!// 检查模块中的所有引脚if (!// 主函数main() {通过本节的学习,您应该已经掌握了如何在 Mentor Graphics 中进行二次开发,包括使用 Tcl、C++ 和 Python 进行基本和高级操作。

kkchenjj的博客 1636

130道ASP.NET面试题

1. 简述 private、 protected、 public、 internal 修饰符的访问权限。ITPUB个人空间| ~Ue!Mxa}答 . private : 私有成员, 在类的内部才可以访问。"]7_r6jf0protected : 保护成员,该类内部和继承类中可以访问。ITPUB个人空间X fU0Mzo0QZLpublic : 公共成员,完全公开,没有访问限制。M5I"h2I8`g...

u014712365的博客 6万+

【软考高级系统架构论文】论微服务架构及其应用

本文围绕“论微服务架构及其应用”展开论述。首先概要介绍了本人参与的某公司线上电子商务平台项目,在其中担任系统架构设计师。接着分析了微服务架构相较于单块架构的特点,如模块化与组件化、技术栈多样性、独立部署与扩展、高度容错与可用性等。最后结合项目阐述了软件架构对微服务模式的采用情况,以及实施过程中遇到的问题及解决方案,如服务划分粒度、数据一致性、监控与故障排查等问题,并给出了相应解决办法。

qq837993702的博客 225

分享最近.Net面试题目

dotnet面试,之前遇到的几道相关面试题目》》》

dotNet全栈开发 7418

MuJoCo Playground 机器人强化学习入门教程(一)

MuJoCo Playground 包含 DM 控制套件、机器人运动和机器人操作环境。env每个环境还与一个环境配置相关联,如果需要,可以覆盖该配置。env_cfg请注意,环境配置包含 sim_dt 和 ctrl_dt。ctrl_dt 决定每个 env.step 的时间间隔。因此,每个 env.step 的模拟步长为 ctrl_dt / sim_dt 倍。其他值得注意的参数还有 vision_config,我们将在基于视觉的笔记本中详细讨论!现在,我们将专注于特权观察。

2506_90492529的博客 4614

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Note: 常见.NET技术面试题

C# 什么是委托?委托和事件是什么关系? 什么是反射? C#中是否可以从多个类中继承?如何实现多重继承? 什么是密封类? using关键字有几种用途? #warning和#error分别的用途是什么? string和StringBuilder有什么区别? const和readonly的区别? new、virtual、abstract、override、sealed的...

weixin_30917213的博客 73

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

每日一道面试题(后台)

#每日一道面试题# 开篇: 从今天开始,每日一道面试题,帮助群里的小伙伴们进行面试题辅导提高,还请大家踊跃回复参与其中,针对人群:中级及高级开发人员,同时欢迎大神给与点评或板砖 为了表现的我分两篇介绍,分别为偏前端,后端,注意只是偏向不同 每日一道面试题(前端) 每日一道面试题(后台) 开始之前我先申明一下: 所有面试题的答案均不是唯一的,所有题目的答案都是仁者见智的回答,如果自己以...

weixin_30466953的博客 332

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ASP.Net面试题之二

ASP.Net面试题之.NET基础部分 1. 什么是装箱和拆箱? 2. 什么是重载? 3. 值类型和引用类型的区别? 4. 如何理解委托? 5. 了解程序集强签名吗? 6. C#种接口和类有什么区别? 7. 请解释应用程序域、程序集、元数据、反射这几个技术名词 ASP.Net面试题之ASP.NET部分 1. 是否了解 URL Rewrite?请简要说明...

weixin_30246221的博客 214

C#/.NET开发者系统学习指南:从语言基础到架构实战

C#作为面向对象的编程语言,其核心在于类型安全、内存管理和丰富的语法特性,为构建企业级应用提供了坚实基础。在.NET平台上,通过公共语言运行时(CLR)实现跨语言互操作和自动内存管理,结合ASP.NET Core等框架,开发者能够高效构建高性能的Web服务。掌握C#异步编程、LINQ查询和依赖注入等技术,不仅能提升代码的可维护性和性能,还能应对微服务、云原生等现代架构需求。本文聚焦于一套整合了C#语言核心、.NET平台框架、Web开发实战及架构设计模式的系统性学习资料,通过涵盖Entity Framewor

weixin_30292843的博客 385

C#.NET基础笔试题 架构 优化 性能提升 2024 金九银十 最新 资深 八股文

58.什么是反射? 59.ORM中的延迟加载与直接加载有什么异同? 60.简述Func与Action的区别? 61.23种设计模式分别叫什么名称,如何分类? 62.数组和集合的区别 63.向对象的三大特征是什么?/面向过程和面向对象的区别 64.C#中,is和as有什么区别? 65.列举ASP.NET页面之间传递值的几种方式 66.C#中,数组和集合有什么区别? 67.C#中,如何对文件进行创建、读取、写入和删除等操作?会用到什么类,什么方法? 68.C#中,文件夹创建、读取和删除用到什么类,什么方法? 6

cao919的专栏Net 624

[转载]:C#、.Net面试题目及答案

http://blog.csdn.net/julilet/article/details/3700926C#、.Net面试题目及答案2009-01-04 09:11669人阅读评论(0)收藏举报本文集中了多条常见的 C#、.Net经典面试题目例如“.NET中类和结构的区别”、“ASP.NET页面之间传递值的几种方式?”,并简明扼要的给出了答案,希望能对学习C#、.Net的读者有所帮助。...

weixin_30588827的博客 108
上一篇: 04-C#.Net-委托和事件-学习笔记
下一篇: 05-C#.Net-Lambda与LINQ-学习笔记
似水明俊德
博客等级 码龄8年 247粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值