LWN:针对二进制格式的一些好用工具!

工具及方法 - 二进制编辑软件 今天我需要分析一个加密和不加密的文件类型的区别,使用beyond compare的二进制比较后,发现文件格式上的区别,要修改内容的话,就需要一个合适的二进制文件编辑软件。我连Notepad++这个大众类型软件的很多功能还没用好,当然也没时间再花精力掌握一款新软件,自然也没法发挥这些工具的最大效力。其实呢,对于工具来讲,首先是要有使用的需求,如果你没有使用的必要,这款工具再好,功能再强,对你也没意义。然后就是工具使用的水平,不是越复杂越强大的工具越好,而是自己越熟悉、越适应的工具越好。 阅读详情

关注了就能看到更多这么棒的文章哦~

Some useful tools for binary formats

February 28, 2023
This article was contributed by Koen Vervloesem
FOSDEM
AI assisted translation
https://lwn.net/Articles/924133/

Linux 用户经常使用文本文件;grep、awk 和 sed 等工具是他们工具箱中的标准工具。但是,当试图从二进制格式的文件中提取或编辑数据、分析损坏的媒体文件或解析二进制数据格式时,这些工具就显得力不从心了。布鲁塞尔举行的 FOSDEM 2023 有一个专门针对处理二进制数据的开源程序的二进制工具相关的讨论议题。

基于行的文本文件可以用标准工具处理,但是对于以文本形式存储结构化数据的数据格式,如 JSON、YAML 和 XML,有更好的工具。对于 JSON,命令行处理器 jq 已经很受欢迎了。它也是至少两个名为 yq 的工具的灵感来源,这些工具可以处理 YAML、JSON、XML 和其他基于文本的格式:一个由 Mike Farah 开发,另一个由 Andrey Kislyuk 开发。

fq, or jq for binary formats

在 FOSDEM 上,Mattias Wadman 介绍了他开发的工具 fq,他称之为“二进制格式的 jq”。他开发这个工具是因为他在工作中经常处理媒体文件,想要有一个命令行工具来帮助调试损坏的媒体文件,寻找一些不寻常的值或数据结构,或者只是对多个媒体文件进行数据提取任务自动化处理。

Wadman 解释说,他非常喜欢 jq,因为它的语法非常适合 CLI,用来查询、显示和转换 JSON 数据。这种语法简洁而可组合,很容易对数据结构中的元素进行迭代和递归,而且有强大的选择和转换数据的手段。他希望对二进制格式的数据也有同样的可能性,所以他写了 fq 工具。这用 Go 语言编写的,是基于一个 Go 实现的 jq 工具来开发的。两个项目都是 MIT 许可的。

Fq 的语法表现力很强。在最简单的形式中,fq d file 就可以递归地显示解码后数据结构的树形结构,但它会把长 array 截断;使用 fq dd file 则显示所有字节。使用 fq . file 只显示树形结构的上层。也可以选择满足某些条件的值,用来提取文件数据结构中特定部分,或者计算出这些数值的直方图(histogram)。

fq 就可以采用这种方式在命令行上快速完成数据处理任务,它也可以作为 shell 脚本的一部分。此外可以使用 fq -i . file 作为一个交互式的读取-求值-打印循环(REPL)shell 来使用。其中会有自动补全功能,可以轻松地发现文件中的结构,并在结构组成的树中来回浏览。使用 fq 的另一种方式是作为脚本解释器。当经常使用相同的 fq 命令时,可以创建一个像这样的脚本:

#!/usr/bin/env fq -d mp3 -rf
[.frames[].header | .sample_count / .sample_rate] | add

这个例子是通过对 mp3 文件来选择所有 frame 的头部,将每个 header 中记录的 sample 数量除以其采样率,然后将所有结果相加,用来计算 MP3 文件播放的持续时间。同样地,可以处理许多其他格式的文件。该项目还提供了一些文档来介绍如何实现新的格式的解析。

Kaitai Struct

虽然 fq 是一个很有用的命令行工具,但 Kaitai Struct 工具则比它更侧重于以一种声明式(declarative)、语言无关(language-neutral)的方式创建二进制文件结构的解析器。Kaitai Struct 的开发者和维护者 Petr Pučil 谈到了他是如何发现这个项目的。他想要创建一个 MIDI 编辑器,在这个过程中,他就开始编写一个 SoundFont 2(.sf2)文件的解析器。“这很难,一点都没有什么乐趣”,Pučil 认为。但当他发现了 Kaitai Struct,这让他能够在一天内做到之前花了两个月的事情。

那么 Kaitai Struct 是什么呢?从根本上说,它是一种用于描述任意二进制数据结构的声明式语言。数据格式是在.ksy 文件中描述的,使用了 YAML 格式。这一点尤其重要,因为可以用作格式描述的正式规范定义(formal specification)。截至撰写本文时,Kaitai Struct 的格式库有 181 种规范,包括 ZIP 存档格式、GPT 分区表、可执行文件使用的 ELF 格式(the Executable and Linkable Format)以 AVI (Audio Video Interleave)这种多媒体容器格式。

除此之外,Kaitai Struct 还是一个解析器生成器(parser generator)。Mikhail Yakshin 在 2016 年发布了它的第一份源代码时,Kaitai Struct 就能够将.ksy 文件编译成 Java 和 Ruby 代码用来解析 structure。到 2017 年,该项目已经支持 8 种语言,截止撰写本文时,它能够为 11 种语言创建解析器:C++/STL、C#、Go、Java、JavaScript、Lua、Nim、Perl、PHP、Python 和 Ruby。在他的演讲中,Pučil 宣布计划开发 Rust、C 和 Julia 解析器生成器。

“这真的是一种 '一次编写,到处使用' 的方式”,Pučil 解释说。一旦一个二进制格式在.ksy 文件中描述好了,Kaitai Struct 的编译器就能够为这 11 种编程语言生成解析代码的源代码。编译器 ksc 使用 GPLv3 许可证发布,但生成代码所使用的运行时库使用 MIT 或 Apache-2.0 许可证。因此生成的代码甚至可以由专有(proprietary)应用程序来使用。

Ksc 有一个有趣的特性:它的目标之一不是某一种编程语言,而是 Graphviz 的 dot 语言。生成的.dot 文件可以用 Graphviz 来转换成一个图表(diagram),显示.ksy 文件中定义的数据结构。这是一种可视化二进制数据格式的简单方法,比如说也许可以作为其文档的一部分。

Kaitai Struct 还附带了一些其他实用工具。使用 ksv 命令,可以使用.ksy 文件来解析目标文件,将结构和原始数据并排可视化地展现。用户可以打开和关闭树状结构中的某一部分,从而来交互式地探索这些数据。随 ksv 包附带的另一个命令是 ksdump。这也可以用来对树状结构进行可视化,但非交互式的方式。它仅仅将特定数据的解析结构以 YAML、JSON 或 XML 格式来 dump 出来显示到 terminal 终端上。

在开发.ksy 文件时还有另一个方便的工具就是 Kaitai Web IDE。这是一个 online 编辑器和可视化显示工具,在编辑.ksy 文件时可以显示原始数据和解析对象树。这种即时反馈可以让格式规范的开发速度更加快。Web IDE 使用 GPLv3 许可证,并且也可以在本地运行。

Pučil 以一个最近的进展来结束了他的演讲:Kaitai Struct 团队已经花了 6 个月开发序列化支持。序列化正是解析动作的相反的流程:解析是从二进制数据创建结构(所以它读取二进制数据),序列化是将结构转换为二进制数据(所以它会写入二进制数据)。NLnet Foundation 对序列化工作提供了资金资助。目前,Kaitai Struct 有了一个 Java 序列化生成器可以用了,并且据 Pučil 说,Python 和 C#实现也将在两个月内准备好。

有了序列化之后,Kaitai Struct 可以用来编辑一些现有的二进制格式文件,也能从结构来创建新文件,甚至将文件在不同格式之间转换。然而,当前序列化实现功能还相当少。用户必须要显式地对数据结构中的所有内容进行设置,包括长度、偏移量和 magic number 等。Kaitai Struct 只检查序列化数据的一致性。另一个缺陷是一旦创建了用于序列化的数据流,就无法在之后对齐 size 进行调整。

GNU poke

GNU poke 项目在 FOSDEM 的二进制工具讲座中有两次演讲。José E. Marchesi 介绍了这个工具的基本情况和项目的最新进展。GNU poke 是一个交互式、可扩展的结构化二进制数据编辑器,可以从命令行使用。它与简单的十六进制编辑器不同,GNU poke 不仅可以让用户以原始字节流的方式来编辑数据,还可以以结构化的方式编辑数据。Marchesi 称 GNU poke 对于逆向工程和原型设计特别有用。

当然,poke 程序需要知道用户正在使用的数据格式,这就是为什么这个程序附带了近 50 个“pickle”。pickle 是指用 Poke 语言编写的脚本,可以读写特定的某种二进制格式。一些 pickle 甚至非常复杂,以至于它们在由自己专门的 package 来发布,比如 poke-elf 用来编辑 ELF 对象文件、可执行文件、共享库和 core dump 文件。

用户也可以编写自己的 pickle 来编辑其他二进制格式的文件。Poke 语言是具备静态类型和垃圾回收的语言。一个 pickle 包括了解析和序列化数据格式所需的 type、变量和函数的定义。因此,编写一个自定义 pickle 并将其加载到 GNU poke 中,就可以创建自定义的二进制数据编辑器了。

GNU poke 的基本功能是在一个 C 库 libpoke 中实现的,这样就可以将其功能集成到其他工具中。Marchesi 演示了一个例子,其中 libpoke 被集成到了 GDB 中。“由于 GDB 擅长调试而 GNU poke 擅长处理数据,所以将两者结合起来就得到了一个在两项任务上都非常出色的工具”,Marchesi 总结道。

除了 GNU poke 的主页外,还有其他两个网站可以了解到更多关于这个工具的信息。其中 Pokology 是一个由 poke 用户和开发者维护的社区驱动的网站;而 Applied Pokology 是 Marchesi 关于 GNU poke 的博客。

GNU poke 的贡献者 Mohammad-Reza Nabipoor 介绍了这个工具的另一个用户接口。在最近发布的 GNU poke 3.0 版本中,Nabipoor 贡献了 poke 守护进程 poked 。它链接到了 libpoke,并通过 Unix socket 来将其功能暴露给其他程序。这样,就可以有多个客户端同时与 poked 交互。

Nabipoor 使用 GNU poke 来解析蓝牙格式,在 poked 的基础上构造了 pacme ,他称之为“受 acme 启发的 GNU poke 接口”。他所说的 acme 是 Rob Pike 从贝尔实验室分布式操作系统 Plan 9 中开发出来的文本编辑器。

Pacme 由一堆小型 C 程序组成,被称为 poklet ,它们与 poked 交互,执行 Poke 代码并处理结果,也实现了用户接口中的几个主要组件,如 REPL 、byte dump、树状视图和 Poke 数据结构编辑器。关于用户界面方面,pacme 使用了 tmux 工具,把各种 poklet 都在各自独立窗格(pane,是 tmux 中的名词)中显示。有一些预定义的布局,并且用户也可以打开 tmux pane 并且手动排列,然后在其中打开 poklet 来创建出自定义的界面。

Binary toolkit

总而言之,这些工具在处理各种二进制数据格式时可能会派上用场。对于在命令行上提取和过滤数据,fq 提供了一种易于使用的方式。要编辑二进制数据,GNU poke 是一个强大的工具。要解析或者序列化二进制数据到某一种编程语言(需要是它能支持的语言)中的话,Kaitai Struct 提供了一种灵活的方法。

虽然这三个工具各有其用途,但每个都有自己的格式库,这有点遗憾。这些格式之间有很多重叠,因此存在相当多的重复工作。不过,Kaitai Struct 正在与 Python 数据解析器和构建器项目 Construct 积极合作,并且双方都有一些想法。Kaitai Struct 编译器会将 Construct 作为其目标之一,这就允许将 .ksy 文件转换为使用 Construct 的声明式语言描述相同数据格式的 Python 文件。在二进制数据格式领域中各个项目之间如果能更多地进行这样的合作,将会有更多的成果。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

format,png

从千禧年Linux站点清单看开源生态演进与当代资源导航 开源软件生态的核心在于社区驱动的协作与共享。其运作原理基于分布式开发模式,通过版本控制系统(如Git)和代码托管平台(如GitHub)实现全球开发者协同。这一模式的技术价值在于加速创新、提升软件质量与安全性,并降低企业IT成本。应用场景涵盖操作系统、云计算、大数据及人工智能等关键领域。本文以一份2000年的Linux宝藏网站清单为切入点,通过对比Freshmeat、SourceForge等早期平台与GitHub、Arch Wiki等现代资源的演变,系统梳理了Linux信息获取、软件分发、硬件兼容及社区协作的 阅读详情

相关推荐

Binary Viewer二进制文件读取软件

Binary Viewer二进制文件读取软件,可读取二进制的语音数据,图像数据,从而分析音频或者图像存储的二进制信息

LWN:内核开发者的更好的工具!

关注了就能看到更多这么棒的文章哦~Better tools for kernel developersByJonathan CorbetFebruary 6, 2020原文来自:htt...

Linux News搬运工 2448

二进制查看工具 Binary Viewer 解压使用

Binary Viewer 下载解压使用,无密码

LWN:用户空间的影子堆栈!

关注了就能看到更多这么棒的文章哦~Shadow stacks for user spaceBy Jonathan CorbetFebruary 21, 2022DeepL assisted...

Linux News搬运工 2230

WSL 相关命令时遇到了 “无法从raw.githubusercontent.com提取分发列表、操作超时

核心问题:国内网络屏蔽raw.githubusercontent.com,导致WSL无法获取发行版列表;最优方案:优先用方案1(手动指定发行版安装),无需改配置,1分钟搞定;永久修复:用方案2(修改hosts),适合需要管理多个WSL发行版的场景;兜底方案:用方案3(手动下载安装包),适配所有网络环境。按以上步骤操作后,你不仅能正常安装WSL,等命令也能正常执行,后续可正常使用WSL搭配Docker Desktop(如切换WSL 2后端),无需再担心网络超时问题。

weixin_39766667的博客 2124

ABAQUS中CDP模型在钢筋混凝土节点低周反复荷载模拟的关键技术解析

本文深入解析了ABAQUS中CDP模型在钢筋混凝土节点低周反复荷载模拟中的关键技术。通过详细介绍CDP模型的核心价值、建模关键技术、滞回曲线优化方法及典型问题排查指南,帮助工程师精准模拟混凝土的拉伸开裂和压缩压碎行为,提升抗震分析效率。文章还提供了实用的工程应用技巧,如快速建模模板和后处理自动化脚本。

weixin_30555125的博客 525

LWN:Fedora同意提供预编译的macOS二进制文件!

关注了就能看到更多这么棒的文章哦~Fedora approves shipping pre-built macOS binariesBy Joe BrockmeierMay 29, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/975445/Asahi Linux项目致力于在 Apple Silicon 硬件上支持 Linux。...

Linux News搬运工 619

《哥谭神话-工程篇》01.Palantir 平台架构解析-混乱数据如何转化唯一真相源?

Palantir 平台的架构哲学可以概括为将洞察落地为行动,其核心是将“获取唯一真相”能力深度嵌入现有的、复杂的工作流程中,成为提升运营效率和决策质量的倍增器。

895

LWN:文件系统格式算是ABI吗?

关注了就能看到更多这么棒的文章哦~The ABI status of filesystem formatsBy Jonathan CorbetOctober 8, 2020DeepL a...

Linux News搬运工 236

C#与AutoCAD插件开发实战:从零构建你的第一个自定义命令

本文为AutoCAD插件开发新手提供了一份完整的C#实战指南。从搭建Visual Studio开发环境、添加AutoCAD .NET API引用,到编写并注册第一个“Hello AutoCAD”自定义命令,再到实现一个交互式绘制十字线的实用命令,详细讲解了核心代码结构与调试技巧。文章旨在帮助工程师和设计师利用C#自动化重复绘图任务,显著提升工作效率。

weixin_29294597的博客 434

STM32入门教程:自动门控制

通过这个简单的示例,我们展示了如何使用STM32微控制器来实现一个简单的自动门控制系统。如果有物体靠近门口,我们会改变doorState的值,并使用controlServoMotor函数来控制舵机电机的转动。具体的引脚连接可以根据您的具体硬件来定,例如将红外传感器的输出引脚连接到GPIOA_PIN0引脚。同样,具体的引脚连接可以根据您的具体硬件来定,例如将舵机的控制引脚连接到GPIOA_PIN1引脚。首先,我们需要包含必要的库文件和引用。然后,我们需要定义一些函数来处理红外传感器的输入和舵机电机的输出。

m0_75244442的博客 577

LWN:Rust 的近期重要改动!

关注了就能看到更多这么棒的文章哦~Some recent and notable changes to RustDecember 11, 2023This article was contributed by Daroc AldenGemini translationhttps://lwn.net/Articles/954033/Rust 项目每六周进行一次增量发布,这个做法很容易让人忽略该语言即...

Linux News搬运工 1086

携程机票数据爬取实战:使用 Python 获取携程网机票信息

通过本篇博客,我们详细介绍了如何使用 Python 爬取携程网的机票信息,涉及了静态网页爬取(使用 Requests 和 BeautifulSoup)和动态网页爬取(使用 Selenium)两种方法。通过获取的数据,我们不仅能够进行票价分析,还可以构建更为复杂的预测模型或趋势分析工具。爬虫技术不仅能够帮助我们收集有价值的数据,还能够为商业决策提供数据支持。在实际应用中,我们可以结合更多的分析方法,如自然语言处理、图像处理等,进一步提升数据的价值。

2201_76125261的博客 1657

LWN:对print()输出消息生成索引列表!

关注了就能看到更多这么棒的文章哦~printk() indexingBy Jonathan CorbetMay 27, 2021DeepL assisted translationhttp...

Linux News搬运工 250

get_ccopt系列命令介绍

get_ccopt_property:用来获取cts阶段,clock tree上所有的参数信息,可以通过get_ccopt_property –help *获取所有参数。get_ccopt_skew_group_delay:用来获取skew group的相关信息,可以通过筛选出特定条件下skew_group的参数,如skew_group下latency最长是多少;get_ccopt_clock_tree_source_groups:获取clock tree的source group名字;

芯冰乐 280

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(三)

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(三)

宁波阿成的博客 524

LWN:U-Boot的最新状态!

关注了就能看到更多这么棒的文章哦~A status update for U-BootBy Jake EdgeJuly 26, 2023EOSSChatGPT assisted translationhttps://lwn.net/Articles/938769/U-Boot(universal boot loader)在嵌入式 Linux 领域有广泛使用。在 2023 年嵌入式开源峰会(EOSS...

Linux News搬运工 1225

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LWN:llamafile让LLM更易用!

关注了就能看到更多这么棒的文章哦~Portable LLMs with llamafileBy Daroc AldenMay 14, 2024ChatGLM translationhttps://lwn.net/Articles/971195/大型语言模型 (LLM) 近期成为了许多讨论和审查(scrutiny)的主题。开源爱好者尤其感兴趣的是如何在自己的硬件上运行大型语言模型,特别是当这样做需要...

Linux News搬运工 532

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

LWN: 对BPF tracing进行类型检测

Type checking for BPF tracingByJonathan CorbetOctober 28, 2019原文来自:https://lwn.net/A...

Linux News搬运工 617

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LWN:ELF note泄露了信息!

关注了就能看到更多这么棒的文章哦~When ELF notes reveal too muchBy Jonathan CorbetFebruary 22, 2024Gemini translationhttps://lwn.net/Articles/962782/Linux 内核使用多种加固技术来防止自身受到破坏,其中一种技术是内核地址空间布局随机化 (KASLR)。但是,如果内核泄露其代码最终位...

Linux News搬运工 338

LWN:发行版使用Flatpak

关注了就能看到更多这么棒的文章哦~Distributors entering FlatpaklandBy Jonathan CorbetJuly 8, 2022DeepL assisted translationhttps://lwn.net/Articles/900210/在过去的 30 年里,Linux 发行版已经发生了相当大的变化,但它们打包软件的方式却基本没变。虽...

Linux News搬运工 519

【翻译】 使用 SFrame 进行可靠的用户空间堆栈跟踪

请考虑订阅 LWN订阅是 LWN.net 的生命线。 如果您喜欢这些内容并希望看到更多,您的订阅将有助于确保 LWN 继续蓬勃发展。 请访问此页面加入我们,让 LWN 继续在网络上传播。 作者:Jonathan Corbet2023 年 5 月 22 日LSFMM+BPF 许多调试和优化任务都需要完整的堆栈跟踪,但要可靠地获得这些跟踪却具有惊人的挑战性。 在...

超级码力 3093

Linux操作系统发展历程与核心技术解析

Linux作为开源操作系统的代表,采用模块化内核设计,支持多任务处理和虚拟内存管理等核心功能。其技术架构包含进程管理、内存管理和文件系统等关键子系统,通过GPL许可证保障了开源自由。Linux在服务器、嵌入式系统和云计算领域广泛应用,特别是在容器化和云原生技术中发挥重要作用。随着物联网和人工智能的发展,Linux持续优化实时性和资源管理能力,成为现代IT基础设施的基石。

dianzongfan5428的博客 339

LWN:开源语音助手的希望!

关注了就能看到更多这么棒的文章哦~Hopes and promises for open-source voice assistantsMarch 21, 2023This article was contributed by Koen VervloesemDeepL assisted translationhttps://lwn.net/Articles/926484/2022 年底,Paulu...

Linux News搬运工 2295

LWN:定义开源硬件!

关注了就能看到更多这么棒的文章哦~Defining open hardwareOctober 18, 2023This article was contributed by Koen VervloesemChatGPT translationhttps://lwn.net/Articles/945870/开源硬件(或称为开放硬件)是指以类似开源软件的方式开发的硬件。对于开源硬件有一个被广泛接受的定...

Linux News搬运工 2634

二进制文件如何使用Notepad读取显示

二进制文件如何使用Notepad读取显示

T0620514的博客 6190
上一篇: LWN:6.3 合并窗口第一部分!
下一篇: LWN:内核中基于Rust 的time API!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值