在 Picorv32 / 蜂鸟 E203 软核上运行 RT-Thread

PicoRV32 笔记 01 RISC V, PicoRV32 阅读详情

这篇文章主要介绍一下如何在2个FPGA软核上运行 RT-Thread。首先会介绍一下我用的 FPGA,接下来分别介绍在 蜂鸟 E203 和 picorv32 上运行 RT-Thread。

如果大家对如何在 FPGA 上造 CPU 感兴趣的话,Coursera 上有一门课 nand2tetris 挺有意思的,下面是2个链接分别是课程链接和在FPGA上的实现。
  • https://www.coursera.org/learn/build-a-computer

  • https://github.com/wuhanstudio/nand2tetris-iverilog


0. FPGA

首先介绍一下我用的 FPGA 开发板,也就是荔枝糖 (EG4S20),这块开发板性价比应当算是很高了,100RMB有20K逻辑单元(LUT4/LUT5混合架构),130KB SRAM,32bit 位宽 64MBit SDRAM,用来跑 RISC-V 的软核相当合适了。


为了给这块 FPGA 烧录 bitstream 把它变成软核,需要下载对应的IDE,下载链接在这里 http://dl.sipeed.com/。依次进入 Tang -> Premier -> IDE,下载最新的 TD Release 和最新的证书 Anlogic.lic,证书下载下来后替换安装路径 license 下的默认证书就可以正常使用了。

详细的安装步骤在这里也有介绍 http://tang.lichee.pro/


1. 蜂鸟E203

首先我们需要把FPGA变成一块RISC-V的开发板,因此需要烧录蜂鸟E203的bitstream,接下来就是把它当做单片机一样使用,上传固件了。

1.1 下载源码

为了方便,我把fpga的软核源码和RTT的固件源码放在了同一个仓库里。

$ git clone https://github.com/wuhanstudio/hbird_e203_tang
$ cd hbird_e203_tang
$ git submodule init
$ git submodule update

1.2 下载比特流

源码下载下来之后,Tang_E203_Mini 这个目录是软核的 Verilog 代码,hbird-sdk 则是蜂鸟E203的SDK。

接下来用 TD 软件打开源码 Tang_E203_Mini/project/e203egmini_new.al 下的项目,可以直接点 Generate Bitstream 生成比特流上传,当然上传之前也可以在左下角 User Constraints 里面检查一下引脚分配是对的。

Bitstream 上传成功之后,这块 FPGA 开发板就是一个 RISC-V 单片机了,可以对照下面的引脚图把 JTAG 连接好,就可以上传 RT-Thread 固件了。

1.3 上传固件

在编译上传之前,可以去芯来科技官网下载对应的 GCC 编译器和 OpenOCD,https://nucleisys.com/download.php,并且把他们安装在平级的目录下,比如:

nuclei/
--> gcc
--> openocd

详细的说明在蜂鸟 hbird-sdk 的官网也有介绍 https://doc.nucleisys.com/hbirdv2/quick_start/sdk.html。

工具链配置好之后我们就可以一步编译上传固件了:

$ cd hbird-sdk/application/rtthread/msh/
$ export NUCLEI_TOOL_ROOT=/opt/nuclei/             # replace with your path
$ export PATH=$NUCLEI_TOOL_ROOT/gcc/bin:$NUCLEI_TOOL_ROOT/openocd/bin:$PATH
$ make SOC=hbird BOARD=hbird_eval CORE=e203 upload

如果一切正常的话,按照上面的引脚图接好串口(和 FPGA 的引脚分配一致),就可以在控制台看到 RT-Thread 了:

 \ | /
- RT -     Thread Operating System
 / | \     3.1.3 build Nov 25 2020  
2006 - 2019 Copyright by rt-thread team
Hello RT-Thread!
msh >

这样就成功在蜂鸟E203软核上运行 RT-Thread,具体的移植感兴趣也可以对照仓库代码详细看。


2. Picorv32

首先介绍一下 picorv32,它也是一个 Verilog 实现的开源 RISC-V 软核 

https://github.com/cliffordwolf/picorv32

这里流程和蜂鸟E203略有区别,因为 picorv32 原版是没有 JTAG 接口的,所以在 EG4S32 的实现直接就把固件放在了 Verilog 实现的 ROM 里面,因此我们需要先编译固件,然后把固件融合在比特流里一起上传。

2.1 下载源码

同样我们先下载源码,为了方便起见,我依旧把FPGA和固件源码放在了同一个仓库里:

$ git clone https://github.com/wuhanstudio/picorv32_tang
$ cd picorv32_tang
$ git submodule init
$ git submodule update

如果大家不想自己编译工具链、编译固件,仓库里我也放了预编译好的固件,这样大家可以直接跳过 2.2, 2.3,直接去 2.4 最后一步。

2.2 编译固件

在编译固件前,我们需要 GCC 编译器,这里可以去下载编译好的工具链,也可以自己编译,编译大概需要 20min (i7-8665). 详细的编译流程在这篇文章里也有介绍 

https://pingu98.wordpress.com/2019/04/08/how-to-build-your-own-cpu-from-scratch-inside-an-fpga/

$ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev \
        libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo \
    gperf libtool patchutils bc zlib1g-dev git libexpat1-dev

$ sudo mkdir /opt/riscv32i
$ sudo chown $USER /opt/riscv32i

$ git clone https://github.com/riscv/riscv-gnu-toolchain riscv-gnu-toolchain-rv32i
$ cd riscv-gnu-toolchain-rv32i
$ git checkout 411d134
$ git submodule update --init --recursive

$ mkdir build; cd build
$ ../configure --with-arch=rv32i --prefix=/opt/riscv32i
$ make -j$(nproc)

工具链准备好之后,我们就可以编译 RT-Thread 了。

$ cd rtthread-nano/rt-thread/bsp/picorv32_blink/
$ mkdir build & cd build
$ cmake ../
$ make

这里我们会生成 rt-thread.bin,但是这是没法直接被 FPGA 使用的,FPGA 的 ROM 初始化需要用到 Generate Memory Initialization File (MIF) 格式,因此我们下面需要转换一下格式。

2.3 生成 MIF 文件

这里我准备了一个 python 脚本方便直接把 bin 文件转换为 mif,顺便一提,这里的 ROM 大小是 32x8192 bit 也就是 32KB。

# Copy generated rt-thread.bin out.
$ cp rtthread-nano/rt-thread/bsp/picorv32_blink/build/rt-thread.bin bin2mif/
$ cd bin2mif

# Generate MIF
$ python3 bin2mif.py rt-thread.bin rt-thread.mif

这样我们就可以把编译生成的 rt-thread.mif 放到 FPGA 的项目里替换了。

$ cp bin2mif/rt-thread.mif picorv32_EG4S20/firmware/

2.4 上传比特流

我们用 TD 打开源码 picorv32_EG4S20/RISC_V/RISC_V.al 下的项目文件,就可以生成比特流了。

这里大家可以看看 User Constraints 下面的引脚分配,接上串口不出意外就可以看到 RT-Thread 了:

 \ | /
- RT -     Thread Operating System
 / | \     3.1.3 build Nov 25 2020
 2006 - 2019 Copyright by rt-thread team
Hello RT-Thread!
msh >

3. 项目链接

  • picorv32 软核:

     https://github.com/wuhanstudio/picorv32_tang

  • 蜂鸟 E203 软核:

     https://github.com/wuhanstudio/hbird_e203_tang

最后感谢 stupid_bird 前期做的工作,我也是在他的基础上进行了一些优化总结。

  • https://gitee.com/Stupid_bird/picorv32_EG4S20

  • https://github.com/RT-Thread/rtthread-nano/pull/4

(文中链接请复制至外部浏览器打开)

你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群!

???? 点击阅读原文进入官网

PicoRV32 笔记 05 PicoRV32 本地总线接口 阅读详情

相关推荐

RISC-V低成本体验——使用Arduino开发蜂鸟E203程序

操作系统:Windows 10 64bit FPGA开发板:LicheeTang (Anlogic EG4S20BG256) RV调试器: Sipeed USB-JTAG/TTL (FT2232D) 一、 下载蜂鸟RV核 在安路官网下载最新版TD并安装 按照http://tang.lichee.pro/get_started/driver.html的方法安装驱动 下载蜂鸟 E203源码...

BigBits的博客 7428

探秘 Picorv32:一款轻量级RISC-V处理器核心

探秘 Picorv32:一款轻量级RISC-V处理器核心 picorv32PicoRV32 - A Size-Optimized RISC-V CPU项目地址:https://gitcode.com/gh_mirrors/pic/picorv32 Picorv32 是一个开源项目,由 YosysHQ 团队开发,可在 上找到。它是一个简洁且高效的 RISC-V(Reduced Instructi...

gitblog_00022的博客 1909

高云GW2A上搭建RISC-V软核并优化DDR3内存访问的完整指南

FPGA软核处理器设计是嵌入式系统开发的重要方向,通过可编程逻辑实现自定义指令集CPU,再结合外部存储扩展系统能力。DDR3作为主流内存接口,其控制器配置与时序约束直接影响系统稳定性。RISC-V指令集凭借开源生态,成为软核实现的优选架构。VexRiscv等开源软核支持AXI总线,可高效对接DDR3控制器。本文围绕国产高云GW2A FPGA平台,系统讲解从软核搭建、总线互联,到DDR3时序参数配置与PCB布线规则的完整流程,帮助开发者在国产化硬件上实现高性能嵌入式系统。

weixin_34216107的博客 398

【RISC-V】基于开源RISC-V MCU内核PicoRV32的FPGA移植

基于开源RISC-V MCU内核PicoRV32的FPGA移植

cabinGGG的博客 7729

学习记录:RISC-V CPU实践——从零开始(一)quartus跑picorv32

方法三:使用 Quartus 自带的 VWF(Vector Waveform File)仿真限制说明VWF 主要用于简单的时序验证,不能直接加载 HEX 文件步骤1:创建测试向量新建vwf选择clkresetngpio_out等步骤2:手动初始化(替代HEX加载)在仿真脚本中添加强制写入(示例):tcl复制下载# 在VWF的Tcl控制台输入:步骤3:运行仿真。

getdocument的博客 1201

picoRV32 CPU introduction(开源cpu)

RISC-V 最早是UC Berkeley 1992年的一个项目并用于课程教学,是基于MIPS-II ISA演变而来。2000年MIT在此基础上进行项目研究,并在2002年进入了课程教学。RISC-V ISA是从2010年夏开始定义,已经与早期受MIPS启发的设计完全不同。 自从2014年5月RISC-V 2.0版本之后,RISC-V ISA被快速采用,在2015年8月开始成立了非赢利性的RIS...

kuankuan02的博客 9265

【亲测免费】 探索Picorv32:一个轻量级RISC-V CPU实现

探索Picorv32:一个轻量级RISC-V CPU实现 是一个由Clifford Wolf开发的开源、简洁的RISC-V 32位CPU内核。它基于Verilog硬件描述语言,并被设计为易于理解、学习和定制的小型RISC-V实现。本文将详细介绍该项目的特性、用途和技术分析,以吸引更多的开发者和爱好者参与。 项目简介 Picorv32的核心目标是提供一个低复杂度、可快速集成到自定义SoC中的RISC...

gitblog_00024的博客 1794

picoRV32 (RISC-V) GCC 编译环境

我在windows7 32/64bit系统下都分别试过,编译 OK 采用的是 eclipse + GNU ,具体链接如下(32bit): GNU 编译器https://github.com/gnu-mcu-eclipse/riscv-none-gcc/releases/tag/v7.2.0-1-20171109[^](gnu-mcu-eclipse-riscv-none-gcc-7.2.0-1-2...

kuankuan02的博客 6529

【亲测免费】 探索未来计算:PicoRV32 — 一款精巧的RISC-V CPU

在现代电子设计中,高效的处理器核心是不可或缺的。今天,我们向您推荐一个名为PicoRV32的开源项目,它是一款高度优化的RISC-V CPU,专为那些追求小巧高效解决方案的工程师和爱好者们打造。 ## 项目简介 PicoRV32是基于[RISC-V RV32IMC指令集](http://riscv.org/)的CPU核心,可配置为多种变体,包括RV32E、RV32I、RV32IC、RV32IM...

gitblog_00165的博客 1392

【PIC32MZ】Usart串口通讯

串口通讯是一个很成熟的通讯协议,几乎所有MCU都配有串口,本篇将述在Harmony中如何使用Usart,使用设备为PIC32MZ2048EFH,其他PIC32MZ基本相似。 以下使用的是Harmony的动态驱动,要注意动态驱动的使用规则,动态驱动排序为Driver中配置顺序,即Instance Index,而非Usart ID的顺序。   串口使用流程如下,以串口2为例:   1、配置串口驱动

beatfan的博客 3043

基于开源的 RISCV 核 piRV32,搭建一个完整的片上系统(SOC)。学生需要进行硬件设计、软件编程,并验证系统的正确性。在本实验报告中,将详细介绍实验的设计流程、实验环境以及实验原理。

模块定义了处理器核与外部环境之间的输入输出接口,包括时钟信号(clk)、复位信号(resetn)、陷阱信号(trap)、存储器读写控制信号和数据信号(3)

qq_52241267的博客 1676

PicoRV32 RTL验证环境搭建

PicoRV32是一个开源的RISCV-MCU设计,可通过参数配置支持指令集RV32I,RV32IC,RV32IM,RV32IMC。.目前该实现已经在基于高云的FPGA上实现综合仿真运行,并配有基于ECLIPSE的IDE开发环境。这里介绍如何使用GTKWAVE+IVERILOG工具实现PicoRV32项目的仿真。环境准备:本环境基于UBUNTU18.04平台,开始前请安装如下工具编译结束后,工具链将安装在/opt目录下。

tugouxp的专栏 3021

L298N电机驱动模块的接线使用与代码实现

#include "iostm8s208mb.h" #define u8 uint8_t #define u16 uint16_t #define u32 uint32_t typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; // 关于LED灯的宏定义 #define LED2 PI_ODR_ODR2 //输出量 #define LE

Clichong 13万+

[嵌入式系统-54]:RT-Thread-内核:内核基础与核心概念

本章介绍 RT-Thread内核基础与核心概念,包括:内核简介系统的启动流程及内核配置的部分内容,为后面的章节奠定基础。RT-Thread 内核的简单介绍,从软件架构入手讲解实时内核的组成与实现,这部分给初学者引入一些 RT-Thread 内核相关的概念与基础知识,让初学者对内核有初步的了解,知道内核的组成部分、系统如何启动、内存分布情况以及内核配置方法。一、RT-Thread 内核介绍内核是一个操作系统的核心,是操作系统最基础也是最重要的部分。它负责管理系统的。

文火冰糖(王文兵)的博客 5146

CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法

CELF(Cost-Effective Lazy Forward selection)算法解析      引言:在社交网络影响力最大化问题的求解过程中,我们往往需要去选择一些目标种子结点作为信息初始传播的源头。贪婪算法在传播效果上的解决可以达到影响的最大化,但是在时间复杂度上面显得确十分糟糕。为此CELF算法应势而生,CELF算法利用了函数次模性的特点,在第一轮选择种子结点时,计算网络中所有节点的边际收益,但将在之后的过程中,不再做网络节点边际收益的重复计算,这相对于传统的贪婪算法,将在时间上得到非常明显的

hahaxq的博客 2478

全球半导体设备氧化钇熔射服务行业规模预测:预计未来六年CAGR为7.8%

本文将对“半导体设备氧化钇熔射服务”行业进行深度分析,探讨市场趋势的演变、核心竞争者的战略布局、供应链结构的内外特点、研发创新的最新进展、法规政策环境的适应性调整以及投资机会与风险评估。这一稳健的增长趋势表明半导体设备氧化钇熔射服务在电子行业中的重要性逐渐增强。由于全球对于高效、高精度和可靠的电子解决方案的需求增加,对能够提供这些功能的半导体设备氧化钇熔射服务的需求日益增长。由于半导体设备氧化钇熔射服务主要为就地服务型,其“配送”主要依赖于专业团队和技术设备的及时调配,强调服务的时效性和高质量。

CC1239777的博客 571

【亲测免费】 PicoRV32:一个优化的RISC-V CPU项目

PicoRV32是一个开源的RISC-V CPU项目,由YosysHQ开发并维护。该项目的主要编程语言是Verilog,适用于硬件描述和FPGA设计。PicoRV32实现了RISC-V RV32IMC指令集,并可根据需求配置为RV32E、RV32I、RV32IC、RV32IM或RV32IMC核心。 ## 项目核心功能 PicoRV32的核心功能包括: 1. **尺寸优化**:PicoRV32...

gitblog_00079的博客 999

YOLOv8实战火焰和烟雾检测 (视频教程)

本课程将手把手地教大家使用YOLOv8结合可变形卷积(deformable convolution)训练火焰和烟雾数据集,完成一个多目标检测实战项目,可实时检测图像、视频、摄像头和流媒体(http/rtsp)中火焰和烟雾,并提供可视化演示界面 。

bai666ai的博客 1918

5分钟快速上手PicoRV32:超小型RISC-V CPU核心实战指南

你是否正在寻找一款既小巧又高效的RISC-V CPU核心?是否在为资源受限的嵌入式项目而烦恼?PicoRV32可能就是你要找的答案!这款开源的RISC-V RV32IMC CPU核心,专为资源受限环境设计,在Xilinx 7系列FPGA上仅需750-2000个LUTs就能实现250-450MHz的运行频率,完美平衡了性能与资源占用。 ## 新手常见困惑与解决方案 ### 问题一:如何快速验证P

gitblog_00804的博客 1095

使用mne包来对脑电数据进行预处理(一)

MNE(MNE-Python)是一个用于处理脑电(EEG)、磁图(MEG)和其他神经科学数据的Python库。它提供了丰富的功能,包括数据加载、预处理、分析和可视化,旨在帮助研究人员和神经科学家更轻松地进行脑电数据的处理和分析。在本文中,我们使用mne来对不同的格式的脑电数据集进行数据读取。

m0_71596228的博客 4306

基于相位检测与锁相环的DIY超声波风速仪设计与实现

相位检测是信号处理中的一项基础技术,它通过测量两个周期信号之间的相位差来获取信息。其核心原理在于,当信号在介质中传播时,外部因素(如风速)会改变其传播速度,从而导致接收端信号的相位发生偏移。锁相环(PLL)是实现高精度相位检测的关键电路,它能动态调整本地振荡器的频率,以跟踪并锁定输入信号的相位,从而将微小的相位变化转换为易于测量的电压信号。这项技术的工程价值在于其对电路精度要求相对较低,鲁棒性好,非常适合低成本、高灵敏度的测量应用。在气象监测、工业传感和消费电子等领域,相位检测技术被广泛用于风速风向测量、位

weixin_29540599的博客 387

PicoRV32 笔记 04

RISC V,PicoRV32

jjinl的专栏 2183

2026年数学建模国赛B题无线电干扰源的快速自动定位与清除 论文详细解析

数学建模竞赛论文无线电干扰源的快速自动定位与清除2026 年高教社杯全国大学生数学建模竞赛 B 题完整求解论文交会定位、极大极小测点优化、自适应多频道搜索与定向源恢复的统一建模模型、算法、代码、图表与验证一体化交付本文研究圆形目标区域中多个未知无线电干扰源的快速检测、定位与清除问题,建立了由误差楔交会模型、角度观测信息模型、分层勘测模型、鲁棒射线交会模型和定向覆盖反馈模型组成的统一求解框架。模型同时覆盖题目中的四个子问题:多测向射线形成的多边形定位区域及直径、第二个测点的极大极小优选、全向源自动搜索清除策略

YOLO 360

PicoRV32 笔记 02

RISC V ,PicoRV32

jjinl的专栏 2164

【精细解读】xapp585(多通道LVDS接口ADC)

xapp585的参考设计有Verilog和VHDL两种源码。

FPGA艺术家的博客 534

假人有限元模型

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

PicoRV32 笔记 03

RISC V, PicoRV32

jjinl的专栏 1644

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

上一篇: 【AI简报20210820期】Apollo“汽车机器人” 具备L5级自动驾驶能力、树莓派DIY智能无臭猫便盆...
下一篇: 【每周话题第八期】你觉得能力重要还是学历重要?
RT-Thread物联网操作系统
博客等级 码龄6年 2万+粉丝 392原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值