UART与USART:同步与异步模式下的硬件设计与实战对比

stm32-USART通信 全双工(Full Duplex):USART在全双工模式下,可以同时发送和接收数据。它通常使用两个独立的数据线:TX(发送)和RX(接收)。全双工通信提高了数据传输的效率,因为发送和接收操作不会互相阻塞。半双工(Half Duplex):虽然USART的硬件设计支持全双工,但它也可以配置为半双工模式。在半双工模式下,同一时间只能发送或接收数据,而不能同时进行。这种模式通常使用一根数据线(通常是TX/RX共用一根线),需要切换方向来发送或接收数据。单工(Simplex) 阅读详情

1. 串口通信基础:从UART到USART的演进

串口通信是嵌入式开发中最基础也是最常用的通信方式之一。我刚开始接触单片机时,第一个真正理解的通信协议就是UART,因为它足够简单直观。UART(Universal Asynchronous Receiver/Transmitter)是通用异步收发器的缩写,而USART(Universal Synchronous/Asynchronous Receiver/Transmitter)则在此基础上增加了同步通信能力。

实际项目中,我经常看到开发者混淆这两个概念。简单来说,UART就像两个人用对讲机通话,需要约定好语速(波特率)和说话规则(数据格式),但不需要同步时钟信号。而USART更像是两个人面对面交谈,除了语速和规则外,还需要眼神或手势来同步(时钟信号)。

在STM32系列MCU中,USART外设非常强大。以我常用的STM32F103为例,它提供了多个USART接口,每个都可以配置为异步或同步模式。异步模式就是我们熟悉的UART方式,而同步模式则需要额外的时钟线来同步数据传输。

2. 硬件设计差异:三线vs四线的关键选择

2.1 异步模式下的硬件连接

在异步模式下,UART和USART的硬件连接完全一致。我通常使用三根线:TX(发送)、RX(接收)和GND(地线)。这里有个容易踩坑的地方:TX一定要接对方的RX,RX接对方的TX。我刚入门时就曾经因为接反而调试了半天。

在实际布线时,我建议使用双绞线来减少干扰,特别是长距离传输时。如果传输距离超过1米,最好加上电平转换芯片,比如MAX232或MAX3232,将TTL电平转换为RS232电平。

2.2 同步模式的特殊要求

当使用USART的同步模式时,就需要第四根线:CLK(时钟线)。这个时钟信号由主机提供,从设备根据时钟边沿来采样数据。这种模式下,数据传输速率可以更高,因为不需要起始位和停止位来同步。

我在一个高速数据采集项目中就使用了同步模式。主控STM32通过USART同步模式与ADC芯片通信,时钟频率达到4MHz,远高于异步模式通常使用的115200波特率。硬件连接时,时钟线要尽量短,并且要远离其他高频信号线,否则容易引入抖动。

2.3 电平标准与接口保护

无论是UART还是USART,都要注意电平匹配问题。STM32的IO口是3.3V电平,如果对接5V设备,需要加电平转换电路。我常用的做法是使用TXS0108这类双向电平转换芯片,比简单的电阻分压更可靠。

对于工业环境,我还会加上TVS管和串联电阻来保护接口。曾经有一个户外项目因为没加保护,雷击导致串口芯片损坏,教训很深刻。

3. 配置实战:STM32的寄存器级操作

3.1 异步模式配置详解

配置STM32的USART异步模式,我最关注以下几个参数:波特率、数据位、停止位、校验位和硬件流控制。波特率要精确计算,否则会产生累积误差导致通信失败。

以STM32F103的USART1为例,这是我最常用的配置代码:

void USART1_Init(uint32_t baudrate)
{
    // 启用时钟
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    
    // 配置PA9为推挽输出(TX)
    GPIOA->CRH &= ~GPIO_CRH_CNF9;
    GPIOA->CRH |= GPIO_CRH_CNF9_1;
    GPIOA->CRH |= GPIO_CRH_MODE9;
    
    // 配置PA10为浮空输入(RX)
    GPIOA->CRH &= ~GPIO_CRH_CNF10;
    GPIOA->CRH |= GPIO_CRH_CNF10_0;
    GPIOA->CRH &= ~GPIO_CRH_MODE10;
    
    // 配置波特率
    USART1->BRR = SystemCoreClock / baudrate;
    
    // 8位数据,无校验,1停止位
    USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
}

实际调试中,我遇到过波特率偏差的问题。后来发现是因为系统时钟配置有误,导致计算出的波特率寄存器值不准确。现在我都会用示波器测量实际波特率,确保与预期值误差在2%以内。

3.2 同步模式特殊配置

同步模式的配置多了时钟极性和相位设置,这对数据采样时机很关键。在STM32中,需要配置CR2寄存器的CLKEN、CPOL和CPHA位。

void USART1_SyncMode_Init(void)
{
    // 先配置为异步模式
    USART1_Init(9600);
    
    // 启用同步模式时钟输出
    USART1->CR2 |= USART_CR2_CLKEN;
    
    // 时钟空闲低电平,第一个边沿采样
    USART1->CR2 &= ~USART_CR2_CPOL;
    USART1->CR2 &= ~USART_CR2_CPHA;
}

同步模式下,时钟信号的稳定性很重要。我通常会在程序初始化后,用逻辑分析仪检查时钟波形,确保没有毛刺和抖动。

3.3 中断与DMA配置

为了提高效率,我强烈建议使用中断或DMA方式收发数据。特别是高速通信时,轮询方式会占用大量CPU资源。

中断配置要注意优先级设置。串口接收中断应该设置较高优先级,否则可能因为中断响应延迟导致数据丢失。DMA方式更适合大数据量传输,比如固件升级或图像传输。

4. 性能优化与错误处理

4.1 波特率精度优化

波特率误差主要来自时钟源精度和分频计算。STM32的USART波特率寄存器支持小数分频,可以显著提高精度。我通常使用这个公式计算BRR值:

// 精确计算波特率寄存器值
float desired_baud = 115200.0f;
float clock_freq = SystemCoreClock;
float div = clock_freq / (16.0f * desired_baud);
uint16_t div_mantissa = (uint16_t)div;
uint16_t div_fraction = (uint16_t)((div - div_mantissa) * 16 + 0.5f);

USART1->BRR = (div_mantissa << 4) | div_fraction;

在实际项目中,我还会选择合适的外部晶振来提高时钟精度。普通的8MHz晶振温漂可能达到100ppm,而TCXO温漂可以做到1ppm以内。

4.2 抗干扰与可靠性设计

串口通信最让人头疼的就是干扰问题。我总结了几种有效的抗干扰措施:首先是在PCB布局时,串口信号线要远离高频信号线;其次是加上适当的滤波电容;最后是软件上增加校验和重传机制。

硬件流控制(RTS/CTS)也能显著提高可靠性。我在一个无线模块项目中就使用了硬件流控,避免了因为缓冲区满导致的数据丢失。

4.3 功耗优化策略

对于电池供电设备,功耗优化很重要。USART在同步模式下的功耗通常比异步模式低,因为时钟同步更高效。我还会在空闲时关闭USART模块,只在需要通信时启用。

STM32的USART支持多种低功耗模式。在Sleep模式下,USART可以继续工作;在Stop模式下,需要唤醒后才能恢复通信。要根据实际需求选择合适的低功耗策略。

5. 多场景应用实战

5.1 调试输出与日志记录

我最常用的场景就是调试输出。通过重定向printf到USART,可以方便地输出调试信息。这里有个小技巧:使用DMA方式输出,可以减少CPU占用。

// DMA方式发送字符串
void USART1_Send_DMA(char *data, uint16_t len)
{
    // 等待上一次传输完成
    while (DMA1_Channel4->CNDTR != 0);
    
    // 配置DMA
    DMA1_Channel4->CMAR = (uint32_t)data;
    DMA1_Channel4->CNDTR = len;
    DMA1_Channel4->CCR |= DMA_CCR_EN;
}

对于日志记录,我建议加上时间戳和模块标识。这样在分析问题时,可以快速定位到具体的代码模块和时间点。

5.2 设备间通信

在多设备系统中,USART通常用于主从设备间的通信。我设计过一个智能家居控制器,主STM32通过USART与多个从设备通信。为了提高可靠性,我使用了自定义的通信协议,包含帧头、地址、命令、数据、校验和帧尾。

同步模式在这种场景下特别有用,因为时钟信号可以帮助同步多个从设备。我通常将主设备配置为时钟主机,从设备根据主时钟来同步采样。

5.3 固件升级与数据传输

USART也常用于固件升级(IAP)。通过USART接收新的固件程序,然后写入Flash。这里要注意波特率的选择:更高的波特率可以缩短升级时间,但也要考虑传输可靠性。

我通常使用115200波特率,加上XMODEM协议进行校验和重传。对于大容量固件,还可以使用YMODEM或ZMODEM协议。

在实际项目中,我还用USART同步模式传输图像数据。通过DMA双缓冲方式,可以实现高效的数据传输,CPU占用率很低。

6. 常见问题与调试技巧

6.1 硬件连接问题排查

串口不通是最常见的问题。我的排查步骤是:首先用万用表检查电源和地线连接;然后用示波器检查TX线是否有信号输出;最后检查RX线是否接收到数据。

如果硬件连接正常,但通信还是失败,可能是电平不匹配。我用过一个技巧:在TX线上加一个1k电阻,然后用逻辑分析仪测量波形,看是否存在反射或过冲。

6.2 软件配置问题

软件配置错误也很常见。特别是波特率设置,一定要确保发送和接收端完全一致。我建议在代码中加入波特率自动检测功能,或者至少要在初始化时输出当前的配置参数。

中断冲突是另一个常见问题。如果USART中断和其他高优先级中断冲突,可能导致数据丢失。我通常使用中断优先级分组,确保USART中断有合适的优先级。

6.3 电磁兼容性问题

在工业环境中,电磁干扰可能导致通信错误。我遇到过一种情况:电机启动时,串口通信就会出错。解决方法是在信号线上加磁珠滤波,并在软件上增加错误检测和重传。

长距离传输时,建议使用RS485而不是直接使用TTL电平。RS485支持差分信号,抗干扰能力更强,传输距离可以达到1000米以上。

调试时,我习惯先用逻辑分析仪捕获完整的通信过程,分析波形质量和时间关系。很多时候,问题就出在时序偏差或信号质量上。

深入解析UART与USART:同步与异步通信的实战应用对比 本文深入解析UART与USART在同步与异步通信中的实战应用对比,涵盖硬件设计差异、协议特点及软件实现技巧。通过实际案例,如STM32的USART同步模式驱动SPI设备,展示如何提升通信效率和抗干扰能力,适用于工业现场、智能卡等场景。 阅读详情

相关推荐

UART与USART核心差异解析:从异步串口到同步通信实战指南

串行通信是嵌入式系统与外部设备进行数据交换的基础技术之一,其核心在于实现可靠、有序的位级数据传输。从原理上看,串行通信主要分为异步和同步两种模式:异步通信依赖双方预定义的波特率进行自同步,无需时钟线,协议简单通用;而同步通信则通过独立的时钟线提供精确时序控制,数据传输效率更高,时序更稳定。在技术价值层面,理解这两种模式的差异有助于开发者根据实际场景选择最优方案,例如在调试打印、模块互联等常见场景中,异步模式因其连接简单、兼容性广而成为首选;而在需要驱动特定同步外设或满足特定工业协议(如LIN总线、智能卡)时

weixin_31858171的博客 311

USART vs UART终极对比:为什么你的项目该选同步通信?

本文深入对比了USART与UART的核心差异,重点解析了USART同步通信模式在工业控制、长距离及高噪声环境下的独特优势。通过引入独立的SCLK时钟信号,USART同步模式从根本上解决了异步通信的波特率失配与抗干扰难题,并结合RS-485实战案例与DMA优化策略,为高可靠性项目提供了关键的技术选型指导。

win55的博客 1071

UART/USART的硬件连接哲学:三线制与四线制背后的设计思维差异

本文深入探讨UART和USART串行通信协议的硬件连接设计差异。三线制UART代表极简主义,适合成本敏感应用;四线制USART提供同步通信灵活性,支持高速可靠传输。分析两种设计哲学在复杂度、成本控制和功耗管理上的权衡,为嵌入式系统设计提供决策框架。

eee77的博客 952

USART与UART:同步与异步之争背后的历史演进与技术抉择

本文深入解析USART与UART的技术差异与历史演进,重点对比同步与异步通信协议的工作原理、时钟机制及应用场景。USART支持同步模式,提供更高速率和可靠性,适用于工业通信和高速数据传输;UART则以其简单性和低成本在调试接口和低速传感器中占据优势。文章为嵌入式开发者的技术选型提供了实用指南。

hhh00的博客 946

UART/USART开发实战:异步与同步模式的性能对比与选型指南

本文深入解析UART/USART在异步与同步模式下的性能差异与选型策略。通过实测数据对比,揭示同步模式在传输效率(98%)和速率(12Mbps)上的优势,以及异步模式在物联网传感器等场景的适用性。提供STM32配置技巧和典型应用场景指南,帮助开发者优化串口通信设计。

weixin_29184075的博客 231

【串口通信中异步模式与同步模式的区别和选择】

详细讲解异步模式和同步模式的区别,并分析在实际开发中如何选择使用,结合 STM32 等 MCU 的实际开发经验提供指导

SpringWJN的博客 2393

STM32(hal库)在串口中,USART和uart有什么区别?

在STM32的HAL库中,USART和UART都是用于串口通信的模块,但它们在功能特性和使用场景上存在一些区别。

weixin_52307528的博客 1563

UART/USART通信模式对比:从硬件连线到代码实现的全面解析

本文全面解析UART/USART通信模式的硬件连线与代码实现,重点对比异步模式和同步模式的技术差异与应用场景。通过详细的硬件设计指南和软件优化方案,帮助开发者高效实现串口通信,提升嵌入式系统开发效率。

weixin_30500105的博客 189

UART与USART深度解析:从异步通信到同步模式的应用差异

串行通信是嵌入式系统中最基础的数据交换方式,其核心原理是通过串行比特流在设备间传输信息。异步通信模式下,双方依赖独立的波特率发生器实现自同步,而同步通信则通过共享时钟信号确保时序精确性。在工程实践中,理解UART(通用异步收发器)与USART(通用同步/异步收发器)的硬件差异至关重要,前者专精于异步通信,后者则扩展了同步模式及特定协议硬件支持。这种差异直接影响系统设计的可靠性与效率,尤其在需要高时序一致性的工业总线(如Modbus RTU)或特定协议(如LIN、IrDA)场景下,USART的同步模式与硬件加

weixin_29185493的博客 210

基于Verilog的USART与UART串行通信模块设计与实现

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)和UART(Universal Asynchronous Receiver/Transmitter)均为实现串行通信的核心外设,广泛应用于嵌入式系统中。二者均支持将并行数据转换为串行比特流进行传输,并具备发送(TX)与接收(RX)通道,通过起始位、数据位、可选校验位和停止位构成标准数据帧。大多数MCU的USART控制寄存器中设有专门的模式选择位,如STM32中的。

weixin_42097508的博客 402

Nginx配置Cookie安全属性:HttpOnly、Secure、SameSite实战指南

Cookie是Web应用中维持用户状态的核心机制,其安全配置直接关系到会话管理与身份认证的可靠性。从原理上讲,HttpOnly属性可防止XSS攻击窃取Cookie,Secure属性确保Cookie仅在HTTPS加密连接中传输,而SameSite属性则用于控制跨站请求时Cookie的发送行为,能有效防御CSRF攻击。这些安全属性的技术价值在于构建纵深防御体系,提升应用的整体安全性。在现代浏览器(如Chrome 80+)默认将未明确声明的Cookie视为SameSite=Lax的背景下,正确配置这些属性变得尤为

weixin_33783283的博客 323

从通信协议进化史看UART与USART:为何同步模式逐渐被边缘化?

本文从通信协议进化史角度分析UART与USART的技术差异,探讨同步模式被边缘化的原因。随着SPI、I2C等专用同步协议的成熟和IoT低功耗需求增长,USART同步模式在时钟同步复杂度、硬件成本和功耗方面的劣势凸显,使其逐渐让位于更灵活、高效的异步通信模式。

convnet3designer的博客 324

保姆级教程:在ROS Noetic下,手把手教你将自定义A*全局规划器打包成插件(附避坑指南)

本文提供了一份详细的ROS Noetic下自定义A*全局规划器插件开发指南,涵盖从环境准备、算法优化到插件配置与调试的全流程。通过实战案例和避坑技巧,帮助开发者高效实现机器人导航中的全局路径规划,特别适合需要优化ROS导航栈的开发者。

weixin_29168675的博客 286

串口(USART)框图的讲解

STM32 的 USART 简介 通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个 UART(Universal Asynchronous Receiver and Transmitter),它是在 USA...

weixin_30338497的博客 5683

分析国外几款主流蜜罐产品看欺骗诱捕技术的应用脉络

网络安全的本质是攻防对抗,更本质的其实是人与人心智与技术的全面较量。 欺骗诱捕技术作为攻防对抗技术中比较特殊的技术,能够使防守方更多掌握对抗中的主动权,诱导攻击,迫使攻击者耗费精力的同时,留下丰富的攻击信息。究其本质,欺骗诱捕技术更深层次考验的不止是技术的能力,还有对于攻击者作为人的理解。 国外主流蜜罐产品分析 根据MarketsandMarkets《欺骗技术市场规模、份额和2021年全球市场预测》中提到的欺骗诱捕技术全球主要供应商及产品,我们分析了几款国外主流的蜜罐产品,希望更清晰看到欺骗诱捕技术应

cdyunaq的博客 1311

成对使用离轴抛物面反射镜的设计

成对使用离轴抛物面反射镜的设计

weixin_72050316的博客 638

STM32中的UART详解

摘要: 本文详细解析UART协议在STM32开发中的应用,涵盖协议基础、STM32外设特性及软硬件实现。UART作为一种异步串行通信协议,通过TX/RX双线实现全双工传输,其帧结构包含起始位、数据位、校验位和停止位。STM32的USART外设支持多种配置(如波特率、数据位、校验方式),并可通过寄存器或HAL库编程。硬件设计需注意电平匹配(如3.3V转RS232)和抗干扰措施。实战案例包括寄存器级配置(如115200 8N1模式)及调试技巧,为嵌入式开发提供实用参考。

qq2745567641的博客 2336

【AI技术赋能有限元分析应用实践】Abaqus有限元分析与深度学习结合20个案例与有限元分析数据来源方法说明

结合 Abaqus 和深度学习,数据的获取和处理是关键的一步。通过从仿真、实验、公开数据库或合成数据中获取数据,经过预处理后,可以将其用于训练深度学习模型。最终,将训练好的深度学习模型与 Abaqus 集成,用于材料行为预测、结构优化、非线性分析、损伤预测等任务,从而提升仿真效率和精度。

源代码杀手的博客 3213

STM32-USART通信

既然双设备利用串行双向发送,那么发送和接收肯定要约定好一个频率,主机按照一定频率发送,从机按照一定频率接收,这样子才不会出现丢包、空包。主要的区别在于 USART 具有同步传输的能力,可以通过外部时钟源进行精确的时钟同步,而 UART 只能支持异步传输。在异步模式下,USART不使用时钟信号来同步发送和接收的数据,而是依赖于双方设置的相同波特率。TX与RX要交叉连接,因为对于设备2来说,设备1的发送(tx)就是它的接收(rx),对方同理。USART是一种用于串行通信的设备,可以在同步和异步模式下工作。

tianpu2320959696的博客 347

手把手教你学Simulink--基础储能管理场景实例:基于Simulink的锂电池健康状态(SOH)在线评估仿真

本文详细介绍了基于Simulink的锂电池健康状态(SOH)在线评估仿真方法。主要内容包括:1)SOH定义与量化指标(容量SOH、内阻SOH及综合SOH);2)基于Thevenin模型参数辨识和递推最小二乘法(RLS)的在线评估原理;3)100次充放电循环的仿真场景设置;4)Simulink建模步骤(主电路搭建、核心模块实现及信号流连接);5)仿真结果分析,显示SOH评估误差<2%,响应时间45秒,满足在线评估需求;6)提出多参数融合评估、深度学习辅助辨识等优化方向。该方法为储能系统寿命管理提供了有效

MHD0815的博客 182

高德地图API如何使用

通过以上步骤,您可以成功接入并使用高德地图API来为您的应用添加丰富的地图功能。

QQ_778132974的博客 4790

7.STM32 串口通信详解:从通信基础到 UART/USART 实战调试

本文介绍通信本质与演变,对比电子通信优势;分类涵盖无线/有线、同步/异步、单工/半双工/全双工、串行/并行。重点讲解STM32常用外设及选型,详解UART/USART协议、电平标准、寄存器与调试技巧,为嵌入式串口开发提供基础指导。

Dodger_code的博客 186

cursor AI代码编辑器IDE对接deepseek模型api;字节ai编辑器trae

参考: https://www.cursor.com/ https://platform.deepseek.com/https://www.cursor.com/下载安装后,注册账号登录即可 再高级里选择设置 再模型这注册模型: 模型名称一定要填正确,url地址填好,最后填上秘钥验证

weixin_42357472的博客 1万+

别再傻傻分不清了!嵌入式开发中UART和USART到底怎么选?附STM32实战代码

本文深入解析嵌入式开发中UART与USART的核心差异与选型策略,通过硬件设计对比、协议栈实现差异及STM32实战代码,帮助开发者根据速率需求、硬件资源和功耗等因素做出最优选择。特别适合MCU开发者在通信总线设计中避免常见错误,提升系统稳定性。

weixin_33748818的博客 235

Camera2Demo

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

STM32串口通信实战:UART和USART到底该怎么选?附代码示例

本文深入解析STM32串口通信中UART与USART的技术差异,提供实战选择指南和代码示例。通过对比同步通信和异步通信的特点,帮助开发者根据项目需求选择最优方案,涵盖硬件配置、应用场景及性能优化技巧。

corn8的博客 41

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

上一篇: 从一杯水到平稳驾驶:S型曲线如何重塑BLDC电机的用户体验
下一篇: 深入解析SPI通信协议:从基础到实战应用
code8
博客等级 码龄17年 65粉丝 1720原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值