在 .NET Framework 中表示 XML 的最佳做法! (不错,摘自MSDN)

在.NET Framework中高效处理XML数据 C# 在.NET Framework中,我们可以轻松地处理XML数据,并对其进行解析、创建和修改。通过以上示例,我们可以看到在.NET Framework中处理XML数据是相当简单和灵活的。我们可以使用提供的类和方法来解析、创建、修改和查询XML数据。希望本文能帮助您理解在.NET Framework中高效处理XML数据的基本概念和技术。要创建和修改XML数据,我们可以使用XmlDocument和XmlNode类的方法和属性。要查询和筛选XML数据,我们可以使用XPath表达式或LINQ to XML。 阅读详情

在 .NET Framework 中表示 XML 的最佳做法

发布日期: 8/25/2004 | 更新日期: 8/25/2004

Dare Obasanjo

Microsoft Corporation

摘要:Dare Obasanjo 着眼于可用来表示在单个进程和 AppDomain 内的组件之间共享的、基于 XML 的数据的选项,并讨论了每种方法在设计上的利弊。

引言

在最近的一次设计审查之后,一名职位是项目经理的同事询问在 API 中公开 XML 时是否存在设计准则,因为他曾经看到过许多不同的方法,但是无法确定该选择何种方法。我告诉他,我原来相信在 MSDN 上可以找到一些准则,但是当我查阅时却只找到一段标题为 Passing XML Data Inside the CLR(英文)的 MSDN TV,其中虽然包含此类信息,但却不容易阅读。因此我萌发了这样一个念头,即为 Don Box 的 MSDN TV 片段提供一个便于打印的版本,并提供我本人在 Microsoft 处理 XML API 方面的一些经验。

准则初探

在三种主要情况下,开发人员需要考虑使用何种 API 来表示 XML。下面简要介绍一下这些情况和准则:

•

类的字段或属性中包含 XML:如果类的字段或属性是 XML 文档或片段,则该类应提供将其属性同时作为字符串和 XmlReader 进行操作的机制。

•

方法可以接受 XML 输入或返回 XML 作为输出:可以接受或返回 XML 的方法应有助于返回 XmlReader 或 XPathNavigator,除非用户希望能够编辑 XML 数据(此时应使用 XmlDocument)。

•

将对象转换成 XML:如果对象出于序列化目的要以 XML 来表示其自身,当其需要获得的 XML 序列化进程控制比 XmlSerializer 所提供的更多时,则应使用 XmlWriter。如果对象要以 XML 来表示其自身,以便能够完全以 XML 世界成员的身份参与到其中(如允许在此对象上进行 XPath 查询或 XSLT 转换),则此对象应实现 IXPathNavigable 接口。

在下面各部分中,我详细介绍了上面提到的几种情况,并解释了我是如何获得这些准则的。

常见疑点

当您决定使用方法或属性接受或返回 XML 时,您的大脑中会出现 .NET Framework 中的许多类,它们都适用于此任务。下面列出了 .NET Framework 中最适合于表示 XML 输入或输出的五个类,并且给出了其正反两方面的简要说明。

1.

System.Xml.XmlReader(英文):XmlReader 是 .NET Framework 的拉模型 XML 分析程序。在拉模型处理过程中,XML 用户通过根据需要从 XML 制造者那里请求事件来控制程序流。拉模型 XML 分析程序(如 XmlReader)以只进的流方式进行操作,同时只显示单个节点在任意给定时间的相关信息。事实上,XmlReader 不需要整个 XML 文档加载到内存并且是只读的,这使其成为以非 XML 数据源创建 XML 外观的一个不错选择。这种以非 XML 数据源创建 XML 外观的一个示例是 XmlCsvReader(英文)。有人可能将 XmlReader 的只进特性视为一种局限性,因为它使用户无法通过 XML 文档的各个部分进行多次传递。

2.

System.Xml.XPath.XPathNavigator(英文):XPathNavigator 是 XML 数据源上的只读光标。XML 光标就像是一个透镜,一次聚焦于一个 XML 节点上,但与基于拉的 API(如 XmlReader)不同,它可以在任意给定时间将光标定位在 XML 文档的任意位置。在某种程度上,拉模型 API 是光标模型的只进版本。XPathNavigator 还是以非 XML 数据实现 XML 外观的一个很好的候选项,因为它允许您以实时方式构造数据源的 XML 视图,而不必将整个数据源转换成 XML 树。使用 XPathNavigator 创建非 XML 数据的 XML 视图的一个示例是 ObjectXPathNavigator(英文)。事实上,XPathNavigator 是只读的,而且缺少一些用户友好属性(如 InnerXml(英文)和 OuterXml(英文)),这使其在需要这些功能时不如使用 XmlDocument 或 XmlNode 那样另人满意。

3.

System.Xml.XmlWriter(英文):XmlWriter 提供了将 XML 文档推入基本存储区的一般机制。该基本存储区可以是从文件(如果使用的是 XmlTextWriter)到 XmlDocument(如果使用的是 XmlNodeWriter(英文))的任何内容。使用 XmlWriter 作为返回 XML 的方法的参数为支持各种可能的返回类型(包括文件流、字符串和 XmlDocument 实例)提供了一种可靠方式。这就是为什么 XmlSerializer.Serialize() method(英文)接受 XmlWriter 作为其中一个重载上的参数。正如其名称所包含的意思,XmlWriter 只对编写 XML 有用,不能用于读取或处理 XML。

4.

System.Xml.XmlDocument/XmlNode(英文):XmlDocument 是 W3C Document Object Model (DOM)(英文)的实现。DOM 是由 XmlNode 对象的分层树所构成的 XML 文档在内存中的表示,这些对象代表 XML 文档的逻辑组件,如元素、属性和文本节点。DOM 是在 .NET Framework 中操作 XML 的最流行的 API,因为它提供了一种直接的方法来加载、处理和保存 XML 文档。DOM 的主要缺陷是其设计需要将整个 XML 文档加载到内存中。

5.

System.String(英文):XML 是一种基于文本的格式,而且比 String 类能更好地表示文本。使用字符串作为 XML 表示方法的主要优点在于字符串是最小公分母。字符串容易写入日志文件或打印到控制台,而且如果您要使用 XML API 对 XML 进行实际处理,则可以将字符串加载到 XmlDocument 或 XPathDocument 中。使用字符串作为利用 XML 的方法或属性的主要输入或输出存在几个问题。使用字符串的第一个问题类似于 DOM,它们都需要将整个 XML 文档加载到内存中。其次,以字符串表示 XML 会增加制造者生成 XML 字符串的负担,在某些情况下这可能非常麻烦。生成 XML 字符串可能非常麻烦的一个示例就是从 XmlReader 或 XPathNavigator 获得 XML 时。第三,以字符串表示 XML 可能会导致与字符编码相关的混乱,因为无论在 XML 中放入什么编码声明,.NET Framework 中的字符串始终是 UTF-16 字符编码。最后,以字符串表示 XML 使得创建 XML 处理管道较为困难,因为管道中的每一层都必须重新分析文档。

类的字段或属性中包含 XML

在某些情况下,对象的字段或属性可能是一个 XML 文档或 XML 片段。下面的示例类代表一封电子邮件,其内容是 XHTML。邮件的 XML 内容是以字符串表示的,并且由该类的 Body 属性公开:

public class Email{  
  private string from;
  public string From{
    get { return from; }
    set {from = value; }
  }
  private string to;
  public string To{
    get { return to; }
    set {to = value; }
  }
  private string subject;
  public string Subject{
    get { return subject; }
    set {subject = value; }
  }
  private DateTime sent;
  public DateTime Sent{
    get { return sent; }
    set {sent = value; }
  }
  private XmlDocument body = new XmlDocument(); 
  public string Body{
    get { return body.OuterXml; }
    set { body.Load(new System.IO.StringReader(value));}
  }    
}

使用字符串作为表示 XML 文档的字段或属性的主要表示方式是最具用户友好性的表示方式,因为 System.String 类是一般开发人员最熟悉的 XML“常见疑点”。但是,这将会增加使用该类的用户的负担,这些用户现在可能必须应付两次分析 XML 文档的成本。例如,设想一种情况:在从 SqlCommand.ExecuteXmlReader() method(英文)或 XslTransform.Transform() method(英文)所得到的 XML 中设置了这样一个属性。在这种情况下,用户将必须分析文档两次,如下例所示:

     Email email   = new Email(); 
    email.From    = "dareo@example.com"; 
    email.To      = "michealb@example.org"; 
    email.Subject = "Hello World"; 

    XslTransform transform = new XslTransform(); 
    transform.Load("format-body.xsl"); 

    XmlDocument body = new XmlDocument(); 
    //1. XML 由 XmlDocument.Load() 分析
    body.Load(transform.Transform(new XPathDocument("body.xml"), null));

    //2. 同一 XML 被 Email.Body 属性中的 XmlDocument.Load() 再次分析
email.Body = body.OuterXml;

在上例中,同一 XML 被分析了两次,因为在将该 XML 转换成字符串之前必须将其从 XmlReader 加载到 XmlDocument 中,然后使用该 XML 设置 Email 类的 Body 属性,再由该属性本身从内部将该 XML 分析为 XmlDocument。一条很有效的经验法则就是提供对 XML 属性的访问(作为 XmlReader 和字符串)。因此,还应将下列方法添加到 Email 类,以使该类的用户获得最大的灵活性:

public void SetBody(XmlReader reader){
    body.Load(reader); 
  }

  public XmlReader GetBody(){
    return new XmlNodeReader(body); 
  }

这为 Email 类的用户提供了一种方式,使这些用户在需要时能够以有效的方式传递、设置和检索 Body 属性中的 XML 数据。

准则 如果类的字段或属性是 XML 文档或片段,则该类应提供将其属性同时作为字符串和 XmlReader 进行操作的机制。

敏锐的读者可能会注意到,如果您直接将 XmlDocument 作为属性公开,则应满足该准则,还应使该属性的用户可以精确更改 XML。

方法可以接受 XML 输入或者返回 XML 作为输出

当设计生成或使用 XML 的方法时,开发人员有责任使这样的方法在接受输入时具有灵活性。当方法接受 XML 作为输入时,您可以将这些方法分为要求在适当位置修改数据的方法,以及只需对 XML 进行只读访问的方法。唯一一个支持读写访问的“XML 常见疑点”是 XmlDocument。下面的代码示例显示了这样一个方法:

public void ApplyDiscount(XmlDocument priceList){
    foreach(XmlElement price in priceList.SelectNodes("//price")){
      price.InnerText = (Double.Parse(price.InnerText) * 0.85).ToString();      
    }
  }

对于需要对 XML 进行只读访问的方法,有两个主要选项:

•

XmlReader

•

XPathNavigator

XmlReader 提供了对 XML 的只进访问,而 XPathNavigator 不但提供了对基本 XML 源的随机访问,还提供了对数据源执行 XPath 查询的能力。以下代码示例将打印下面的 XML 文档中的 artist(艺术家)和 title(标题):

<items>
    <compact-disc>
      <price>16.95</price>
      <artist>Nelly</artist>
      <title>Nellyville</title>
    </compact-disc>
    <compact-disc>
      <price>17.55</price>
       <artist>Baby D</artist>
       <title>Lil Chopper Toy</title>
    </compact-disc>
  </items>

XmlReader:

public static void PrintArtistAndPrice(XmlReader reader){
    reader.MoveToContent(); //move from root node to document element (items)
    /* 保持读取,直至获得第一个 <artist> 元素 */
    while(reader.Read()){

      if((reader.NodeType == XmlNodeType.Element) && reader.Name.Equals("artist")){

        artist = reader.ReadElementString();
        title  = reader.ReadElementString(); 
        break; 
      }
    }
    Console.WriteLine("Artist={0}, Title={1}", artist, title);
  }
}

XPathNavigator:

public static void PrintArtistAndPrice(XPathNavigator nav){

    XPathNodeIterator iterator = nav.Select("/items/compact-disc[1]/artist 
       | /items/compact-disc[1]/title");

    iterator.MoveNext();
    Console.WriteLine("Artist={0}", iterator.Current);

    iterator.MoveNext();
    Console.WriteLine("Title={0}", iterator.Current);
  }

通常,返回 XML 的方法都使用类似的规则。如果希望接收方编辑 XML,则应返回 XmlDocument。否则,应根据方法是否需要提供对 XML 数据的只进流式访问而返回 XmlReader 或 XPathNavigator。

准则 接受或返回 XML 的方法应有助于返回 XmlReader 或 XPathNavigator,除非用户希望能够编辑 XML 数据(此时应使用 XmlDocument)。

上述准则的意思是指返回 XML 的方法应有助于返回 XmlReader,因为它比其他任何类型都适用于更多用户的情况。此外,当方法的调用方需要更多功能时,它们可以从返回的 XmlReader 加载 XmlDocument 或 XPathDocument。

将对象转换为 XML

XML 作为信息交换的通用语言已无所不在,这使其成为要以 XML 表示自身的某些对象的显而易见的选择,这些对象或者是出于序列化目的,或者是为了获得对其他 XML 技术的访问(如使用 XPath 进行查询或使用 XSLT 进行转换)。

当出于序列化目的将对象转换成 XML 时,显然应选择使用 XML Serialization technology in the .NET Framework(英文)。但是,在某些情况下,您对生成的 XML 所需的控制可能比 XmlSerializer 所能提供的更多。在这种情况下,工具包中的 XmlWriter 便是一个很有用的类,因为它使您不再需要该类的结构与所生成的 XML 之间存在一对一映射。下例显示了通过使用 XmlWriter 序列化 Email 类(前面几部分中已经提到)而生成的 XML。

public void Save(XmlWriter writer){

    writer.WriteStartDocument(); 
    writer.WriteStartElement("email"); 
    writer.WriteStartElement("headers");

    writer.WriteStartElement("header");
    writer.WriteElementString("name", "to"); 
    writer.WriteElementString("value", this.To); 
    writer.WriteEndElement(); //标题

    writer.WriteStartElement("header");
    writer.WriteElementString("name", "from"); 
    writer.WriteElementString("value", this.From); 
    writer.WriteEndElement(); //标题

    writer.WriteStartElement("header");
    writer.WriteElementString("name", "subject"); 
    writer.WriteElementString("value", this.Subject); 
    writer.WriteEndElement(); //标题
    
    writer.WriteStartElement("header");
    writer.WriteElementString("name", "sent"); 
    writer.WriteElementString("value", XmlConvert.ToString(this.Sent)); 
    writer.WriteEndElement(); //标题

    writer.WriteEndElement(); //标题;
    
    writer.WriteStartElement("body");
    writer.WriteRaw(this.Body); 

    writer.WriteEndDocument(); //关闭所有打开的标记
  }

这段代码生成下面的 XML 文档

<email>
  <headers>
    <header>
      <name>收件人</name>
      <value>michealb@example.org</value>
    </header>
    <header>
      <name>发件人</name>
      <value>dareo@example.com</value>
    </header>
    <header>
      <name>主题</name>
      <value>Hello World</value>
    </header>
    <header>
      <name>发送时间</name>
      <value>2004-03-05T15:54:13.5446771-08:00</value>
    </header>
  </headers>
  <body><p>Hello World 是我最喜欢的示例应用程序。</p></body>
</email>

只使用 XmlSerializer 的基本功能将不可能生成上面的 XML 文档。XmlWriter 的另一个优点是它可以从基本目标提取到数据要写入的目标,因此它可以是从磁盘上的文件到内存中的字符串(甚至是 XmlNodeWriter(英文)的 XmlDocument 称谓)的任何内容。

如果要求提供一种方式,使类可以更完全地参与到 XML 世界中(如与XPath 或 XSLT 等 XML 技术进行交互),则该类的最佳选择是实现 IXPathNavigable 接口,并为该类提供 XPathNavigator。这样做的一个示例是 ObjectXPathNavigator,它为那些使您可以在上述对象上执行 XPath 查询或运行 XSLT 转换的任意对象提供了 XML 视图。

准则 如果对象出于序列化目的要以 XML 来表示其自身,当其需要获得的 XML 序列化过程控制比 XmlSerializer 所提供的更多时,则应使用 XmlWriter。如果对象要以 XML 来表示其自身,以便能够完全以 XML 世界成员的身份参与到其中(如允许在此对象上进行 XPath 查询或 XSLT 转换),则此对象应实现 IXPathNavigable 接口。

结论

在将来的 .NET Framework 版本中,将会更加强调基于光标的 XML API(如由 IXPathNavigable 接口公开的 XPathNavigator)。这类光标将成为与 .NET Framework 中的 XML 进行交互的主要机制。

Dare Obasanjo 是 Microsoft WebData 小组的成员,除其他事务外,该小组还开发了 .NET Framework 的 System.Xml 和 System.Data 命名空间、Microsoft XML 核心服务 (MSXML) 以及 Microsoft 数据访问组件 (MDAC) 中的组件。

有关本文的任何问题或评论,欢迎张贴到 GotDotNet 上的 Extreme XML 留言板。

基于CNN的三相故障识别算法及实现(Matlab) 通过预处理数据、构建CNN模型、训练与评估模型等步骤,我们可以准确快速地识别三相故障。现代电力系统中,三相故障是一种常见的故障情况,可以导致电网中断、设备损坏甚至火灾等严重后果。本文将介绍基于卷积神经网络(CNN)的三相故障识别算法,并提供Matlab源代码实现。首先,将原始信号分为训练集和测试集。然后,对输入信号进行归一化处理,确保数据在合适的范围内。CNN适用于处理二维数据,所以我们可以将输入信号看作是时间序列数据和特征(如电压、电流等)的二维矩阵。在开始之前,我们需要一个包含正常和故障样本的数据集。 阅读详情

相关推荐

读《认知科学导论》(萨伽德) 总结

1. 作者的写作思路 本书是建立在对心智的理解采用表征与计算的方式。对心智表征-计算的理解方式是与计算机的本质相联系。计算机本质上是一个符号系统,符号系统包含两个部分,一个是符号,另一个是建立在符号上的操作。对心智采用表征-计算的方式理解,很容易与计算机建立起类比关系。同时人们在探索人工智能领域采用表征-计算方式已经取得了无数辉煌的成就,故表征-计算式现在研究的主流方法。 本书的有两个部分组成

xiaoqiangXX的专栏 3450

.net 程序发布后xml文件找不到的两种解决方法

自己做项目需要用智能客户端发布,我遇到了个问题就是程序中的xml文件在发布后找不到了。经过在网上查询和自己的试验发现这两个方法都可以解决这个问题。 方法1     右键winUI项目,发布-〉应用程序文件....->选择xml文件-〉发布状态改为“数据文件(自动)”        在程序里取xml路径的写法     file = Application.Common

lgx的专栏 3404

BurpSuit在不同浏览器中配置代理

文章通过分享各大浏览器如何设置代理的知识,帮助初学者快速掌握代理配置相关技能。

北冥同学的成长记录笔记 1万+

.netframework下的XML标准支持

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4  <!-- /* St

lffxgthmhfy的专栏 617

从X86到ARM:全面解析服务器CPU架构的演变与未来趋势

本文深入解析了服务器CPU架构从X86到ARM的演变历程与未来趋势。文章从CISC与RISC两种设计哲学切入,分析了X86凭借生态建立的帝国地位及其面临的功耗挑战,并重点阐述了ARM架构凭借其卓越的能效比优势,正从移动端向数据中心市场发起冲击。未来,异构计算、软硬协同与专用芯片将成为服务器CPU发展的核心方向。

gold的博客 1127

智能体在车联网中的应用:第19天 智能体理论与初步实践 D30:阶段小结——在SUMO中使用TraCI控制预编程智能体

本文介绍了如何将强化学习从算法仿真迁移到交通系统实践,重点讲解了SUMO微观交通仿真平台与TraCI实时控制接口的架构。通过构建一个预编程驾驶智能体,演示了车辆从起点到目标点的导航控制。文章详细解析了TraCI的双向通信机制和事件驱动模型,对比了其与传统RL环境的差异,并提供了完整的Python实现框架,包括路网配置、车辆控制和基于向量场的导航逻辑。该实践为后续开发高级学习型交通智能体奠定了基础。

IT深耕十余载,大道之简 1478

【笔记】RobotFrameWork解析output.xml的一种方法

项目中遇到需要另外解析RobotFrameWork的输出报告来取得一些信息,网上参考了一些方法以及自己尝试之后,在这里做一下笔记。运行RobotFrameWork会产生相应的output.xml,report.html,log.html。方法是用Python的robot包提供的api来解析output.xml,因此需要事先安装robot相应的包。(report.html,log.html可以使用命...

laoyezha的博客 4280

华为手环实时心率数据导出到UWP项目中

hello大家好呀O(∩_∩)O最近在做毕设 其中有个小功能要用到实时心率数据。查找网上的资料发现只有小米手环的实时心率数据导出但是没有华为手环的,我试了华为手环但是并不能行得通哈哈哈。现在分享一下华为手环实时心率数据导出的代码。

apple_63713858的博客 1581

在 .NET Framework 中表示 XML 的最佳做法

在 .NET Framework 中表示 XML 的最佳做法      摘要:Dare Obasanjo 着眼于可用来表示在单个进程和 AppDomain 内的组件之间共享的、基于 XML 的数据的选项,并讨论了每种方法在设计上的利弊。      引言   在最近的一次设计审查之后,一名职位是项目经理的同事询问在 API 中公开 XML 时是否存在设计准则,因为他曾经看到过许多不同的方法,但是无法

随风自由 1094

〖进阶篇1〗YAML参数解析:从nav2_params.yaml看机器人导航调优

本文深入解析了ROS2 Nav2导航系统中关键的nav2_params.yaml文件,提供了从定位、行为树、运动控制到环境感知等核心模块的参数调优实战指南。文章通过具体场景案例,如狭窄走廊、动态仓库和高精度对接,详细阐述了如何调整AMCL粒子数、控制器权重、代价地图膨胀半径等参数,以解决机器人导航中的犹豫、碰撞和精度问题,帮助开发者实现从“能用”到“好用”的进阶。

m9n0o的博客 417

<蓝桥杯软件赛>零基础备赛20周--第16周--GCD和LCM

gcd,lcm

罗勇军的博客 7603

一些不错的.net控件和工具

FreeTextBox:http://www.freetextbox.comFreeTextBox 是一个基于 Internet Explorer 中 MSHTML 技术的 ASP.NET 服务器控件。这是一款优秀的自由软件(Free Software),我们可以轻松地将其嵌入到 Web Forms 中实现 HTML 内容的在线编辑,在新闻发布、博客写作、论坛社区等多种 Web 系统中都会有用

游戏 1341

点云处理指南介绍

指南目录,Open3D与PCL内容介绍

NNNNNathan的博客 1万+

xml notepad 2007 下载

XML Notepad 2007Brief DescriptionXML Notepad 2007 provides a simple intuitive user interface for browsing and editing XML documents. File Name:               XmlNotepad.msi Version:           

greenerycn的专栏 1420

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

D o t N e t 相关资源 [更新中]

D o t N e t 相关资源 [更新中] http://www.Asp.Net/基本算asp.net的"官方"站了吧,里面的论坛和代码区还不错 1. MSDN (不用说了吧,最完善的MS资源库)英文版:http://msdn.microsoft.com/library/default.asp (个人主张尽量能浏览英文资料 http://msdn.microsoft.com/ ) 中文版

肄若芸(yiruoyun)的专栏 997

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

nant的一些经验,个人认为比较有价值。看看是否对你有帮助?

最近在做日构建工作时遇到一些很奇怪的问题,为什么说是奇怪呢?因为日构建是实现自动编译和测试,所们我们首先要实现的是能编译.我写的测试程序在VISUAL STUDIO IDE中编译运行非常.证明程序没有大问题,至少没有编译错误。测试程序是实现多语言的,利用.Net的多语言解决方案做的。但是,当我用写好的Nant编译就没这么好了,经常性报告程序错误,不能继续编译,错误都是出在资源文件.刚开始...

Anna_0110的博客 115

Camera2Demo

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

序列化【译】

以下的是自己尝试翻译MSDN的文章 原文:http://msdn.microsoft.com/en-us/library/7ay27kt9(v=vs.110).aspx 序列化是把对象转化为成一种可以保存和传输的过程,它的反过程就是反序列化,反序列化死指把数据流转化为对象的过程。这两个过程使得数据的存储和传输变得很方便。 .NET Framework 有两种序列化的技术: ...

bafo6221的博客 118

HWS与Workflow Solution Framework的区别

学习了半天才刚刚搞清楚Biztalk 2004的HWS(Human Workflow Service)与Workflow Solution的区别。 HWS仅仅建立了工作流的基础结构,用户在上面进行开发还是有一定困难的,用户需要根据自己的应用场景自行开发Action,这些Action将被用在具体的工作流中(我还没有完全研究明白,有待进一步确认)。研究了Biztalk SDK中的HWS例子,发现很乱,...

weixin_33882452的博客 162

WM有约II(八):本地化

WM有约II(八):本地化 Written by Allen Lee 让用户界面支持多种语言 如果你不曾为.NET Compact Framework的应用程序做过本地化,我建议你先去阅读MSDN的《设备的本地化注意事项》,以便了解.NET Compact Framework在这方面的一些限制。 首先,在当前项目里创建一个Resources文件夹,并在里面创建若干资源文...

爱.NET 113

.net Webservice处理异常之SoapException封装-------处理业务流程执行的错误,向客户端返回原始错误信息...

Webservice异常处理之SoapException封装 Webservice客户端使用一个WebMethod时,如果WebMethod内部出现异常,不管异常是系统级异常或者自定义的异常,均会被包装为SoapException类型的异常,返回给客户端。 客户端再使用这种SoapException时,无法直接从异常类的属性中提取直接的业务异常信息。网上看到有两种做法,如下: ...

weixin_30454481的博客 396

.NET魔法堂:工程构建基石->MSBuild

一、前言                               MSBuild是一个既熟悉又陌生的名字,Visual Studio的项目加载和构建均通过MSBuild来实现。VS中右键打开项目菜单,对应MSBuild的Build目标,对应MSBuild的Rebuild目标,对应MSBuild的Clean目标,对应MSBuild的PublishOnly目标。到这里我想大家都明白MSBuild...

weixin_33688840的博客 332
上一篇: 数据访问策略建议.DataSet&DataReader.(摘自msdn.写的很好!放在blog中了!)
下一篇: 如何水平和垂直居中元素
猿来是我
博客等级 码龄23年 2粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

猿来是我

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

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

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

打赏作者

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

抵扣说明:

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

余额充值