基于MATLAB官方提供的免费入门学习教程所制作的学习笔记(教程已经很精简了,实际上这相当于抄老师的PPT一样),同时也会记录教程中的案例。避免自己学完后就饭吃掉。同时也提供给各位作为参考。官网教程时长不长,只有三个小时,有能力的同学建议跟着官网教程学习,官方提供的练习方式个人觉得很不错。
此外,使用的函数不会做过多的解释,具体的使用格式可以在matlab的帮助选项中查询,也可以在指令栏中输入 doc 函数名 来查询函数的信息。
看了一下搜索文章的人问入门之旅进不去。至少在我这里我需要使用打开异世界的大门的钥匙才能看。所以,骚年,不行就配把钥匙吧。
概述:本节学习如何导入、呈现图像。
第一步:导入图片,使用 imread 函数即可导入大多是格式的图片。
任务一:将文件 file01.jpg 中的图像导入 MATLAB 工作区中。将其存储在名为 img1 的变量中
第二步:将上一步导入的图片显示出来(上一步导入图片的编码形式仍未二进制形式),使用 imshow 函数。
任务二:显示变量 img1 中的导入图像。
第三步:重复前两步操作,导入其他图片。
任务三:前两项任务将导入并显示 file01.jpg 中的图像。在脚本中添加命令,以导入并显示 file02.jpg 和 file03.jpg 文件中的图像。将图像分别存储在名为 img2 和 img3 的变量中。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
概述:
第一步:加载预训练网络,使用 alexnet 函数。
任务一:使用 alexnet 函数加载一个预训练网络。将结果保存为一个名为 deepnet 的变量。
第二步:您可以使用 classify 函数对图像进行预测。
任务二:使用 classify 函数和预训练的 AlexNet 网络来预测变量 img1 中存储的图像的主题类别。将网络的预测存储在名为 pred1 的变量中。
第三步:重复之前的操作,对img2、img3进行处理。
任务三:在脚本中添加命令,对变量 img2 和 img3 中存储的图像的内容进行预测。将预测的类分别存储在名为 pred2 和 pred3 的变量中。
注:alexnet等功能需要在软件的附加功能中下载添加。我的好像默认添加了。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果(指猫为狗):
alxnet是一种卷积神经网络(CNN)
第一步:使用 layers 对alexnet进行属性提取
任务一:将 deepnet 的 Layers 属性提取到名为 ly 的变量中。
第二步:提取的属性被保存为数组形式,可以进行查询
任务二:将网络的第一层(输入层)提取到名为 inlayer 的变量中。
第三步:使用圆点表示法访问指定层的某一参数
任务三:提取网络第一层的 InputSize 属性(存储在变量 inlayer 中)。将结果存储在名为 insz 的变量中。
第四步:提取输出层
任务四:将网络的最后一层(输出层)提取到名为 outlayer 的变量中。
第五步:提取输出层classes属性
任务五:提取网络最后一层的 Classes 属性(存储在变量 outlayer 中)。将结果存储在名为 categorynames 的变量中。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
第一步:改变classify输出方式,输出各结果预测分数
任务一:使用 classify 函数和预训练的 AlexNet 网络 net 来预测变量 img 中存储的图像的主题类别。将网络的预测存储在名为 pred 的变量中,并将所有预测分数存储在名为 scores 的变量中。
第二步:使用预测分数向量来研究网络的分类。
任务二:创建预测分数的条形图。请注意,因为有 1000 个预测分数,所创建的条形图会难以阅读。在完成此任务后,您将创建一个只呈现关注数据的条形图。(注意:此步不要求显示部分图,是画出0-1000所有,特意用帮助查了以下bar函数用法,没有部分显示的功能)
第三步:提取有意义的值(才到),直接比较即可
任务三:创建一个逻辑数组 highscores,其中的值 1 (true) 对应于 scores 大于 0.01 的情况。
第四步:逻辑索引(不懂得可以把帮助调成中文搜索逻辑索引,matlab入门之旅也有讲解)
任务四:使用逻辑索引创建高于阈值 0.01 的预测值的条形图。
第五步:添加对应的标签(依旧用逻辑索引)
任务五:使用逻辑索引和 xticklabels 函数为条形图添加对应的预测类名标签。类名的完整列表存储在变量 categorynames 中。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
对于实际处理,数据量十分巨大,对于大量的数据,统一放置管理,需要时取出指定文件即可,减少了内存占用、提高效率。
第一步:使用 imageDatastore 函数在metlab中创建一个数据存储。
任务一:创建一个名为 imds 的数据存储,该数据存储引用当前文件夹中文件名从 file01.jpg 到 file12.jpg 的图像文件。(请注意,在此文件夹中,只有这些图像文件的名称为 filenn.jpg 形式。)
第二步:查找imds的Files属性
任务二:使用数据存储 imds 的 Files 属性提取图像的文件名。将结果存储在名为 fname 的变量中。
第三步:可以使用 read、readimage 和 readall 函数从数据存储手动导入数据。
任务三:使用 readimage 函数导入 file07.jpg 中的图像(数据存储中的第 7 个文件)。将导入的图像存储在名为 img 的变量中。
第四步:使用图像数据存储来代替单个图像。
任务四:使用 AlexNet(作为变量 net 加载)对数据集中所有图像的内容进行分类。将结果存储在名为 preds 的变量中。请注意,classify 函数会用 AlexNet 分析 12 个图像。执行可能需要几秒钟。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
第一步:使用 size 函数查看图像 img 的大小。
任务一:使用 size 函数查看图像 img 的大小。将结果保存到变量 sz 中。
第二步:网络的输入层指定网络要求的图像大小。
expectedSize = inputlayer.InputSize
任务二:导入 AlexNet。提取网络的第一层的 InputSize 属性。将结果存储在名为 insz 的变量中。
第三步:使用 imresize 函数调整图像大小。
任务三:使用 imresize 函数将变量 img 中存储的图像的大小调整为 227×227。将结果存储回变量 img 中。然后用 imshow 显示调整大小后的图像。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
1.创建增强的图像数据存储
第一步:使用 imageDatastore 函数来创建数据存储。使用通配符(例如 *)来指定多个文件。
任务一:创建一个名为 imds 的图像数据存储,该数据存储引用当前文件夹中扩展名为 .jpg 的图像文件。
第二步:增强的图像数据存储可以对整个集合图像执行简单的预处理。要创建此数据存储,请使用 augmentedImageDatastore 函数并将网络的图像输入大小用作输入。
任务二:从 imds 创建一个增强的图像数据存储,它会将图像大小调整为 227×227。将新数据存储命名为 auds。
第三步:将增强的图像数据存储用作 classify 函数的输入。在对每个图像进行分类之前,将使用您创建数据存储时指定的方法对其进行预处理。
任务三:使用 classify 函数和在变量 net 中存储的网络,对 auds 中的图像进行分类。将预测存储在变量 preds 中。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
2.创建增强的图像数据存储
第一步:使用 montage 函数来显示所有灰度图像。
任务一:使用函数 montage 显示数据存储 imds 中的图像。
第二步:在创建增强的图像数据存储时,可以通过设置 ColorPreprocessing 选项将这些图像转换为三维数组。
任务二:基于图像数据存储 imds 创建一个增强的图像数据存储。将图像预处理为 227×227×3。将增强的图像数据存储命名为 auds。
第三步:使用 classify 函数对 auds 中的图像进行分类。
任务三:使用 classify 函数对 auds 中的图像进行分类。AlexNet 存储在变量 net 中。将预测存储在变量 preds 中。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
第一步:使用 ‘IncludeSubfolders’ 选项在给定文件夹的子文件夹中查找图像。
任务一:创建一个数据存储 flwrds,它引用 Flowers 文件夹的子文件夹中的所有图像。
第二步:使用 AlexNet(作为变量 net 加载)对数据集中所有图像的内容进行分类。
任务二:使用 AlexNet(作为变量 net 加载)对数据集中所有图像的内容进行分类。将结果存储在名为 preds 的变量中。请注意,classify 函数会用 AlexNet 分析 15 个图像。执行可能需要几秒钟。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
1.标注图像
第一步:训练所需的标签可以存储在图像数据存储的 Labels 属性中。默认情况下,Labels 属性为空。您可以指定 ‘LabelSource’ 选项,让数据存储根据文件夹名称自动确定标签。
任务一:重新创建数据存储 flwrds,其中包含变量 pathToImages 中所存储文件夹路径的子文件夹中的所有图像,这次使用文件夹名称作为图像标签。工作区中已有 pathToImages。
第二步:提取Labels属性
任务二:将 flwrds 的 Labels 属性提取到名为 flowernames 的变量中。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)(task1中有个理解上的坑,'foldernames’就是指文件夹,看到提示才明白。)
运行结果:
2.拆分训练和测试数据
第一步:使用 splitEachLabel 函数将数据存储中的图像分成两个单独的数据存储。
任务一:将数据存储 flwrds 拆分为两个数据存储 flwrTrain 和 flwrTest,使每个类别中 60% 的文件划分到 flwrTrain 中。
第二步:splitEachLabel 会保持文件有序。您可以通过添加可选的 ‘randomized’ 标志来实现随机乱序。
任务二:将数据存储 flwrds 拆分为两个数据存储 flwrTrain 和 flwrTest,使每个类别中随机选择的 80% 的文件在 flwrTrain 中。
第三步:当 p 是从 0 到 1 的值时,它解释为比例。图像会基于标签按比例进行拆分。您还可以指定每个标签的对应文件中要分配给 ds1 的确切数量。
任务三:将数据存储 flwrds 拆分为两个数据存储 flwrTrain 和 flwrTest,使每个类别中的 50 个文件在 flwrTrain 中。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
另外,当实际输入的时候,图像未必能在一个完美的角度拍摄,因此在学习过程中应该添加一些不完美的图像,imageDataAugmenter函数可以对图像进行旋转,对称等变换,来添加不完美的图片。
第一步:fullyConnectedLayer 函数使用给定数量的神经元创建一个新的全连接层。
任务一:使用 12 个神经元(针对 12 种花)创建一个新的全连接层 fc。
第二步:使用标准数组索引来修改层数组的单个元素。
任务二:用您刚刚创建的新层 fc 替换数组 layers 表示的网络的最后一个全连接层(第 23 个层)。
第三步:使用 classificationLayer 函数为图像分类网络创建一个新输出层。
任务三:用新的分类层替换数组 layers 表示的网络的最后一层(输出层)。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
第一步:使用 trainingOptions 函数来查看所选训练算法的可用选项。
任务一:创建一个包含 SGDM 优化器的默认训练算法的变量 opts。可以省略行尾的分号以显示结果。(SGDM不能大写。大写会报错)
第二步:在 trainingOptions 函数中使用名称-值对组指定任意数量的选项设置。
任务二:创建一个包含 SGDM 优化器的默认训练算法选项的变量 opts,但 InitialLearnRate 选项除外,该选项应设置为 0.001。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
执行迁移学习需要三个要素:表示网络的数组层,为训练图像创建数据存储,一个变量存放算法设置。开始训练时只需要将这三个要素传递给trainnetwork函数运行即可,得到一个层数组输出。
评估训练与性能测试
第一步:变量 info 是包含训练信息的结构体。TrainingLoss 和 TrainingAccuracy 字段包含网络在训练数据上进行每次迭代后达到的性能的记录。
任务一:绘制训练损失图,该数据存储在 info 的 TrainingLoss 字段中。
第二步:网络在训练数据上似乎性能良好,但真正的考验要看它在测试数据上的表现。
任务二:使用 classify 函数获得 flowernet 对数据存储 testImgs 中图像的预测分类。将结果存储在名为 flwrPreds 的变量中。请注意,classify 函数会用 flowernet 分析 24 个图像。执行可能需要几秒钟。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
注:Task2的写法个人不是很明白,查询了MATLAB的帮助,classify使用都是需要三个元素的。
写的时候始终在纠结sample到底该写什么,查看完答案后在网页版看了一下,出来了这个
第二个语句使用方法确实在我的2019a中没有记载,不知道是软件版本问题还是其他情况……
运行结果:
研究测试性能
第一步:通过将预测分类与已知分类进行比较,您可以确定网络对多少测试图像进行了正确分类。已知分类存储在数据存储的 Labels 属性中。
任务一:通过提取 testImgs 数据存储的 Labels 属性,将测试图像的已知分类存储在名为 flwrActual 的变量中。
第二步:使用逻辑比较和 nnz 函数来确定两个数组的匹配元素数
任务二:使用 nnz 函数和相等运算符 (==) 统计有多少预测分类 (flwrPreds) 与正确分类 (flwrActual) 匹配。将结果存储在名为 numCorrect 的变量中。
第三步:通过将 numCorrect 除以测试图像的数量,计算正确分类的测试图像的比例。将结果存储在名为 fracCorrect 的变量中。(测试图像的数量,flwrPreds存储的是类别并不是一个数量值)
第四步:confusionchart 函数计算并显示预测分类的 confusion matrix。
confusionchart(knownclass,predictedclass)
混淆矩阵的 (j,k) 元素值用于统计网络将 j 类中的多少个图像预测为属于类 k。因此,对角线上的元素代表正确分类;非对角线上的元素代表误分类。(对应下方图来理解)
任务四:显示花卉测试数据的混淆矩阵。预测的分类数据存储在分类数组 flwrPreds 中。已知的分类数据存储在数据存储 testImgs 的 Labels 属性中。
以下为该小节程序编写(自己编写的,可能与参考答案有所差异)
运行结果:
对性能的评估结果可能并不能一次就达到理想效果。
调试最好从第三个Training Algorithhm Opitions进行调试。它下方的两个参数是影响更新权重的关键参数。
训练的目标是使 损失函数最小 损失函数用于衡量网络训练数据上的表现。
形象的比喻相当于找一个山谷的最低点(海拔越低,损失函数越小,俯视图的XY两轴表示其对应的权重值)
梯度下降算法:
根据当前点附近的高度,确定地面向下倾度最大的方向,然后向这个方向移动就可以得到新的权重值。具体的移动距离取决于学习率,过大会跳跃前进进而多次错过最低点,过小就需要较多的次数才能到达最低。可以先将学习率除以10
动量梯度下降法:
相对于上一种方法,在移动下一步的时候方向并非沿倾度最大的方向,而是偏向于这个方向。有点像画螺旋线逼近的意思。
过拟合现象:在分类训练中表现良好,但在测试中表现很差。这是学习过程中学到了训练集中的特点而非所有训练的普遍特性。解决方法:将训练集中的一部分分出来,用于更新训练网络、提高性能,当发现性能开始变差的时候就停止训练(这时就是出现过拟合了)。
概览
在此项目中,您将使用预训练卷积神经网络对蛔虫进行分类,将其归为活蛔虫或死蛔虫。
您将使用显微镜载玻片的图像。
数据集和脚本
项目文件包括图像、标签和参考脚本。
更多图像应用:
处理图像的时候,有两个重要的概念: 回归 目标检测
回归:网络分析图像后,返回的一个值,不是标签。例如识别物体所占比例、位置、大小等等。
深度学习的入门教程笔记结束了,前两天确定了研究方向,好像不需要再学习算法编程的东西路,因此matlab学习有缘再更。matlab的帮助很强,使用过程中多用帮助查询语法的使用格式,还有软件的错误提示,一些问题还是比较容易解决的。