MATLAB手写CNN识别MNIST:从卷积到反向传播的完整工程解析
简介面向MATLAB用户与深度学习初学者的CNN手写数字识别资源以MNIST经典手写数字数据集为对象完整演示卷积神经网络的原理与实现覆盖数据预处理、模型构建、训练与评估流程。资源共16个文件压缩包仅12.42MB包含11个MATLAB源码文件涵盖卷积、池化、激活、分类及测试等核心模块、MNIST原始数据文件idx3-ubyte图像与idx1-ubyte标签、1份PDF原理文档以及1个训练好的模型文件结构紧凑可直接加载复现便于课堂演示与自主实验。已有643人学习参考。通过源码可逐行学习卷积层、池化层、全连接层及Softmax分类器的具体写法理解滤波器扫描与特征提取机制PDF文档系统讲解CNN在MNIST上的识别原理、训练策略与调参思路配合可视化脚本能够快速复现并直观查看识别效果适合课程设计、算法入门与智能信号处理实践参考。1. 从MNIST到CNN这份资源到底能解决什么问题上个月我接到一个二维特征图分类的活第一反应是拿现成的深度学习框架跑。结果数据预处理、模型导出处处受制最后我翻出这份保存了很久的CNN-MNIST手写识别程序和PDF熬夜看完了才发现自己一开始就绕了远路。这个包解决的问题很朴素用经典MNIST手写数字集做CNN识别把28x28像素的灰度图像分类成0到9。但它不是那种导入即用的黑盒模型而是把卷积、池化、ReLU、Softmax以及反向传播全部用MATLAB一行行写出来的完整工程。适合谁两类人一是课程作业或项目里需要展示CNN原理的学生二是要在MATLAB里把CNN拆开改造成自定义信号分类的开发者。读这份代码比任何框架封装都更能理解神经网络到底在做什么。2. 资源拆包文件清单与MATLAB实现全貌2.1 文件级拆解每个.m文件在CNN训练里的角色打开压缩包第一眼会被一堆.m文件绕晕。我按用途把它们分成四组数据读写、网络算子、训练主流程、可视化工具。先看一张完整的文件角色表方便后面对着名字找代码。文件角色loadMNISTImages.m读取MNIST图像文件idx3-ubyte输出归一化到[0,1]的double矩阵loadMNISTLabels.m读取MNIST标签文件idx1-ubyte输出0-9的列向量Conv.m卷积层前向含卷积核翻转Pool.m最大池化层前向ReLU.mReLU激活函数MNIST Softmax.mSoftmax分类器文件名带空格实际使用时建议改成下划线MnistConv.mCNN主训练函数组织前向、反向、权重更新TestMnistConv.m测试与预测入口加载数据、调用训练或加载MnistConv.matdisplay_network.m将权重矩阵可视化为小格子图片PlotFeatures.m绘制卷积层输出的特征图rng.m随机种子控制注意会覆盖MATLAB内置rng函数MnistConv.mat保存训练好的权重和偏置CNN-MNIST手下识别.pdf原理讲解把CNN识别和MNIST手写数字识别从数学推导到代码对应串讲这个包的核心是MnistConv.m和TestMnistConv.m这一对入口脚本。前者负责训练后者负责验证。数据文件不是压缩包自带的需要你根据loadMNISTImages.m和loadMNISTLabels.m的格式去下载MNIST原始二进制文件。如果你做的是智能信号处理方向完全可以把这套数据读写模块替换成自己的传感器数据网络主体不用动。2.2 数据流视角从原始图像到分类概率的完整链路整个CNN识别的流程可以浓缩成一条链路原始图像文件 - 字节流解析 - 归一化矩阵 - 卷积-池化-激活的多次交替 - 全连接展平 - Softmax概率分布。MNIST原始图像是28x28的灰度图每个像素0到255。loadMNISTImages.m解析IDX头后会把像素值除以255缩放到0到1避免数值进入激活函数的饱和区。进入网络后常见实现会按这个维度走第一层卷积用5x5x1的20个卷积核在28x28输入上做valid卷积得到24x24x20特征图ReLU激活后接2x2最大池化变成12x12x20第二层卷积用5x5x20的20个核输出8x8x20再ReLU和池化变成4x4x20最后把这4x4x20共320个数值展平接一个输出维度为10的全连接层经过Softmax得到每个数字类别的概率。这个网络是经典LeNet-5的极简版参数少但足够跑通全流程。值得留意的是MNIST手写数字识别的常见目标是99%以上的准确率但那是基于现代框架和大量调优的结果。这份手写MATLAB代码如果达到97%左右已经说明网络结构、梯度计算和数据预处理三者基本正确。以后换成自己的数据集先跑通这个基线再逐步上调准确率。2.3 自研CNN与深度学习工具箱的差异为什么手写反向传播值得读MATLAB自带的深度学习工具箱用起来非常快layerGraph加trainNetwork两行就能租出一个卷积网络但问题在于它把卷积、池化、梯度传播全封装成了黑匣子。当你遇到为什么准确率上不去这个卷积核到底在学什么这类问题时黑匣子给不出答案。这份代码的价值恰恰在于你可以在Conv.m里看到卷积核如何翻转180度在Pool.m里看到最大值从哪里被取出来在Softmax.m里看到交叉熵梯度为什么等于p减y。我自己拆源码的习惯是先把每个算子的输入输出尺寸打印出来用disp查shape再用断点走一遍MnistConv.m的训练循环。这套代码没有封装所有中间变量都暴露在函数作用域里特别适合做这种物理级调试。看懂它之后再去用工具箱里的网络层你会很清楚每一层背后在算什么。3. 核心模块逐段拆解卷积、池化、ReLU与Softmax3.1 Conv.m最简卷积前向实现卷积是CNN识别里计算量最大的部分。这里的Conv.m只做前向计算输入是图像块和卷积核输出是特征图。一个常见的最简实现长这样function out Conv(x, W, b) % 输入 % x : [h, w, c, n] 图像块h/w为高宽c为通道数n为样本数 % W : [kh, kw, c, fn] 卷积核kh/kw为核尺寸fn为输出通道数 % b : [fn, 1] 偏置 % 输出 % out : [oh, ow, fn, n] 卷积特征图oh h - kh 1 [h, w, c, n] size(x); [kh, kw, ~, fn] size(W); oh h - kh 1; ow w - kw 1; out zeros(oh, ow, fn, n); for ni 1:n for fi 1:fn for ci 1:c % 单通道二维卷积conv2默认做相关rot90翻转180度才是真正卷积 out(:, :, fi, ni) out(:, :, fi, ni) ... conv2(x(:, :, ci, ni), rot90(W(:, :, ci, fi), 2), valid); end out(:, :, fi, ni) out(:, :, fi, ni) b(fi); end end end逻辑说明最外层遍历每个样本第二层遍历每个输出滤波器第三层遍历每个输入通道。每次用一个输入通道和对应的卷积核做二维卷积结果累加到对应的输出特征图上最后加上该输出通道的偏置。valid模式表示卷积核不越界输出尺寸自动缩小kh-1和kw-1。这里最容易被忽略的是rot90(W, 2)因为conv2计算的是相关运算而数学定义上的卷积需要把核翻转180度翻转后才是严格的卷积操作。参数说明kh和kw通常取5或3MNIST输入h28、w28时用5x5核输出24x24。如果你想保持尺寸不变可以在卷积前手动pad一圈零再把conv2的shape改成same。如果后续要加反向传播需要在Conv函数内部缓存输入x常见做法是把输入保存到global变量或返回一个结构体方便梯度计算时回放。3.2 Pool.m与ReLU.m降采样和激活的配合池化和激活是贴在卷积层后面的标准搭配。Pool.m用最大池化把特征图缩小一半保留局部最强的响应ReLU把负值压成0引入非线性。下面这两个函数是精简前向实现function out Pool(x, poolSize) % 最大池化stride默认等于poolSize % x : [h, w, c, n]poolSize : 2 表示2x2窗口 [h, w, c, n] size(x); oh floor(h / poolSize); ow floor(w / poolSize); out zeros(oh, ow, c, n); for ni 1:n for ci 1:c for i 1:oh for j 1:ow patch x((i-1)*poolSize1 : i*poolSize, ... (j-1)*poolSize1 : j*poolSize, ci, ni); out(i, j, ci, ni) max(patch(:)); end end end end endfunction out ReLU(x) % 整流线性单元所有负值置0 out max(x, 0); end逻辑说明Pool.m把输入分成不重叠的2x2小块每个块取最大值。这样24x24的特征图变成12x12有效降低了后续全连接层的参数数量同时让网络对微小平移不那么敏感。ReLU.m只有一个max操作但要注意它在前向时必须保存输入x因为反向传播时梯度要乘以一个0/1掩码只有输入大于0的位置梯度才能通过。参数说明poolSize一般固定为2也可以设成3但MNIST本身只有28x28池化太狠会把信息丢光。这两个函数都没有做反向传播如果你打算训练需要扩展它们。常见的做法是Pool.m在返回输出同时把每个窗口最大值的索引存成一个index矩阵ReLU.m把x大于0的布尔掩码缓存到函数外部变量。后文讲MnistConv.m时你会看到这些缓存值如何参与梯度计算。3.3 Softmax.m与全连接输出交叉熵梯度为什么是p减y全连接层输出10个数字对应的得分叫logitSoftmax把这些得分变成概率分布。这个函数很短但有几个细节值得掰开讲function p Softmax(z) % z : [K, n]每列对应一个样本的logit输出 % 返回p每列元素和为1 z z - max(z, [], 1); % 减去每列最大值防止exp溢出 e exp(z); p e ./ sum(e, 1); end逻辑说明第一行对每一列都减去该列的最大值。如果z里有一个数字是100直接exp就会得到Inf整个softmax输出变成NaN减去最大值后最大指数是0exp不会溢出而且这个变换不会改变概率之间的比例关系。e的每一列除以该列之和得到满足和为1的概率向量其中最大值对应的类别就是网络预测。整个过程完全等价于教科书公式只是多了数值稳定性处理。真正关键的是反向传播。训练时如果使用交叉熵损失softmax层和交叉熵联合求导有一个非常漂亮的结论梯度等于p减y_onehot。也就是网络输出的概率矩阵减去真实标签的onehot编码矩阵。MnistConv.m里会先构造一个10xN的onehot矩阵标签为1的位置写1其余写0然后直接算dz softmax输出减去onehot。这个dz随后回传到全连接层更新权重。手写代码时推荐直接利用这个结论而不是一步步求导省时间也不会错。3.4 MnistConv.m主函数一个训练迭代的内部展开MnistConv.m是整份资源的心脏它把前面所有算子串起来还要负责反向传播和参数更新。由于原始脚本可能写得比较长我这里只抽出核心训练循环骨架展示数据如何在各层之间流转function [W1, W2, W3, b1, b2, b3] MnistConv(X, y, ... W1, W2, W3, b1, b2, b3, alpha, batchSize, epochs) % X : 784 x NN为样本数 % y : N x 1标签取值0-9 N size(X, 2); for epoch 1:epochs idx randperm(N); % 洗牌让每个batch分布更随机 nBatch floor(N / batchSize); for batch 1:nBatch ib (batch-1)*batchSize 1 : batch*batchSize; Xb X(:, idx(ib)); yb y(idx(ib)); % 前向卷积ReLU池化重复两次 h1 Conv(reshape(Xb, 28, 28, 1, []), W1, b1); a1 ReLU(h1); s1 Pool(a1, 2); h2 Conv(s1, W2, b2); a2 ReLU(h2); s2 Pool(a2, 2); % 展平后全连接得到10类得分 z W3 * s2(:) b3; p Softmax(z); % 反向梯度从softmax层开始 dz p - onehot(yb, 10); % 省略中间层梯度推导最终更新W3/W2/W1 W3 W3 - alpha * dz * s2(:); % ...类似更新b3, W2, b2, W1, b1 end end end逻辑说明每个epoch开始时把样本顺序随机打乱然后按batchSize切块。前向过程依次经过第一层卷积、ReLU、池化第二层卷积、ReLU、池化然后全连接和Softmax。反向传播的入口是dz p - onehot(yb)这个变量同时包含了softmax和交叉熵的梯度信息后面所有层的梯度都要从它一层层反推回去。权重更新用的是最朴素的梯度下降没有动量也没有Adam因此学习率alpha必须设置得保守。参数说明alpha一般取0.01batchSize取50epochs取10到20。如果你的数据分布和MNIST不同alpha需要重新调整常见的经验是损失暴涨时先降到0.001再试。s2(:)是把4x4x20的特征图展平成320x1的向量注意S2在反向传播时还要参与卷积层梯度计算所以代码里需要保存每次前向的中间结果。4. 环境配置与运行从零跑通测试脚本4.1 MATLAB版本与工具箱要求这份代码是纯.m脚本不依赖深度学习工具箱因为卷积、池化、激活全部手写了。核心计算只用了conv2和max这类基础函数这两个函数在MATLAB的各种版本里都长期存在所以版本兼容性很好。我测试用的环境是相对较新的版本运行没有任何警告如果你的版本比较老只需注意conv2的valid参数行为一致即可代码本身没有用到工具箱专属接口。唯一需要提防的是项目自带的rng.m会遮蔽MATLAB内置的随机数控制函数这个坑在避坑章会细说。运行前可以先把当前目录设置成解压后的文件夹再用addpath加上该目录确保所有.m文件都在搜索路径上。如果脚本报未定义函数错误十有八九是路径没加对。4.2 数据准备MNIST原始文件的加载MNIST数据集包含四个IDX格式二进制文件训练图像、训练标签、测试图像、测试标签。它们的文件名一般是train-images-idx3-ubyte、train-labels-idx1-ubyte、t10k-images-idx3-ubyte、t10k-labels-idx1-ubyte。把这四个文件放在当前工作目录然后调用资源里的两个加载函数trainImages loadMNISTImages(train-images-idx3-ubyte); trainLabels loadMNISTLabels(train-labels-idx1-ubyte); testImages loadMNISTImages(t10k-images-idx3-ubyte); testLabels loadMNISTLabels(t10k-labels-idx1-ubyte);加载完成后trainImages是784x60000的double矩阵每一列是一张28x28图像展开的像素数值已经归一化到0到1trainLabels是60000x1的列向量每个元素是0到9的整数。如果加载后出现图像上下颠倒或者亮度反相多半是IDX头解析或大小端问题可以先检查fread的读取顺序。4.3 跑通TestMnistConv.m与结果验证数据准备好了直接运行入口脚本TestMnistConv如果脚本默认从MnistConv.mat加载已经训练好的权重它会直接在测试集上做预测输出类似Accuracy 97.12%的结果。如果脚本内部串联了MnistConv.m重新训练则在纯CPU环境下训练10个epoch大概需要几分钟期间你会看到损失值逐步下降。训练结束后同样会打印测试集准确率。运行成功后可以用可视化函数看看卷积核学到了什么。第一个卷积层的权重W1一般是5x5x20的矩阵经过display_network.m画出来后你会看到类似边缘检测器的纹理display_network(W1);如果只是想看中间特征图可以调用PlotFeatures.m它会把某一张手写数字通过第一个卷积层后的20张特征图并排显示。这些可视化是检验网络是否真的在设计特征的好工具比只看准确率更直观。假如运行报错优先检查当前目录下是否有全部.m文件和四个原始数据集文件。5. 避坑指南MATLAB手写CNN常见问题与排查5.1 图像索引错位MNIST标签与图像对齐现象训练过程中损失函数在下降但最终预测准确率乱成一团甚至低于20%和瞎猜差不多。原因MNIST的图像文件和标签文件是分开存储的两者靠文件内部顺序一一对应。如果loadMNISTImages.m和loadMNISTLabels.m对IDX文件头的解析方式不一致比如偏移量读错几个字节会导致图像和标签错位。更隐蔽的是维度转置问题图像加载成784x60000标签是60000x1MATLAB有时会自动广播但一旦你手动对图像矩阵做了转置标签就张冠李戴了。解决加载数据后立即做可视化校验看第一张图和它的标签是否吻合figure; imshow(reshape(trainImages(:, 1), 28, 28), []); disp(trainLabels(1));如果图像明明是一张4标签却显示7那就得去检查loadMNISTImages.m里fread的头部读取。IDX图像文件头长度为2051字节标签文件头为2049字节偏移量错了会全盘错位。我自己的习惯是写一个辅助脚本随机抽10张图打印标签跑通数据链路再碰网络。5.2 梯度消失与学习率不匹配现象训练几个batch后损失变成了NaN或者权重矩阵出现Inf。另一种情况是训练了很久损失都不怎么降准确率停滞在10%左右。原因手写实现里没有权重初始化策略如果初始权重过大经过多层卷积和ReLU以后数值爆炸。Softmax计算时exp遇到大数直接溢出反向传播的梯度变成NaN。相反学习率设太大比如0.5一次梯度更新就把参数推到无穷远整个模型当场失效。这两个问题常常同时出现。解决先把学习率降到0.01附近如果还发散就继续降到0.001。权重初始化用随机均匀分布范围控制在[-0.1, 0.1]。在前向的每一层后面加一句断言定位爆点assert(all(isfinite(a2(:))), 第二层输出出现非有限值);这样一旦输出变成无穷或NaN运行立即暂停你能看到是第几层出的问题。记住手写网络没有自适应优化器兜底学习率和初始化就是生命线。5.3 内存崩溃与数据类型陷阱现象脚本运行到一半MATLAB弹出内存不足对话框或者调用conv2时提示输入参数必须是double或single类型。原因MNIST训练集60000张图像每张784像素用double矩阵存储约占360MB本身不大。但如果代码里把整个训练集一次reshape成28x28x1x60000的四维数组内存占用会瞬间翻几倍峰值超过2GB也正常。另一层原因是loadMNISTImages.m如果直接按uint8读出就交给conv2conv2不支持整型输入必然报错。解决加载后统一用double()转换循环处理时每次只取一个batch不要一次性生成全部四维数据。测试阶段可以随机抽1000张跑评估结果差异不大。如果内存仍然紧张把图像数据转成single类型内存减半卷积前向精度几乎无损。5.4 与MATLAB自带rng函数同名冲突现象每次运行脚本得到的准确率都不同明明想复现结果却始终对不上有时候调用rng(default)报错输入参数过多。原因压缩包里自带一个rng.m文件。当这个文件所在的目录被加入搜索路径后MATLAB会优先调用它而不是内置的随机数控制函数。内置rng(default)接收字符串参数自带rng.m如果只支持数字入参就会触发参数数量错误。这个问题极其隐蔽很多人会把锅甩给随机种子实际上只是函数遮蔽。解决检查工程根目录下的rng.m先把它改名比如改成RandSeed.m然后全局替换脚本里的rng(...)调用为RandSeed(...)。更稳妥的做法是把随机控制代码单独放进子目录不要放在和Conv.m同级的根目录。从那以后我拿到别人的MATLAB工程第一件事就是搜有没有和内置函数同名的文件。5.5 验证集缺失导致过拟合不自知现象训练集准确率一路涨到99%测试集准确率却只有90%相差巨大。脚本里没有验证集你完全感觉不到什么时候开始过拟合。原因很多教学版MnistConv.m只划分训练集和测试集训练集同时充当了验证集。网络反复看同一批样本把噪声也记住了泛化能力下降但测试要到最后才知道调参时非常被动。解决从训练集末尾切出5000张做验证集每个epoch结束后跑一次验证集准确率。一旦验证集准确率连续几个epoch不升甚至下降就停止训练并回退到验证集最好的那一轮权重。这种做法是深度学习里的家常便饭但对这份手写代码来说需要自己写十几行循环逻辑并不复杂改造成本很低。6. 二次开发把这份代码改造成你的第一个CNN项目6.1 改造方向一加入验证集与早停原脚本一般只用训练集和测试集网络会在某个节点过拟合。从训练集尾部切出5000张作为验证集每跑完一个epoch计算验证集准确率当连续3个epoch不上升就break并恢复到验证集最佳时的权重。这样准确率能稳定在98%左右你不会再被随机波动干扰判断。6.2 改造方向二从灰度到彩色或换成自定义数据集MNIST输入是28x28x1的灰度图。如果你想识别彩色图像把数据读取部分改成读RGB三个通道输入维度变成32x32x3同时把Conv.m里W1的第三维由1改成3。分类数量也要改全连接层输出从10改成你实际类别数比如垃圾图片二分类就是2。注意彩色图像如果范围是0到255必须除以255完成归一化否则第一层卷积的输出会很大直接扰乱后面的ReLU。6.3 通用重构把硬编码参数抽成配置原代码里核大小、通道数、学习率散落在各个函数里改参数要翻好几个文件。建议在入口脚本开头定义一个配置结构体config.imgSize [28 28 1]; config.conv1.filterSize 5; config.conv1.numFilters 20; config.poolSize 2; config.lr 0.01; config.batchSize 50; config.epochs 10;以后所有算子通过config传参切数据集只改配置不碰算法代码。这也是我把这套代码改造到一维振动信号分类时总结出的血泪经验一旦结构乱了改一个参数要查半天哪一行才是源头甚至会把学习率改成了0.5导致整个模型翻车。从那以后我每次拿到别人的深度学习代码都会先做配置化重构再动手训练希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于ResNet-50的人脸多属性识别:多任务学习工程实践与踩坑复盘

基于ResNet-50的人脸多属性识别:多任务学习工程实践与踩坑复盘

需求方最开始给的需求只有一句话:给一张正脸照片,同时返回年龄、性别、人种三个属性。团队里很快分成两派,一派认为老老实实训三个模型最稳,另一派想把三个任务塞进同一个网络里用多任务学习一把搞定。最终我们选了后者&#xff0…

2026/10/18 9:33:31 阅读更多 →
Java版Personal Agent实战:基于Spring Boot与Spring AI构建生产级智能体

Java版Personal Agent实战:基于Spring Boot与Spring AI构建生产级智能体

1. 这个 Java 版 Personal Agent 到底解决了什么问题1.1 从“调个 API”到“跑一个 Agent”,中间差了什么过去一年,围绕大模型的工程实践基本分成了两条路。一条是 Python 生态里各种 Agent 框架快速迭代,另一条是 Java 生态里大量业务系统想…

2026/10/18 9:32:31 阅读更多 →
Oracle 11.2.0.3 GI PSU 终极补丁 p20996944 安装与避坑指南

Oracle 11.2.0.3 GI PSU 终极补丁 p20996944 安装与避坑指南

简介:本资源为 Oracle 11.2.0.3 版本最后一个 GI(Grid Infrastructure)PSU 补丁包,版本号 .15,同时包含数据库组件,适用于仍在使用该版本、需要完成安全加固与稳定性维护的 DBA 及运维人员。补丁包文件名 p…

2026/10/18 9:32:31 阅读更多 →

最新新闻

告别熬夜改稿:AI辅助PPT制作全流程效率提升实战指南

告别熬夜改稿:AI辅助PPT制作全流程效率提升实战指南

凌晨两点十七分,我对着同一页公司介绍已经改了第九遍,只因为上面那条业务模块的配图怎么摆都差那么点意思。这不是我第一次为PPT熬夜,也大概率不会是最后一次——如果我没在那个周末试过那款叫PaperXieAIPPT的工具的话。真正让我把标题写成“…

2026/10/18 10:07:39 阅读更多 →
视频深度理解三阶段方案:先浏览再定位后精读,成本降58.3%

视频深度理解三阶段方案:先浏览再定位后精读,成本降58.3%

这阵子我一直在折腾视频长内容的深度理解。这里说的深度理解,不是随便剪一段视频丢给模型让它出个总结,而是像Deep Research那样,针对一个具体的问题,从视频里挖出答案、收集证据、整理成结论。网页文本上的Deep Research已经跑得…

2026/10/18 10:07:39 阅读更多 →
【WSL】让WSL2后台持久运行不自动关闭的解决方案:TaoToken 统一 Key 通道下的 systemd 与 dbus-launch 配置

【WSL】让WSL2后台持久运行不自动关闭的解决方案:TaoToken 统一 Key 通道下的 systemd 与 dbus-launch 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 10:07:39 阅读更多 →
用状态机设计游戏主菜单:Pygame经典游戏架构实践

用状态机设计游戏主菜单:Pygame经典游戏架构实践

复刻“Mario Forever”这类经典游戏时,很多人会把精力放在关卡设计、跳跃手感、敌人 AI 上,结果做到一半才发现,光是“主菜单”这一个环节就已经暴露出大量工程问题。菜单上下项选择不顺畅、按钮点击后进程卡死、从暂停返回主菜单时状态全乱、…

2026/10/18 10:07:39 阅读更多 →
AI生成3D资产如何批量导入虚幻引擎?Blender中继管线指南

AI生成3D资产如何批量导入虚幻引擎?Blender中继管线指南

过去几年里,AI 生成 3D 资产已经从“玩一玩”变成了很多工作室认真评估的生产方式。现在你完全可以用 Opus 5.5 这类 AI 工具快速产出一整套物件的模型:木箱、油桶、石柱、路灯、管道,几分钟就给你几十个。看起来效率已经起来了,但…

2026/10/18 10:07:39 阅读更多 →
AI生成SVG动画实战:从提示词编写到性能优化的完整指南

AI生成SVG动画实战:从提示词编写到性能优化的完整指南

最近做前端动效时,试了一种新玩法:直接让AI大模型写SVG动画。之前这类动效要么用Lottie配AE插件,要么自己熬夜调path和keyframes,工作量和调试成本都不小。而这几天拿到一个内测的预览版AI对话模型,我试着把页面里几个…

2026/10/18 10:06:39 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →