Excel 批量导入实战:当 EasyExcel 遇上单元格嵌入附件

从EasyExcel到Apache Fesod:稳定Excel导入导出迁移实战 Java开发中,Excel导入导出是高频需求,而EasyExcel因其简洁API曾广受欢迎。但随着维护节奏放缓,依赖冲突如NoSuchFieldError、Docker内缺失libfreetype6等问题频发,复杂表头与嵌套List处理也常需手写。Apache Fesod(又称FastExcel/Fastexcel)基于Apache 2.0协议,采用流式读写、精简依赖并降低字节码生成,在保持类EasyExcel开发体验的同时提升稳定性。本文从迁移视角展开,分析EasyExcel的隐患,对比Fesod的API 阅读详情

Excel 批量导入实战:当 EasyExcel 遇上单元格嵌入附件

适用场景:后端需要解析用户上传的 Excel,其中不仅包含常规文本数据,还包含直接嵌入单元格的附件(zip、docx、图片等),要求一次性完成数据入库、附件落盘、关联业务实体。


一、场景与痛点

在常见的 B 端后台中,运营/产品同学往往通过一份 Excel 模板批量录入业务数据。模板里除了常规字段,还经常出现“需求附件”列——用户把文件直接拖进 Excel 单元格里。这对后端提出了两个核心挑战:

  1. MultipartFile 的流只能读一次:EasyExcel 读完之后,如果再用 POI 读,流已经耗尽。
  2. Excel 里的附件不是超链接,而是二进制对象:需要精确解析 OLE、OOXML、图片三种嵌入形态,并按行号对应回业务数据。
  3. Excel中的附件类型,名称获取问题:excel对实体附件的数据和名称存储在不同的位置,需要根据特定的格式进行解析,且部分格式如:.xlsx和.docx格式的名称并无存储,本文暂时只找到对.zip的名称支持。

本文以“设计需求批量导入”模块为实例,给出一条可复用的工程化路径。


二、技术栈选型

组件 用途 版本参考
EasyExcel 快速读取文本数据、类型转换、注解映射 2.x / 3.x
Apache POI (XSSF) 解析底层 OOXML 结构,提取单元格嵌入对象 5.x
Hutool 字符串、集合、空值工具 5.x
Spring Boot 事务控制、Service 层编排 3.x
自定义 OSS 工具 附件上传、路径管理 —

为什么不只用 EasyExcel?
EasyExcel 专注于高性能的文本/数值读取,对单元格内嵌 OLE/图片对象只提供有限支持。对于“需要把附件捞出来并上传 OSS”的场景,必须下沉到 Apache POI 的 XSSFWorkbook + XSSFDrawing 层做原生解析。


三、整体架构流程

用户上传 Excel (.xlsx)
        │
        ▼
┌───────────────────┐
│ 1. 读取字节数组    │  ← 关键:先复制 bytes,解决流不可重复读
│ byte[] fileBytes  │
└───────────────────┘
        │
    ┌───┴───┐
    ▼       ▼
EasyExcel  Apache POI
(文本数据)  (嵌入附件)
    │       │
    ▼       ▼
List<VO>  List<EmbeddingDesc>
    │       │
    └───┬───┘
        ▼
┌───────────────────┐
│ 2. 按行号关联      │  ← 把附件挂到对应 VO 上
│ vo.setAttachments()│
└───────────────────┘
        │
        ▼
┌───────────────────┐
│ 3. 逐行校验        │  ← 字典、用户、日期、多选字段、岗位-类型联动
│ validate/convert  │
└───────────────────┘
        │
        ▼
┌───────────────────┐
│ 4. 分批收集        │  ← 主表PO、用户绑定、Code映射、附件信息
│ 4 个临时集合       │
└───────────────────┘
        │
        ▼
┌───────────────────┐
│ 5. 批量写入        │  ← 先插主表,再插关联表,最后上传附件
│ insert + OSS upload│
└───────────────────┘
        │
        ▼
┌───────────────────┐
│ 6. 后置业务        │  ← 操作历史、审批流、待办、消息通知
└───────────────────┘

四、关键实现拆解

4.1 文件字节复制:解决流不可重复读

MultipartFile.getInputStream() 只能消费一次。EasyExcel 和 POI 各自需要独立流,因此第一步就是把文件读成字节数组。

byte[] fileBytes = file.getBytes();

// 1. EasyExcel 读取
List<DesignDemandImportVo> importVos = EasyExcel.read(new ByteArrayInputStream(fileBytes))
        .head(DesignDemandImportVo.class)
        .sheet("DesignDemand")
        .doReadSync();

// 2. POI 解析附件(同样基于 fileBytes)
List<ExcelAttachmentParser.EmbeddingDesc> embeddings = ExcelAttachmentParser.resolve(fileBytes);

通用经验:凡是要用两套工具解析同一个上传文件,先读 bytes,再各自 new ByteArrayInputStream,不要直接传 file.getInputStream()。


4.2 双管道解析:文本 + 附件

文本管道:EasyExcel
@Data
public class DesignDemandImportVo {
   
   
    @ExcelProperty("品类")
    private String categoryType_dictText;

    @ExcelProperty("希望交付时间")
    private String hopeDeliveryDate;

    @ExcelProperty("需求附件")
    private String attachmentZip;      // 纯占位,不需要填内容

    @ExcelIgnore
    private List<CellAttachment> attachments = new ArrayList<>(); // 真正存附件数据
}
  • 用 @ExcelProperty 做列名映射;@ExcelIgnore 字段不映射列,由代码手动填充。
  • 日期在 Excel 中可能是文本格式,所以先按 String 接收,再手动解析为 LocalDate,避免格式错乱。
附件管道:Apache POI 原生解析

ExcelAttachmentParser.resolve(byte[] xlsxBytes) 是核心工具类。它遍历 XSSFDrawing,识别三种嵌入形态:

  1. OLE 对象:zip、docx、xlsx 等,通常以 \u0001Ole10Native 或 package 条目存储在 POIFSFileSystem 中。
  2. OOXML 原生嵌入:无 OLE2 包装的直接嵌入,直接读 PackagePart 的流。
  3. 粘贴图片:XSSFPicture,通过 XSSFPictureData 获取 PNG/JPEG 字节。
public static List<EmbeddingDesc> resolve(byte[] xlsxBytes) {
   
   
    try (XSSFWorkbook workbook = new XSSFWorkbook(new ByteArrayInputStream(xlsxBytes))) {
   
   
        for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
   
   
            XSSFSheet sheet = workbook.getSheetAt(i);
            XSSFDrawing drawing = sheet.getDrawingPatriarch();
            if (drawing == null) continue;

            for (XSSFShape shape : drawing.getShapes()) {
   
   
                XSSFClientAnchor anchor = (XSSFClientAnchor) shape.getAnchor();
                int row = anchor.getRow1(); // 获取附件所在行号

                if (shape instanceof XSSFObjectData) {
   
   
                    // OLE / OOXML 嵌入对象
                    ...
                } else if (shape instanceof XSSFPicture) {
   
   
                    // 图片
                    ...
                }
            }
        }
    }
}

OLE 文件名乱码是重灾区。Windows 中文系统默认用 GBK 编码文件名,但 Office 2016+ 可能用 UTF-8。解析器做了多编码尝试 + 启发式乱码检测:

  • 优先 GBK → GB18030 → UTF-8 → 兜底 ISO-8859-1
  • 通过 looksLikeMojibake() 检测典型乱码特征(Â、Ã、¿ 等),反向选择正确编码。

下面是ExcelAttachmentParser完整代码

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.poifs.filesystem.*;
import org.apache.poi.xssf.usermodel.*;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets;
import java.util.*;

/**
 * Excel单元格嵌入附件解析器
 */
@Slf4j
public class ExcelAttachmentParser {
   
   

    public static List<EmbeddingDesc> resolve(byte[] xlsxBytes) {
   
   
        List<EmbeddingDesc> result = new ArrayList<>();
        try (XSSFWorkbook workbook = new XSSFWorkbook(new ByteArrayInputStream(xlsxBytes))) {
   
   
            // 获取所有嵌入式文件
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
   
   
                XSSFSheet sheet = workbook.getSheetAt(i);
                XSSFDrawing drawing = sheet.getDrawingPatriarch();
                if (drawing == null) continue
EasyPoi vs EasyExcel:Excel图片导出3大场景性能与实现对比 本文深度对比了EasyPoi和EasyExcel在Excel图片导出中的性能与实现差异,涵盖单图导出、多图平铺和动态位置图片三大场景。通过代码示例和性能测试数据,揭示EasyExcel在内存管理和流式处理上的优势,特别适合大量图片导出的企业级应用场景,为开发者提供实用的技术选型指南。 阅读详情

相关推荐

SpringBoot+EasyExcel实战:如何优雅地导出带多张图片的Excel(附完整代码)

本文详细介绍了在SpringBoot项目中,如何利用EasyExcel优雅地实现带多张图片的Excel导出功能。文章提供了完整的架构设计与代码示例,重点解决了图片排版错位、内存溢出等常见问题,并分享了图片压缩、异步加载、流式处理等性能优化策略,为企业级数据导出提供了可扩展的解决方案。

numpy6sculptor的博客 941

Java高效Excel导出实战:基于EasyExcel的多场景应用指南

本文详细介绍了Java高效Excel导出实战,重点解析了基于阿里EasyExcel的多场景应用指南。相较于传统Apache POI,EasyExcel凭借其流式处理模型,能有效解决大数据量导出时的内存溢出问题,显著提升性能。文章通过实战代码,深入讲解了基础导出、动态表头、单元格样式、合并、加密保护以及百万级数据分批次写入等高级功能与优化技巧,帮助开发者应对复杂业务场景,实现优雅高效的Excel导出。

weixin_29252171的博客 571

EasyExcel实战:高效导出网络图片至Excel的完整方案

本文详细介绍了使用EasyExcel将网络图片高效导出至Excel的完整实战方案。通过自定义URL图片转换器(Converter),开发者可以轻松将存储为URL链接的图片动态下载并嵌入Excel单元格,解决了传统报表中图片无法直接查看的痛点。文章涵盖了从环境准备、实体类设计、核心转换器编写到性能优化与高级技巧的全过程,适用于商品管理、数据报表等多种需要图文并茂导出的生产场景。

weixin_29202213的博客 383

EasyExcel实现单元格内多图动态嵌入:从原理到生产级解决方案

在Java后端开发中,Excel报表导出是常见的业务需求,其核心原理是通过操作文档对象模型实现数据与样式的分离。Apache POI作为底层库提供了基础API,而EasyExcel在其基础上进行了深度封装,通过流式写入和处理器机制优化了内存管理。这一技术组合在处理海量数据导出时能有效避免OOM,具有显著的工程价值,广泛应用于电商、ERP、CRM等系统的后台管理模块。当需求升级为在单个单元格内动态嵌入多张网络图片时,就需要深入理解ClientAnchor锚点定位机制,并结合图片缓存、异步加载等优化手段。本文聚

weixin_33824385的博客 172

哨兵1号(Sentinel-1)雷达SAR数据预处理全流程:从下载到精确配准

本文详细介绍了哨兵1号(Sentinel-1)雷达SAR数据从下载到精确配准的全流程预处理方法。内容涵盖SLC与GRD数据选择、ASF平台下载技巧,并重点解析了使用SNAP软件进行几何校正、辐射定标及高精度配准的核心步骤,为InSAR形变监测等应用提供可靠的数据基础。

weixin_29208327的博客 477

经典EMC案例-汽车车载电子行车记录仪显示屏EMC BCI整改案例

拿到这款汽车前装车载电子行车记录仪,小编首先在实验室还原客户描述的现象,确定现象符合客户的描述,再根据现象出现的对应频率做好记录,因为通常BCI FAIL的现象不局现于一个频率点,然后通过这些现象及频点,再结合产品的构造、线束,分析构思出大致解决方案。

jack_luo4913的博客 3737

使用JAVA 的 POI 库 将DOC文件转为DOCX文件

java使用POI库,将doc文件转为docx文件

qq_45808266的博客 5702

Frigate进阶玩法:如何用MQTT和Python脚本扩展你的自定义目标检测算法

本文详细介绍了如何通过MQTT和Python脚本扩展Frigate的自定义目标检测算法,无需修改源码即可实现特殊场景(如工业设备异常、农业病虫害识别)的高效检测。文章涵盖Frigate配置、外部检测服务构建、高级集成技巧及性能优化实践,帮助开发者灵活扩展智能监控能力。

weixin_42662293的博客 348

利用ORCAD/pspice 仿真分析电路的幅度相位谱

利用ORCAD的pspice仿真分析电路的相位谱1.介绍2.搭建电路原理图3.建立仿真文件,进行交流分析4.仿真、查看输出5.总结 1.介绍 orcad配合pspice一直是电路原理图绘制和仿真的主要工具,pspice工具提供了诸如暂态分析、直流分析、交流分析等多个工具。学校主要教的是multisim,对orcad讲得很少,最进要利用orcad对运放构成的电路的频响、相移特性进行分析,发现资料幅度...

qq_40011737的博客 1万+

Halcon实战:5分钟搞定灰度图转热力图(附完整代码)

本文提供了一份Halcon实战指南,详细讲解如何在5分钟内将灰度图转换为直观的热力图。通过核心代码演示了利用HSV颜色模型进行色彩映射的原理与步骤,包括图像归一化、通道构建与空间转换,并附赠了深度图可视化等进阶应用技巧,帮助工程师快速提升图像分析效果。

weixin_29240343的博客 282

【YOLO26实战全攻略】08——YOLO26模型导出与部署全攻略:从训练权重到生产环境(含5种格式+INT8量化+实战案例)

本文聚焦YOLO26模型从训练权重到生产环境的全流程部署,针对“训练精度高、部署效果差”的行业痛点,详解其无NMS端到端推理、量化友好架构、全格式导出三大核心优势。内容涵盖ONNX、TensorRT、OpenVINO、TFLite、CoreML五种主流格式的导出原理与实操步骤,深入剖析INT8量化、混合量化等边缘优化技术,并通过智慧园区车辆检测虚拟案例,完整演示从模型准备、格式导出、引擎适配到性能验证的全流程。文中提供可直接复制运行的代码、详细执行结果及避坑指南,兼顾新手入门与进阶读者提升,更好的帮助读者。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 500

Python爬虫技术应用:体育赛事直播数据抓取与分析

Web爬虫(Web Crawling)是一种通过模拟浏览器行为从网站获取数据的技术。发送请求:发送HTTP请求(通常是GET或POST请求)获取目标网页的HTML内容。解析网页:使用解析工具(如lxml)从HTML中提取出所需要的信息。存储数据:将抓取到的数据存储到数据库、文件或数据结构中,供后续分析和使用。数据分析与展示:使用数据分析工具(如PandasMatplotlib)对数据进行处理、清洗和可视化,生成有价值的报告和图表。Requests:用于发送静态网页的HTTP请求并获取响应。

2201_76125261的博客 1309

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

上一篇: Nginx 匹配规则深度解析:原理、优先级与优化策略
sakura x
博客等级 码龄7年 41粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值