Linux下使用USB模拟ACM串口设备

基于HAL库移植GD的USB协议栈(Device/CDC_ACM) 基于CubeMx生成的STM32芯片代码,手动移植GD的USB协议栈代码进去,实现GD32芯片的USB正常通讯。 阅读详情
AI摘要

本文介绍了USB的基本原理,包括其“询问-应答”机制、连接过程以及OTG技术的应用方式。文中还探讨了USB的实现结构,从总线层、设备层到功能层的不同职责,并介绍了如何通过GadgetSerial接口实现USB串口。

这个想法之前就在脑袋里有过,最近公司产品要用到,所以多做了些了解。

1. USB 简介

USB 是 Universal Serial Bus 的缩写,从字面上看,就是通用串行总线的意思。从物理上看,其实就是一对差分线,连接两台设备后,相互间进行数据传输。加上另外两路供电( 5V 和 GND)线,一共是 4 根线。

那么,既然是只有一对差分线,那么该如何决定由谁传给谁呢(如果两边同时在线上建立电平,线路上的电平会是不确定态的,以致无法通信)?这就要说到 USB 传输的一个重要基础:“询问-应答” 机制—— Device(slave) 设备通常是处在等待状态,只有 HOST 侧设备发起询问、请求,它才会在接下来的时间片中使用数据线向 HOST 发送数据。

那么,谁是 HOST,谁是 SLAVE 又是由什么来决定的呢?答案是硬件。也就是说,你 USB 后面的那块驱动芯片如果是 HOST,那么,这个 USB 只能做 HOST 用了。反之,SLAVE 亦然。比如我们经常见到的,PC 上的 USB HOST 连接到 U盘、鼠标、键盘这些 SLAVE 设备。

后来有人觉得这样一个设备只能是 HOST 或者只能是 SLAVE 太死板了,所以又发明了 USB OTG。USB OTG(on-the-go,大意为在使用时切换身份)是在原来 4 根线的基础上,又加了一根线,ID。那块 USB 后面的驱动芯片,就可以根据这根线,来选择自己到底该扮演 HOST 还是 SLAVE 的角色。后面我们单独介绍。

另外,因为使用一对差分线进行数据传输,所以,USB 又采用了基于 HUB 的星形拓扑结构(包括根控制器,最多7 层拓扑,且7层已不具备挂载 HUB 能力,只能是功能设备)。所以,更确切来说,“HOST-SLAVE“ 是在由 HUB 支持的物理链路之上的传输机制。同时,HUB 本身也是一个 USB SLAVE 设备。

 

2. USB 连接过程概述

下图很好的解释了 USB 的连接过程。需注意,1)如上图的拓扑结构所示,每个网络内只能有一个 HOST。2) HOST 和 SLAVE 之间,可以一对一直连,也可以通过 HUB ,一个 HOST 对应多个 SLAVE。

基本状态包括:设备插入、设备上电、设备复位、设备获得地址、设备配置完成、挂起状态。下面略做解释。

设备插入:HOST 侧(可能是在 HUB 上,也可能是直接在 host controller 上)根据 D+ 和 D- 口的阻抗变化,来判断是否有 device 插入,以及判断插入设备的速度类型。

设备上电:因为 USB 口有供电功能(5V DC,多为 500-1000 mA ),所以,设备又分为 Bus powered 和 self powerd。当然,即使是设备自己供电,我们也认为只有当设备已连接,它才进入powered 状态。设备一旦重新上电,后面的连接操作要重新执行一次。

设备复位:因为只有一对差分线,如果两边同时操作,那线路上的电平将是不确定态,根本无法通信。所以,上电后,USB device(slave)默认为等待状态,不进行任何动作,直到 HOST 发给它一个 Reset 请求。复位完成,意味着低速/全速/高速的物理通路已经建立。

设备获得地址:设备复位成功后,将获得一个由 HOST 分配的地址。分配地址的对话,将在设备的 endpoint0 上完成。

设备配置完成:握手?配置?反正这一阶段完成,意味着设备已经 ready了。

挂起状态:所有 USB Device(slave)在空闲一段时间后,都必须将自己挂起,并保持自己的状态,无论设备已经被分配地址还是没有分配地址。

 

3. OTG

OTG 增加了一根可以动态配置为 HOST 或者 DEVICE(slave)的数据线,以 micro USB 接头为例,其引脚分配如下:

因为传统的 USB 线缆为 4 根线,所以,要将 OTG 设备接入,需对其进行配置(硬件短接):

  1. 当配置 OTG 设备为 USB Device(slave) 时,将 ID 脚悬空。

  2. 当配置 OTG 设备为 USB HOST时,将 ID 脚接地。

所以,我们这里,需要将OTG脚悬空,来将其配置为 Slave 设备。硬件上面,买来的 OTG 转接线默认把 OTG USB 设备设置为 HOST,他们 ID 脚都是接地的。而我们是需要把 OTG 设备当作 Device(slave)来用,所以,最终选择了将板子上的 ID 线割断,使其悬空。

 

4. 一般的实现结构

前面我们讨论了硬件部分,同时,作为通讯接口,不可能不需要系统及软件层面的协作。先给出一张比较常见的 USB 通讯模型图,然后我们再做解释:

对于整个 USB 通讯过程,我们可以粗略的将其分为“总线层”、“功能层”和“设备层”三个层次。这三个层次的划分,主要是为了问题的集中解决。其中:

  a. 总线层负责解决“点到点”的问题,主要是保障上一层可以和相邻的端点“对话”,一般还会提供硬件 buffer 公上层使用;

  b. 设备层才有了设备的概念,HOST 通过 Device(Slave)的 Endpoint0 对其进行配置,准备好数据管道给上一层使用;

  c. 功能层在是 Device(Slave)功能的具体实现,才能看到一个个“鲜活”的设备,才是我们看得到的 U盘、鼠标这些设备。

以某安装 Linux 的 PC 为例,作为 HOST,其中这三部分工作分别由控制器(如 EHCI 、UHCI 、OHCI),USB CORE (对前面控制器的内核支持、设备管理功能等)和 USB 上层驱动(usbmouse、usbkbd、usb-storge)。

我们要实现的 USB 串口,就是属于 USB 上层驱动部分的实现。只不过,我们是通过类似于这里 HOST 的结构,实现了一个 Device(Slave)。

 

5. g_serial.ko

当前内核 3.0.8 支持 Gadget Serial 接口。也就是说,如果我们有一个硬件的 USB SLAVE(可以是由 OTG 支持的), 这一驱动可以支持我们实现一个软件的 USB 串口;就像由 PL2303 或者 HM340 硬件实现的 USB Serial 一样。 只有 HOST 控制器是不行的。不管是对 HOST 侧的PC,还是我们添加 Gadget Serial 驱动支持的 PC,这条链路看起来都只是一个普通的串口连接。其源代码在 /drivers/usb/gadget/serial.c,另外还有文档 Documentation/usb/gadget_serial.txt。可自行阅读。(其实,谷歌的 ADB 工具和这个是差不多的东西,可能甚至只有驱动号不一样。)

具体应用时,我们并不需要做太多修改。。。只需要配置,编译就足够了。我把它编译成了 module,所以,需要在文件系统起来之后再做一次 modprobe。

至于 HOST 侧,据说是都不需要驱动的,但是,我在 Windows 上用的时候,还是安装了 gadget serial v2.4 的(据说不支持 64 位系统,未验证),UBUNTU 上即插即用。

——————无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。


说明:本文转载自:http://www.cnblogs.com/pied/p/4549614.html

Linux USB Gadget:从零构建一个虚拟串口设备 本文详细介绍了如何在Linux系统中使用USB Gadget技术构建虚拟串口设备,适用于嵌入式开发和调试。从内核配置到实战操作,包括加载模块、使用configfs动态配置设备、添加CDC ACM功能等步骤,帮助开发者快速实现USB虚拟串口功能,提升调试效率。 阅读详情

相关推荐

从Arduino到树莓派:手把手教你搞定Linux下的USB虚拟串口(CDC ACM驱动实战)

本文详细介绍了在Linux系统下配置USB虚拟串口(CDC ACM驱动)的全过程,从Arduino到树莓派的实战操作指南。内容包括设备识别与诊断、权限管理、高级调试技巧以及跨平台开发建议,帮助开发者快速解决USB CDC/ACM驱动配置中的常见问题。

weixin_29174141的博客 411

GD32的USB CDC ACM通信数据解析

上面的枚举的设备只是一个简单的串口通信功能,仅提供一个参考,具体开发需要根据实际的应用去修改描述符、通信请求。参考资料:USB中文网 USB2.0规范ST USB CDC类入门培训。

dajkhsdawe的博客 6115

linux usb host ACM(usb虚拟串口)

support usb device that use ACM driver, and generate /dev/ttyACMx in host. 1. kernel config Device Drivers------> USB support <*> USB Modem (CDC ACM) support USB Modem (CDC ACM) support: This driver supports USB modems...

ARM-Linux 3009

USB ACM device

usb设备插入到板子上后出现 cdc_acm 1-1:1.0: ttyACM0: USB ACM device CDC ACM就是USB Communication Device Class - Abstract Control Model 看上去应该是USB虚拟的串行口。

landishu的专栏 4884

高通/MTK平台ACM串口驱动(USB转ACM串口)

高通平台、MTK平台USB转ACM串口,WIN7无法识别ACM串口,安装这个串口驱动即可(64位)

usbd-serial:适用于USB设备的进行中的最小CDC-ACM(USB串行端口)类

USB串行 USBCDC-ACM USB串行端口实现。 CDC-ACM是大多数操作系统都开箱即用支持的USB类,用于实现调制解调器和通用串行端口。 SerialPort类实现了类似于流的缓冲串行端口,可以与普通UART相似地使用。 装箱中还包含CdcAcmClass,这是一个较低级的实现,具有较少的开销,但需要更多的注意才能正确使用。 例子 一个完整的示例需要使用硬件驱动程序,但是与硬件无关的部分如下: let mut serial = SerialPort :: new ( & usb_bus); let mut usb_dev = UsbDeviceBuilder :: new ( & usb_bus, UsbVidPid ( 0x16c0 , 0x27dd )) . product ( "Serial port" ) . device_class (USB_CL

Linux下使用USB模拟ACM串口设备【转】

本文转载自:https://www.cnblogs.com/pied/p/4549614.html 这个想法之前就在脑袋里有过,最近公司产品要用到,所以多做了些了解。 1. USB 简介 USB 是 Universal Serial Bus 的缩写,从字面上看,就是通用串行总线的意思。从物理上看,其实就是一对差分线,连接两台设备后,相互间进行数据传输。加上另外两路供电( 5...

427

f_acm_USBACM_

基于Linux 4.0 内核下的USB acm 驱动, 可供参考

Linux的USB虚拟串口驱动(CDC-ACM驱动)源码

Linux的USB虚拟串口驱动(CDC-ACM驱动)源码 【下载地址】Linux的USB虚拟串口驱动CDC-ACM驱动源码 探索Linux下USB虚拟串口驱动的奥秘,本开源项目提供CDC-ACM驱动源码,专为开发者和学习者设计。通过实现USB CDC-ACM协议,该驱动程序让USB设备轻松模拟串口设备,实现高效数据通信。...

gitblog_06765的博客 379

【win11 cuda12.0安装tensorflow-gpu】

win11 cuda 12.0 安装 tensorflow-gpu

weixin_36299320的博客 3009

riscv32-gcc工具链实战:从下载到编译的完整指南

本文提供了一份详尽的riscv32-gcc工具链实战指南,涵盖从官方渠道下载预编译版本、正确选择riscv32-glibc版本、配置环境变量到实战编译的全过程。通过清晰的步骤和避坑指南,帮助开发者快速搭建稳定的RISC-V交叉编译环境,并成功编译从Hello World到Linux内核的程序。

s3t4u的博客 675

【亲测免费】 Linux的USB虚拟串口驱动CDC-ACM驱动源码:让USB设备实现串口通信的艺术

Linux的USB虚拟串口驱动CDC-ACM驱动源码:让USB设备实现串口通信的艺术 【下载地址】Linux的USB虚拟串口驱动CDC-ACM驱动源码 探索Linux下USB虚拟串口驱动的奥秘,本开源项目提供CDC-ACM驱动源码,专为开发者和学习者设计。通过实现USB CDC-ACM协议,该驱动程序让USB设备轻松模拟...

gitblog_06760的博客 832

Qt+PCL实战:如何用QVTKOpenGLNativeWidget高效渲染3D点云(附完整代码)

本文深入解析了Qt与PCL结合使用QVTKOpenGLNativeWidget进行高效3D点云渲染的实战技术。通过对比传统QVTKWidget,详细介绍了QVTKOpenGLNativeWidget在渲染效率、内存占用和兼容性方面的显著优势,并提供了完整的代码示例和性能优化策略,助力开发者在工业检测、自动驾驶等领域实现更高效的点云可视化。

keras9composer的博客 687

USB 虚拟串口

USB 虚拟串口简介 USB虚拟串口简介 USB虚拟串口属于USB通信设备类。在物理层通过USB总线,采用虚拟串口的方式为主机提供一个物理串口。在系统内部,USB控制器提供了一个批量传输IN端点和一个批量传输的OUT端点,用于数据的接收和发送,模拟串口的RX和TX线。另外USB控制器还提供中断IN端点,发送当前串口的状态,实现对串口传输的控制。串口设备的数据,由系统的串口采集,在芯片内完成USB包的封装,通过USB总线上传至主机,再由相应的串口应用程序进行处理。对用户来说,看到的是基于串口的数据采集和传输

嵌入式与人工智能 1万+

MacOS Intel芯片实战:Docker Compose一键部署Dify全流程解析

本文详细解析了在搭载Intel芯片的MacOS系统上,使用Docker Compose一键部署开源LLM应用开发平台Dify的全流程。内容涵盖环境准备、Docker配置与镜像加速、代码拉取与配置初始化、服务启动与问题排查,以及访问验证与初步探索,旨在帮助开发者快速在本地搭建私有化AI应用开发环境。

ik678901234的博客 619

YOLO系列算法改进 | 自研篇 | C3k2融合SEFN空间增强前馈网络模块 | 去模糊和提升图像细节特征,精度涨点!| WACV 2025

YOLO系列算法改进 | 自研篇 | C3k2融合SEFN空间增强前馈网络模块 | 去模糊和提升图像细节特征,精度涨点!| WACV 2025 (以YOLO26最新目标检测模型为基础,C3k2融合SEFN空间增强前馈网络模块改进Backbone)

2502_91881744的博客 238

USB转串口设备linux随笔

第一个USB转串口设备: # find /sys/bus/usb/devices/ -name "ttyACM*" # # find /sys/bus/usb/devices/1-1.4/ -name "ttyACM*" /sys/bus/usb/devices/1-1.4/1-1.4.1/1-1.4.1:1.0/tty/ttyACM0 第二个USB转串口设备: # find /sys/bus/usb/devices/ -name "ttyUSB*" # # find /sys/bu.

phmatthaus的专栏 3782

PyCharm 接入 OpenAI Codex CLI 的 4 步配置与调试实录

揭示 Codex CLI 在 PyCharm 中上下文失稳的四大根源:CLI 启动模式与 IDE 进程模型冲突、stdin/stdout 流式处理不兼容、环境变量污染、AST 注释缺失,并给出基于 Shell 脚本桥接与结构化上下文注入的稳定接入方案。

weixin_42627902的博客 372

ZYNQ linux上使用 USB CDC ACM

协议本质。

Po33BdqR3的博客 184

【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。

qq_35635374的博客 2600

【100%通过率】华为OD机试真题 C 实现【最多等和不相交连续子序列】【2022.11 Q4 新题】

给定一个数组,我们称其中连续的元素为连续子序列,称这些元素的和为连续子序列的和。数组中可能存在几组连续子序列,组内的连续子序列互不相交且有相同的和。求一组连续子序列,组内子序列的数目最多。输出这个数目。

MISAYAONE的博客 1万+

4.linux系统USB串口绑定与设备管理

27:0527:34OpenCV的定义与发展历程27:39定义:OpenCV全称为Open Source Computer Vision Library,是一个开源计算机视觉库,具有开源特性,全球开发者可免费使用、修改和分发其代码。里程碑意义:为计算机视觉领域带来新活力,提供丰富工具和算法,推动技术在安防监控、自动驾驶等领域的广泛应用。版本迭代:2.x版本开始支持Python,降低开发门槛4.x版本升级DNN模块,提升深度学习任务性能。

2501_93696036的博客 1078

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

上一篇: Cstring 内存分配机制
下一篇: linux 那些事儿系列
蜗牛Running
博客等级 码龄12年 61粉丝 41原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值