基于STM32F407 HAL库的Flash编程操作

STM32F407HAL用FLASH写掉电保存 STM32F407HAL用FLASH写掉点保存 FLASH工作流程 写数据流程:Flash解锁——擦除扇区——写数据到指定空间——上锁写保护; 读数据流程:从指定地址读出指定长度数据。 源文件flash.c写法 STMFLASH_GetFlashSector函数用于判断写入的起始地址在哪个扇区,返回所在扇区,之后对该扇区进行擦除等操作。 uint32_t STMFLASH_ReadWord(uint32_t faddr) { return *(__IO uint32_t*)faddr; } //获取某 阅读详情
AI摘要

本文详细介绍了STM32微控制器上Flash的操作方法,包括初始化、解锁、异常状态清除、扇区擦除、数据写入及读取。通过具体代码示例,展示了如何使用HAL库进行Flash管理,适用于嵌入式系统开发者。

flash的初始化,解锁flash和清除一些flash的异常状态标识

uint16_t MEM_If_Init_FS(void) 
{

    HAL_FLASH_Unlock(); 
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | 
                          FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);

}
uint16_t MEM_If_DeInit_FS(void) 
{
    HAL_FLASH_Lock();
}

flash 的檫除操作

uint16_t MEM_If_Erase_FS(uint32_t start_Add,uint32_t end_Add)
{
    /* USER CODE BEGIN 3 */
    uint32_t UserStartSector;
    uint32_t SectorError;
    FLASH_EraseInitTypeDef pEraseInit;

    /* Unlock the Flash to enable the flash control register access *************/
    MEM_If_Init_FS();

    /* Get the sector where start the user flash area */
    UserStartSector = GetSector(start_Add);

    pEraseInit.TypeErase = TYPEERASE_SECTORS;
    pEraseInit.Sector = UserStartSector;
    pEraseInit.NbSectors = GetSector(end_Add)-UserStartSector+1 ;
    pEraseInit.VoltageRange = VOLTAGE_RANGE_3;

    if (HAL_FLASHEx_Erase(&pEraseInit, &SectorError) != HAL_OK)
    {
        /* Error occurred while page erase */
        return (1);
    }

    return (USBD_OK);
    /* USER CODE END 3 */
}

擦除操作,先解锁,然后清空所需flash所在sector。注意这里的sector使用GetSector()函数获取的,是一个整型数字(对于F4就是0~11)。
其中的NbSectors是需要清除的sector的个数。
 


下面是获取sector的编号
我们先按照用户手册上写的在文件usbd_dfu_if.h中define一些需要用到的sector起始地址

#define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbyte */
#define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbyte */
#define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbyte */
#define ADDR_FLASH_SECTOR_3     ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbyte */
#define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbyte */
#define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbyte */
#define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbyte */
#define ADDR_FLASH_SECTOR_7     ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbyte */
#define ADDR_FLASH_SECTOR_8     ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbyte */
#define ADDR_FLASH_SECTOR_9     ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbyte */
#define ADDR_FLASH_SECTOR_10    ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbyte */
#define ADDR_FLASH_SECTOR_11    ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbyte */


再在usbd_dfu_if.c文件末尾添加函数:

/**
  * @brief  Gets the sector of a given address
  * @param  Address: Flash address
  * @retval The sector of a given address
  */
static uint32_t GetSector(uint32_t Address)
{
  uint32_t sector = 0;
  
  if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0))
  {
    sector = FLASH_SECTOR_0;  
  }
  else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1))
  {
    sector = FLASH_SECTOR_1;  
  }
  else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2))
  {
    sector = FLASH_SECTOR_2;  
  }
  else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3))
  {
    sector = FLASH_SECTOR_3;  
  }
  else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4))
  {
    sector = FLASH_SECTOR_4;  
  }
  else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5))
  {
    sector = FLASH_SECTOR_5;  
  }
  else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6))
  {
    sector = FLASH_SECTOR_6;  
  }
  else if((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7))
  {
    sector = FLASH_SECTOR_7;  
  }
  else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8))
  {
    sector = FLASH_SECTOR_8;  
  }
  else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9))
  {
    sector = FLASH_SECTOR_9;  
  }
  else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10))
  {
    sector = FLASH_SECTOR_10;  
  }
  else
  {
    sector = FLASH_SECTOR_11;  
  }

  return sector;
}

flash写入操作

uint16_t MEM_If_Write_FS(uint8_t *src, uint8_t *dest, uint32_t Len)
{
    /* USER CODE BEGIN 3 */
    uint32_t i = 0;

    for(i = 0; i < Len; i+=4)
    {
        /* Device voltage range supposed to be [2.7V to 3.6V], the operation will
           be done by byte */
        if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)(dest+i), *(uint32_t*)(src+i)) == HAL_OK)
        {
            /* Check the written value */
            if(*(uint32_t *)(src + i) != *(uint32_t*)(dest+i))
            {
                /* Flash content doesn't match SRAM content */
                return 2;
            }
        }
        else
        {
            /* Error occurred while writing data in Flash memory */
            return 1;
        }
    }
    return (HAL_OK);
    /* USER CODE END 3 */
}

flash读出操作

uint8_t *MEM_If_Read_FS (uint8_t *src, uint8_t *dest, uint32_t Len)
{
    /* Return a valid address to avoid HardFault */
    /* USER CODE BEGIN 4 */
	    uint32_t i = 0;
    uint8_t *psrc = src;

    for(i = 0; i < Len; i++)
    {
        dest[i] = *psrc++;
    }
    return HAL_OK;

    /* USER CODE END 4 */
}

关注公众号《首飞》回复“机器人”获取精心推荐的C/C++,Python,Docker,Qt,ROS1/2,机器人学等机器人行业常用技术资料。

(HAL库)STM32F407IGT6内部Flash使用方法 阅读详情

相关推荐

洋桃电子STM32F407单片机入门教程笔记二:嵌入式Flash读写

在单片机内部集成了一块单片机存储器,相当于电脑的硬盘,可以存放我们下载的代码也可以存储程序运行中的临时数据,Flash存储器的特色是写入的数据在断电后不会丢失,但其写入速度比SRAM慢,所以我们的用户程序先下载到Flash存储器,单片机运行时的临时数据比如功能寄存器的操作、变量数值的修改都放在SRAM存储器中。但SRAM存储器中的数据掉电会丢失。当需要把临时数据保存则可以把临时数据写入Flash存储器。Flash读写功能就是在用户程序运行过程中自己操作Flash的数据读写。此功能在项目中的应用:

m0_61278502的博客 3504

STM32擦写失败case

利用HAL_FLASHEx_Erase(&FlashSet, &PageError)擦写时总是会进入到FLASH_WaitForLastOperation函数的while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_CFGBSY))等待,以至于死机,发现是因为FLASH_FLAG_CFGBSY没有被清零。 修改如下: // while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_CFGBSY)) // { // if ((HAL_Ge...

u012841414的博客 5142

STM32F407 HAL库FLASH读写全解析:从原理到避坑实践

在嵌入式开发中,非易失性存储是保存关键参数、实现固件升级(IAP)的基础需求。FLASH存储器因其断电数据不丢失、集成于芯片内部的特性,成为MCU系统中替代外挂EEPROM的常用方案。其工作原理基于特殊的物理结构,写入前必须先进行扇区擦除,且擦写寿命有限,这要求开发者必须理解其内存布局和操作约束。掌握FLASH的擦写时序、地址对齐规则及HAL库的驱动模型,对于实现可靠的数据存储至关重要。本文聚焦STM32F407VET6,针对常见的“Flash Download Failed”和“Operation Tim

weixin_29165725的博客 373

STM32标准库+HAL库 | CPU片内FLASH存储器数据掉电读写

如果只是做单个原型设备,那么一个小存储器芯片的价格可能是不痛不痒的,但对能进行大批量生产的电子产品,成本压缩几毛钱,都能创造一笔不菲的收入,甚至节约下来的成本可以供很多工程师的月工资。因此对于数据存储量不是很大的设备产品,就可以考虑直接使用MCU内置的FLASH进行数据掉电存储读写。

weixin_49337111的博客 4085

STM32F407内部Flash原理与HAL工程实践

嵌入式系统中,非易失性存储是配置保存、日志记录和固件升级的基础需求。Flash存储器作为典型的非易失性存储技术,其核心原理基于浮栅晶体管的电荷保持特性,通过高电压编程(写入)与擦除实现数据持久化,但必须遵循‘先擦后写’、地址对齐、扇区粒度等硬件约束。在STM32系列MCU中,内部Flash凭借零BOM成本、指令/数据统一编址及硬件级安全机制(如选项字节、读出保护),显著提升系统可靠性与启动安全性。典型应用场景包括Bootloader参数存储、设备唯一标识(OTP)、校准数据备份及OTA升级镜像暂存。本文深入

weixin_30838971的博客 410

STM32F407 Flash存储架构与安全编程实践

Flash存储器是嵌入式系统中实现固件存储、OTA升级和参数持久化的关键非易失性介质。其核心原理基于浮栅晶体管的电荷保持特性,擦除以扇区为最小单位、写入须遵循‘先擦后写’铁律,且受电压、时序与对齐约束。技术价值体现在支持IAP(应用内编程)、安全启动、读写保护等高可靠性功能;典型应用场景包括Bootloader开发、固件空中升级、模拟EEPROM及工业设备参数存储。本文深入解析STM32F407的Flash分扇区架构、寄存器操作机制(FLASH_KEYR密钥解锁、FLASH_SR状态轮询、FLASH_CR控

weixin_42103128的博客 37

【HAL库】STM32F407----内部Flash的读写

【HAL库】STM32F407----内部Flash的读写

MQ0522的博客 1万+

STM32 SPI通信实战:基于HAL库的F407与W25Q64 Flash读写例程

SPI作为一种全双工、高速的板级通信协议,在嵌入式系统中广泛应用于Flash存储、SD卡、显示屏等大数据量外设场景。相比IIC,SPI没有地址帧和应答机制,四线制通信高效直接,但正因为缺少反馈,时序参数配置稍有偏差就会导致读写失败。理解SPI的时钟极性(CPOL)与相位(CPHA)是掌握其原理的关键,二者决定数据采样的边沿,直接影响通信能否正常建立。基于STM32CubeMX与HAL库,通过图形化配置SPI外设参数,结合W25Q64 Flash的指令时序,可以快速搭建一套可复用的SPI读写框架。在实际工程中

weixin_29168675的博客 332

stm32f103固件库案例_STM32使用HAL库操作FLASH的注意事项

STM32通常有着丰富的片上Flash空间,这些空间正常情况下是存放指令代码、常量等烧录数据的。平时我们编译出来的bin或者elf文件会按顺序填充进Flash;hex格式的文件会稍许不同,通常情况下hex文件会更小一些,因为它会将无意义的填充段省略。一般我们的代码逻辑加上常量数据是远远用不到片上Flash那么大的空间的,因此我们可以划分一些区域用来作为掉电存储空间,实现EEPROM的作用。此外,如...

weixin_39866487的博客 2484

STM32F407单片机(HAL库版本) FLASH模拟EEPROM实验软件例程源码.rar

STM32F407单片机(HAL库版本) FLASH模拟EEPROM实验软件例程源码.rar

手把手教你设计MTBF加速寿命试验:从阿伦尼斯模型到卡方计算(含Excel模板)

本文详细介绍了如何设计MTBF加速寿命试验,从阿伦尼斯模型到卡方计算,帮助工程师在合理时间内获得准确的MTBF数据。通过工业电源模块的实例演示,涵盖活化能确定、温度应力设计、样本量计算及数据记录规范,并提供Excel模板实现自动化计算,显著提升测试效率。

weixin_42563415的博客 546

flash代码_正点原子【STM32-F407探索者】第三十九章 FLASH 模拟 EEPROM 实验

1)资料下载:点击资料即可下载2)对正点原子Linux感兴趣的同学可以加群讨论:9354467413)关注正点原子公众号,获取最新资料更新http://weixin.qq.com/r/hEhUTLbEdesKrfIv9x2W (二维码自动识别)STM32F4 本身没有自带 EEPROM,但是 STM32F4 具有 IAP(在应用编程)功能,所以我 们可以把它的 FLASH 当成 EEPROM 来使...

weixin_39548541的博客 1303

忍者安全渗透系统(NINJITSU OS V3)的安装详细过程,亲测新旧vm版本都可安装,附带下载来源

忍者安全渗透系统(NINJITSU)的安装详细过程,亲测新旧vm版本都可安装,附带下载来源

1万+

STM32 HAL库内部 Flash 读写实现

Flash 存储器是一种非易失性存储器,它可以在掉电的情况下保持数据。STM32F407 系列微控制器内部集成了一定容量的 Flash 存储器,用于存储程序代码和数据。Flash 存储器具有擦除和编程次数的限制,通常在几万到几十万次不等,因此在使用时需要合理规划擦写操作,以延长其使用寿命。HAL(Hardware Abstraction Layer)库是 ST 公司为 STM32 微控制器提供的一种硬件抽象层库,它封装了底层的硬件操作,提供了一套统一的 API 接口,使得开发者可以更方便地进行硬件开发。

m0_75187370的博客 2022

PSIM+PIL+CCS三剑客:手把手教你搞定DSP28335的软硬件联合调试

本文详细介绍了如何利用PSIM、PIL与CCS三款工具,实现DSP28335的软硬件联合调试。通过搭建兼容环境、从PSIM仿真生成PIL代码,再到实战联合调试与问题诊断,手把手指导开发者构建从虚拟模型到实际硬件的完整验证闭环,有效提升电力电子与电机驱动等领域的开发效率与可靠性。

weixin_29183637的博客 186

【虚幻引擎】UE4初学者系列教程基础篇-全中文新手入门教程(UE5系列继续更新)

菜单栏菜单栏当中有文件、编辑、窗口帮助。文件当中可以进行一个关卡的新建、关卡的打开、关卡的保存还有就是打包项目,(项目大于关卡,项目里面可能有几百个关卡),这是比较常用的几个,这里可以看到打包当中有安卓端HTML5端,IOS端linux,还有就是TVOS(苹果电视)、windows的一些端口的一些设置。还可以打开最近打开的项目。关卡编辑器:工具栏3.3 “模式”面板保存所有:ctrl+shift+s(有的软件截屏也是这个按键需要注意)3.4 “内容浏览器”面板缩放:ctr+鼠标滚轮3.5.视口面板。

qq_45206556的博客 2万+

【CubeMX-HAL库】STM32F407—无刷电机学习笔记

STM32F407外设快速上手配置

Muub的博客 3372

Raptor码(一):2007RFC5053标准编解码学习

RFC 5053 标准

a_beatiful_knife的博客 3494

STM32CUBEMX+HAL库+内部flash

内部Flash是STM32F4系列微控制器(如STM32F407)中的重要存储元件之一。它用于存储代码、数据和配置信息。

w1243654548的博客 1480

SAP-MM-PR分配货源并转PO

SAP-MM-PR分配货源并转PO

yanzibing99的博客 5476

小孙学变频学习笔记(二)变频器的逆变电路

本文主要介绍了变频器中逆变电路的核心器件IGBT及其应用。IGBT是一种电压控制型三端半导体开关器件,具有开关频率高、功耗低的优点,在变频器中仅使用截止和饱和导通状态。文章详细分析了IGBT的结构特性、与晶闸管的区别,以及由四个IGBT组成的直流转交流逆变电路原理。重点阐述了IGBT并联反向二极管的作用:提供电流反向通路、避免反向电压损坏器件、提高开关效率等。最后提供了相关学习参考网址供读者进一步研究。

qq_43091070的博客 1197

【STM32】HAL库Flash读写操作及配置(L4和F4系列不同操作、HAL_FLASH_ERROR_PGA报错的解决方案)

【STM32】HAL库Flash读写操作及配置(L4和F4系列不同操作、HAL_FLASH_ERROR_PGA报错的解决方案)

Mike Zhou的博客 6192

【使用DeepSeek辅助Python接口性能自动化测试教程-实战教程】

访问DeepSeek官方网站,注册账号并获取API Key。此Key是调用DeepSeek API的必要凭证,务必妥善保管。安装时,注意勾选“Add Python to PATH”选项,以便系统能识别Python命令。确保你已安装Python 3.8或更高版本。会自动发现并执行所有以。

Dreams°的博客 2468

【STM32】嵌入式(片上)Flash的读写(以STM32F407ZGT6为例,HAL库)

本文概述了STM32F4xx微控制器的嵌入式Flash特性、结构、HAL库读写函数和自定义读写驱动实现。强调了使用__attribute__存储常量在Flash中时PAD空间对齐的重要性及读写操作中避开程序存储区的必要性。

qq_26923297的博客 2802

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【STM32F407开发板用户手册】第16章 STM32F407必备的HAL库API(重要)

最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第16章 STM32F407必备的HAL库API(重要) 本章教程为大家讲解制作一个STM32F4的例子所需的最基本API函数,对于一些常用的API函数,一定要熟练掌握这些函数都是实现了什么功能,不常用的函数有个了解即可,用到的时候再去学。 目录 第16章 STM32F407必备的HAL库API(重要) 16.1 初学者重要提示 16.2 ...

Simon223的博客 2740

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

基于hal库实现stm32内部flash的读取

stm32的内部flash在我们实际运行的时候。很多时候并没有用完,还有许许多多的空闲内存,因此可以利用内部flash存储一些数据。我使用的是stm32f407vet6 ,所以就用这个芯片来进行演示。 认识内部的存储划分。 这是芯片内部的存储划分,需要注意的是,我们自己的程序也是存储在这些位置,所以需要存储在应用程序没有使用的内存区域,关于如何查看内存的划分,可以去查看map文件,在此不展开叙述。 由于读写内部flash不需要特别的外设,只需要开启一个串口就好了。 使用的是cube生成的。 开始读写 读写

weixin_42150905的博客 6520

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

上一篇: STM32F407各定时器的时钟频率
下一篇: 正则表达式的语法
首飞爱玩机器人
博客等级 码龄14年 6990粉丝 120原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

首飞爱玩机器人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值