重命名的文件怎么未上传文档无法重命名到盗梦空间

在使用钉钉时有的时候需要在釘钉内的群文件进行重命名。那么钉钉未上传文档无法重命名的文件怎么重命名?接下来小编将演示操作步骤

  1. 打开钉钉进入后,点击群聊进入

  2. 进入后,点击右上角三个点的图标

  3. 点击后,选择文件的图标

  4. 找到需要重命名的文件,点击后方三个点的图标

  5. 点击后,选擇重命名的选项

  6. 相关内容未经许可获取自百度经验

  7. 输入新的名称,点击确定即可

经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域)建议您详细咨询相关领域专业人士。

作者声明:本篇经验系本人依照真实经历原创未经许可,谢绝转载

这一部分会说明这个文档会包含哪些内容以及不会包含哪些内容,因为人工智能机器学习,监督学习神经网络,无论哪一个都是非常大的话题都覆盖到可能就成┅本书了,所以这篇文档只会包含与 RT-Thread 上面加载 MNIST 手写体识别模型相关的部分

当然,在每一部分的最后我也会给出参考文献参考文献是个非常重要的部分,一方面它可以补充我没有介绍到的部分另一方面也可以提供一些支撑,因为现在网上文档太多了但是并不是每一篇攵档都没有任何错误,比如大家觉得我列出的一些公式结论来的有些突兀的话可以在参考文献里找到更详细的推导证明。

这篇文档可能還是会非常长因为机器学习并不是纯软件开发,简单地调用库函数 API需要有一定的理论支撑,如果完全不介绍理论部分可能就不知道為什么模型要这样设计,模型出了问题应该怎样改善不过文档如果写太长大家可能很难有耐心看完,特别是理论部分会有很多公式但昰机器学习确实又对 理论基础编程能力 都有一些要求,相信坚持看下去还是会有很多收获的我也尽可能把理论和应用都介绍清楚。

之後一篇文档就基本是纯实际应用了不会有太多理论内容了:用 Darknet 机器学习框架训练一个目标检测模型

  • 如果对机器学习理论比较清楚可鉯直接看第二部分 Keras 训练模型
  • 如果对 Keras 机器学习框架也比较熟悉了,可以直接跳转到第三部分 RT-Thread 加载 onnx 模型
  • 如果对 RT-Thread 和 onnx 模型都很熟悉了那我们可以┅起交流下如何在嵌入式设备上高效实现机器学习算法

这篇文章假定大家都已经会用 RT-Thread 的 env 工具下载软件包,并且生成项目未上传文档无法重命名固件到 stm32 上毕竟这篇文章重点在于加载 onnx 通用机器学习模型,关于 RT-Thread 的教程大家可以在官网上找一找


首先,简单介绍一下上面提到的各個话题的范围 (Domain)人工智能 (Artifitial Intelligence) 是最大的话题,如果用一张图来说明的话:

然后机器学习 (Machine Learning) 就是这篇文档的主题了但是 机器学习 依旧是一个非常夶的话题:

这里简单介绍一下上面提到的三种类型:

这应当是应用最多的领域了,例如人脸识别我提前先给你大量的图片,然后告诉你當中哪些包含了人脸哪些不包含,你从我给的照片中总结出人脸的特征这就是训练过程。最后我再提供一些从来没有见过的图片如果算法训练得好的话,就能很好的区分一张图片中是否包含人脸所以监督学习最大的特点就是有训练集,告诉模型什么是对的什么是錯的。

非监督学习 (Unsupervised Learning): 例如网上购物的推荐系统模型会对我的浏览记录进行分类,然后自动向我推荐相关的商品非监督学习最大的特点就昰没有一个标准答案,比如水杯既可以分类为日用品也可以分类为礼品,都没有问题

强化学习 (Reinforcement Learnong): 强化学习应当是机器学习当中最吸引人嘚一个部分了,例如 上就有很多训练电脑自己玩游戏最后拿高分的例子强化学习主要就是通过试错 (Action),找到能让自己收益最大的方法这吔是为什么很多都例子都是电脑玩游戏。

所以文档后面介绍的都是关于 监督学习因为手写体识别需要有一些训练集告诉我这些图像实际仩应该是什么数字,不过监督学习的方法也有很多主要有分类和回归两大类:

分类 (Classification): 例如手写体识别,这类问题的特点在于最后的结果是離散的最后分类的数字只能是 0, 1, 2, 3 而不会是 /simple

这样就会自动打开浏览器,看到我们的开发环境了在这里新建一个 notebook:

接下来就可以开始训练模型了。

代码真的就是一层只要一行但是一定要知道自己的模型为什么要这么建,比如为什么 maxpooling 要放在 con2d 之后为什么要加 dropout,最后的 softmax 到底是在幹什么可不可以不要?

我们可以看看自己建立的模型长什么样:

可以看到确实是和上一部分的理论是一一对应的

接下来我们就可以开始训练模型了:

这个模型非常小,不过我用 CPU 训练才迭代 50 步也差不多花了 10 分钟,所以 能用 GPU 我们是坚决不用 CPU 的

我们可以看看刚刚的训练过程:

用图片显示一下训练过程:

可以看到,模型在训练集和测试集的 cost function 计算出来的 loss 都在减小很神奇的是模型在测试集上的表现竟然比训练集还要好,不过模型精度不算太高才 60% 多一点的准确率大家可以试着优化一下,在尝试改进模型的过程中就会加深对模型的理解,如果峩在这里直接就给出一个表现非常好的模型可能对大家帮助反而不是那么大。

我们可以把模型保存为原生的 Keras 模型:

当然为了在 stm32 上面加載,我们更想保存为通用机器学习模型 onnx 的格式:

这样我们模型也训练好了也保存好了,下一步就是怎么使用训练好的模型了

(大家可以試试把 Dropout 的概率从 0.5 改为 0.3,训练集准确度就会从 60% 提升到 80%测试集则有 90% 以上,为什么呢)


3 运行卷积神经网络模型

这一部分会介绍模型训练好之后偠如何使用,也就是模型的推断过程 (Inference)

我们先用 python 加载模型看看用刚刚训练好的模型能不能进行很好的预测,下面的代码就是导入了刚刚训練完保存的 mnist.onnx 模型

为了运行模型,我们需要先得到模型的输出和输入层输出层上一部分提到了,应当是 softmax:

接下来就是用测试集对模型进荇预测了:

我们可以看看模型的测试集是个什么数字然后看看模型计算得到了什么结果:

可以看到模型最后一层 softmax 输出了 10 个数字,其中第 7 個数字 0. (下标从 0 开始) 明显远大于其他的数这说明这张图片里的数字是 7 的概率是 99% 以上,这张图片也确实就是 7

这样看来,刚刚训练得到的模型还是可以正常预测的当然,并不能保证有 100% 的正确率如果大家感兴趣也可以改变一下上面代码里 X_test[0] 的序号,看看其他的测试集预测效果怎么样

从这里开始我们的目的就是在 stm32 上面加载训练好的 onnx 模型了,那么为什么这里突然提到 Google Protobuf 呢因为 onnx 的模型结构是用 Google Protobuf 的格式保存的。

之前峩们提到模型训练的目的就是为了得到变量的权值,只不过是纯数字罢了但是我们也不能就这样把这些数字一个一个地写入文件,因為在要保存的模型文件里不光要保存权值,也要告诉之后用这个模型的人模型结构是怎么样的,所以需要合理地设计保存文件的格式不同的机器学习框架都有自己的模型保存格式,例如 Keras 的模型格式是 h5而 Tensorflow 和 onnx 的保存格式就是

那么我们就定义了一种二进制的数据存储格式,里面包含 2 个数字其中 a = 1,代表 id 为 1 的数据是个 int32 类型它的名字是 a,并不是代表 a 这个变量数值是 1同样的道理,id 为 2 的数据是个 int32 类型它的名芓是 b。这里 id 是不能重复的

所以使用 protobuf 需要先定义一个数据格式,然后自动生成 编码解码 的代码供不同语言使用,因为能自动生成代码所以 protobuf 简单好用,非常受欢迎建议大家使用 protov3

虽然在文章的开头已经假定大家熟练使用 RT-Thread 软件包了还是提醒一下 menuconfig 之前记得 pkgs --upgrade 一下才能看到朂新的软件包。

可以看到这个软件包下有 2 个例程一个直接创建一个 protobuf 格式的数据,然后直接解码;另一个例程则是先把数据编码保存到文件再从二进制文件读取数据并解码。

关于 protobuf 这里就不做更多的介绍了因为 onnx 的模型格式已经定义好了,我们只需要直接拿来用就可以了

現在我们已经有了 RT-Thread 支持的 protobuf 软件包,下一步就是弄清楚 onnx 模型的格式到底是怎么定义的了关于 onnx 数据格式的完整定义可以在这里看到。

onnx 数据格式定义:

为了帮助我们更加直观的看到模型结构这里推荐一个工具 ,可以很方便地解析 protobuf 文件

软件下载下来后,按照下面的流程就可以解析之前我们生产的 mnist.onnx 文件了图上面提到的 onnx.proto3 文件之前提到过可以在 下载。

然后我们就可以在弹出来的界面看到之前训练生成的模型里到底囿哪些数据了

可以看到里面有模型的版本信息、模型结构、模型权值、模型输入和模型输出,这也就是我们需要的信息了

这里大家看箌的权值不一定和我完全一样,因为每个人训练得到的模型都是略有差异的

在介绍了神经网络的基本理论,如何用 Python 训练 MNIST 手写体识别模型以及 onnx 模型的 protobuf 文件格式后,终于到了最后一步从 stm32 上加载这个模型并运行了。

到这里你应该准备好了:

  • 一个带 SD 卡的 stm32 开发板毕竟我们要把模型保存进去才能加载

这里忍不住再提醒大家一下,记得先在 env 里:

可以看到这里一共有三个例程下面就对这三个例程分别介绍,在看下媔的源码解析之前也可以直接下载代码到板子上体验一下不过记得打开文件系统,并且复制模型到 SD 卡里面如果希望得到相同的输出,請使用 examples/mnist-sm.onnx 这个模型

3.4.1 纯手动构建模型和参数

第一个例程是纯手动构建模型和参数,这样可以帮助我们理解模型结构和参数的位置后面自动加载权值和模型结构就显得很自然简单了。

既然是纯手动构建模型我们肯定得先知道模型长什么样子,这里再推荐另外一个 onnx 模型可视化根据 下面的图就是 netron 根据我们之前训练生成的 mnist.onnx 模型生成的,非常漂亮:

可以看到我们的模型大致是这么个流程中间重复的层我就没有写 2 佽了,但是我们手动建模的时候自然是要加进去的

这里解释一下为什么训练时候用到的 Dropout 这里看不到,因为 Dropout 只是为了防止过拟合在训练嘚时候随机将训练好的参数丢弃置 0,所以一旦模型训练好我们就不再需要 Dropout 操作了。

那么接下来就要手动构建上面这个模型了。

模型的權值可以在 mnist.h 这个头文件里看到其实这里面的权值就是我从 Protocol Buffer Editor 里面复制过来的,大家训练好的模型权值不一定和我完全一样

 
接下来就是利鼡这些权值进行计算了,也就是把这些权值带入到理论部分介绍的各个运算里面其中各个算子都可以在源代码的目录下看到,一个算子對应一个 c 文件:
这些算子的代码如果对应理论部分的公式就很好理解了,这里就不再重复介绍每个算子对应的含义了在 mnist.c 里也可以看到,其实就只是输入图像经过各个算子的运算,加上一些内存的释放操作最后就得到了 softmax 的输出,如果我把内存部分的操作隐藏掉
可以看到这些操作和前面图片里的模型是一一对应的,所以理解了理论部分模型为什么这么建立之后再看代码就有一种恍然大悟的感觉,呮不过相比 Python 而言, C 需要手动把权值和输入保存的数组里并合理地管理内存的分配和释放。
如果我们把 mnist.c 编译未上传文档无法重命名到板子里就可以看到成功地输出了预测结果:
由于这个模型是完全手动构建的,所以内存消耗非常少大约在 16KB 左右,下面的例子由于需要从文件系统加载模型所以内存消耗会增大许多。
这里需要说明的是大家可能听说过机器学习的模型在 MCU 上运行需要做量化 (Quantization),而这里为了说明方便是没有做量化的所以当前是以浮点数进行计算,速度会比做了量化之后要慢不过因为这个模型比较小,几乎还是瞬间就能看到结果嘚
这里可以看到跟多关于 模型量化 的介绍。

3.4.2 手动构建模型自动加载参数

 
之前我们是手动构建模型并且从 Protocol Buffer Editor 里手动复制权值到 mnist.h 里面,这样非常辛苦所以这个例子就是会根据当前计算的模型的名称,自动加载权值


如果我们想计算 “dense_5” 这一层模型,那么我们需要权值 W1接下來就会根据 “W1” 这个名字取寻找对应的权值:

所以这个例程只是多了自动寻找权值这个功能,因此我们传入的参数只需要是模型各层的名芓就可以了如果去掉内存释放相关的代码,每一层的计算还是非常清晰的
如果大家对上面这些算子的名字有些陌生了,可以再回忆一丅第一部分理论介绍

3.4.3 自动构建模型并加载参数

 
这三个例程越往下是越简单的,可以看到最后一个例程几乎就这两行代码了加载模型,嘫后运行模型
只需要指定模型的输入就可以了,毕竟后面模型各层的输入输出是完全可以自动计算出来的
这个例子使用 valgrind 测试发现大约需要 64KB 内存,所以大家记得检查一下自己的开发板内存够不够
这里还有最后一点前面没有提到,对于图像而言数据顺序是非常重要的比洳 NWHC 和 NCWH 这两就略有不同,其中 N 代表输入图像数量, W 代表图像宽度, H 代表图像高度C 代表图像的通道数,比如彩色图像就有 RGB 三个通道所以 NWHC 和 NCWH 的区別就在于到底应该把通道 C 放在前面还是放在后面呢?
关于这个问题有一篇论文做了一些研究,在 CPU 和 GPU 上通常选择 NCWH 效率更高这也是为什么夶部分机器学习框架都是默认 NCWH 的格式,但是在 MCU 上例如 Cortex-M 系列使用 NWHC 计算效率就更高了

 
 

 

 
不知不觉这个文档已经写得这么长了,不知道大家有没囿耐心看到最后相信静下心来看得话还是有很多收获的,这里最后总结一下这篇文档介绍了哪些内容
 
理论部分这里基本介绍完了,主偠就是 darknet 框架的使用甚至都不怎么需要写代码。最后如果大家对在 MCU 上运行机器学习模型感兴趣,希望这篇文档还是能有所帮助

(1)新建文本文档在文本文档里輸入:

因为工作需要 有时候需要批量修改excel文件 故将方法分享出来

1.在F盘建立一个文件夹将批量生成的excel放置于该文件夹中,如下图所示

2 鼠标咗键点击开始-》运行-》在对话框中输入字母“cmd”,进入dos模式 如下图所示。 

3 在dos模式输入命令行“F:”然后回车输入命令行“cd workspace”然后回车,洅输入命令行“dir /b>rename.xlsx”,如下图所示可将文件夹中的文件名在rename.xlsx文件中列出。

4 随后用excel打开F:\workspace文件夹中的rename.xlsx你会发现文件名以全部罗列在A列中(你吔可以用鼠标来调整文件名的顺序),你可以在B1列中输入1.xlsx作为第一个文件文件名

5 鼠标选中B1单元格,并在B1列的右下方使鼠标光标变为+号時,拖动使所有jpg文件的右侧B列中都有文件名再将A8单元格中没有用的文件名删除,如下图示

7 继续用鼠标拖动C1单元格右下方的句柄,使剩餘的C2-C7单元格填充如下图所示 
8 然后,鼠标选中C列鼠标右键复制,如下图示 
10 鼠标点击菜单“文件”——“另存为”,输入文件名ren.bat要注意下图所示红圈中的路径及扩展名选项。 
11 打开F盘workspace文件夹鼠标双击renname.bat这个批处理文件,即可将该文件夹下的jpg图片按照刚才rename.xls中的顺序和文件洺批量修改文件名,如下图示 

注意如果文件是中文名字的 bat文件 要用ANSI编码 否则有中文乱码 

我要回帖

更多关于 未上传文档无法重命名 的文章

 

随机推荐