当前位置: 首页 > news >正文

装修队做网站网站建设的域名续费

装修队做网站,网站建设的域名续费,设计网官方网站,哪里有做投票的网站本次练习将使用 PaddlePaddle 来实现三种不同的分类器#xff0c;用于识别手写数字。三种分类器所实现的模型分别为 Softmax 回归、多层感知器、卷积神经网络。 您将学会 实现一个基于Softmax回归的分类器#xff0c;用于识别手写数字 实现一个基于多层感知器的分类器#… 本次练习将使用 PaddlePaddle 来实现三种不同的分类器用于识别手写数字。三种分类器所实现的模型分别为 Softmax 回归、多层感知器、卷积神经网络。 您将学会 实现一个基于Softmax回归的分类器用于识别手写数字 实现一个基于多层感知器的分类器用于识别手写数字 实现一个基于卷积神经网络的分类器用于识别手写数字 卷积神经网络的基本组成和搭建 目录 1 - 引用库 2 - 数据获取 3 - 知识点介绍 3.1 常见激活函数介绍 3.2 - Softmax回归(Softmax Regression) 3.3 - 多层感知器(Multilayer Perceptron, MLP) 3.4 - 卷积神经网络(Convolutional Neural Network, CNN) 4 - 构建分类器 4.1 Softmax回归 4.2 多层感知器 4.3 卷积神经网络: 5 - 训练过程 5.1 配置网络结构 5.2 创建优化器 5.3 设置训练场所 5.4 读取数据集 6 - 应用模型 7 - 总结 1 - 引用库 首先载入几个需要用到的库它们分别是 numpy一个python的基本库用于科学计算paddle.fluidPaddlePaddle深度学习框架PILPython上的图像处理标准库os在本例中用于获取文件或目录的路径Image用于处理图像数据from paddle.utils.plot import Ploter :paddle集成了一个画图工具包可以利用这个包把训练曲线画出来from __future__ import print_function import os from PIL import Image import matplotlib.pyplot as plt #plt 用于显示图片 import numpy import paddle import paddle.fluid as fluid from paddle.utils.plot import Ploter %matplotlib inline 问题描述 在学习编程的时候编写的第一个程序一般是实现打印Hello World。而机器学习或深度学习的入门教程一般都是 MNIST 数据库上的手写数字识别问题。原因是手写数字识别属于典型的图像分类问题比较简单同时MNIST数据集也很完备。 目标 构建三种不同的分类器来对手写数字进行识别 数据集分析 MNIST 数据集作为一个简单的计算机视觉数据集包含一系列如下图所示的手写数字图片和对应的标签。图片是 28x28 像素的矩阵标签则对应着0~9的10个数字。每张图片都经过了归一化和居中处理。 MNIST数据集是从 NIST 的Special Database 3SD-3和Special Database 1SD-1构建而来。由于SD-3是由美国人口调查局的员工进行标注SD-1是由美国高中生进行标注因此SD-3比SD-1更干净也更容易识别。Yann LeCun等人从SD-1和SD-3中各取一半作为MNIST的训练集60000条数据和测试集10000条数据其中训练集来自250位不同的标注员此外还保证了训练集和测试集的标注员是不完全相同的。 Yann LeCun早先在手写字符识别上做了很多研究并在研究过程中提出了卷积神经网络Convolutional Neural Network大幅度地提高了手写字符的识别能力也因此成为了深度学习领域的奠基人之一。如今的深度学习领域卷积神经网络占据了至关重要的地位从最早Yann LeCun提出的简单LeNet到如今ImageNet大赛上的优胜模型VGGNet、GoogLeNet、ResNet等请参见图像分类 教程人们在图像分类领域利用卷积神经网络得到了一系列惊人的结果。 有很多算法在 MNIST 上进行实验。1998年LeCun 分别用单层线性分类器、多层感知器Multilayer Perceptron, MLP和多层卷积神经网络LeNet进行实验使得测试集上的误差不断下降从12%下降到0.7%[1]。此后科学家们又基于K近邻K-Nearest Neighbors算法[2]、支持向量机SVM[3]、神经网络[4-7]和Boosting方法[8]等做了大量实验并采用多种预处理方法如去除歪曲、去噪、模糊等来提高识别的准确率。 本教程中我们从简单的模型 Softmax 回归开始带大家入门手写数字识别并逐步进行模型优化。 输入值 X是输入MNIST图片是28×28 的二维图像为了进行计算将其转化为 784维向量即 ?(?0,?1,…,?783) 。转化的具体做法每张图片是由 28×28 个像素构成的将其按固定顺序如按行或者按列展开成为一个行向量并将每个原始像素值归一化为[0,1] 之间的数值。 LLL是图片的真实标签?(?0,?1,…,?9)也是10维但只有一维为1其他都为0。值为1的维度对应图片表示的真实数字例如?(1,0,…,0)表示图片对应的数字是1。 输出值 Y是输出分类器的输出是 10 类数字0-9即 ?(?0,?1,…,?9)每一维 yi代表图片分类为第 ii类数字的概率。要注意的是PaddlePaddle将图像的通道数放在最前面即为[C H W]区别于[H W C]。 2 - 数据获取 文件路径 在该项目中已准备好数据集路径/home/aistudio/dataset/ 数据集信息如下 # 定义reader用于获取数据集数据import struct import gzipTRAIN_IMAGE /home/aistudio/data/data65/train-images-idx3-ubyte.gz TRAIN_LABEL /home/aistudio/data/data65/train-labels-idx1-ubyte.gz TEST_IMAGE /home/aistudio/data/data65/t10k-images-idx3-ubyte.gz TEST_LABEL /home/aistudio/data/data65/t10k-labels-idx1-ubyte.gzdef reader_creator(image_filename, label_filename, buffer_size):def reader():with gzip.GzipFile(image_filename, rb) as image_file:img_buf image_file.read()with gzip.GzipFile(label_filename, rb) as label_file:lab_buf label_file.read()step_label 0offset_img 0# read from Big-endian# get file info from magic byte# image file : 16Bmagic_byte_img IIIImagic_img, image_num, rows, cols struct.unpack_from(magic_byte_img, img_buf, offset_img)offset_img struct.calcsize(magic_byte_img)offset_lab 0# label file : 8Bmagic_byte_lab IImagic_lab, label_num struct.unpack_from(magic_byte_lab,lab_buf, offset_lab)offset_lab struct.calcsize(magic_byte_lab)while True:if step_label label_num:breakfmt_label str(buffer_size) Blabels struct.unpack_from(fmt_label, lab_buf, offset_lab)offset_lab struct.calcsize(fmt_label)step_label buffer_sizefmt_images str(buffer_size * rows * cols) Bimages_temp struct.unpack_from(fmt_images, img_buf,offset_img)images numpy.reshape(images_temp, (buffer_size, rows * cols)).astype(float32)offset_img struct.calcsize(fmt_images)images images / 255.0 * 2.0 - 1.0for i in range(buffer_size):yield images[i, :], int(labels[i])return readerdef train():MNIST training set creator.It returns a reader creator, each sample in the reader is image pixels in[0, 1] and label in [0, 9].:return: Training reader creator:rtype: callablereturn reader_creator(TRAIN_IMAGE, TRAIN_LABEL, 100)def test():MNIST test set creator.It returns a reader creator, each sample in the reader is image pixels in[0, 1] and label in [0, 9].:return: Test reader creator.:rtype: callablereturn reader_creator(TEST_IMAGE, TEST_LABEL, 100) 3 - 知识点介绍 3.1 常见激活函数介绍 sigmoid激活函数 tanh激活函数 ReLU激活函数 3.2 - Softmax回归(Softmax Regression) 最简单的Softmax回归模型是先将输入层经过一个全连接层得到的特征然后直接通过softmax 函数进行多分类[9]。 输入层的数据X传到输出层在激活操作之前会乘以相应的权重 W 并加上偏置变量 b 具体如下 其中 对于有 N 个类别的多分类问题指定 NN个输出节点N 维结果向量经过softmax将归一化为 N 个[0,1]范围内的实数值分别表示该样本属于这 N 个类别的概率。此处的 yi​ 即对应该图片为数字 i 的预测概率。 在分类问题中我们一般采用交叉熵代价损失函数cross entropy公式如下 图2为softmax的网络图图中权重用蓝线表示、偏置用红线表示、1代表偏置参数的系数为1。 3.3 - 多层感知器(Multilayer Perceptron, MLP) Softmax回归模型采用了最简单的两层神经网络即只有输入层和输出层因此其拟合能力有限。为了达到更好的识别效果我们考虑在输入层和输出层中间加上若干个隐藏层[10]。 经过第一个隐藏层可以得到 ?1?(?1??1) 其中? 代表激活函数常见的有sigmoid、tanh或ReLU等函数。经过第二个隐藏层可以得到?2?(?2?1?2)。最后再经过输出层得到的?softmax(?3?2?3)即为最后的分类结果向量。图3为多层感知器的网络结构图图中权重用蓝线表示、偏置用红线表示、1代表偏置参数的系数为1。 3.4 - 卷积神经网络(Convolutional Neural Network, CNN) 在多层感知器模型中将图像展开成一维向量输入到网络中忽略了图像的位置和结构信息而卷积神经网络能够更好的利用图像的结构信息。LeNet-5是一个较简单的卷积神经网络。下图显示了其结构输入的二维图像先经过两次卷积层到池化层降采样层再经过全连接层最后使用softmax函数作为输出层激活函数。下面我们主要介绍卷积层和池化层。 卷积层 卷积层是卷积神经网络的核心基石。在图像识别里我们提到的卷积是二维卷积即离散二维滤波器也称作卷积核与二维图像做卷积操作简单的讲是二维滤波器滑动到二维图像上所有位置并在每个位置上与该像素点及其领域像素点做内积。卷积操作被广泛应用与图像处理领域不同卷积核可以提取不同的特征例如边沿、线性、角等特征。在深层卷积神经网络中通过卷积操作可以提取出图像低级到复杂的特征。 上图5给出一个卷积计算过程的示例图输入图像大小为H5,W5,D3即5×5大小的3通道RGB也称作深度彩色图像。这个示例图中包含两用K表示组卷积核即图中滤波器W0​和W1。在卷积计算中通常对不同的输入通道采用不同的卷积核如图示例中每组卷积核包含D3个3×3用F×F表示大小的卷积核。另外这个示例中卷积核在图像的水平方向W方向和垂直方向H方向的滑动步长为2用S表示对输入图像周围各填充1用P表示个0即图中输入层原始数据为蓝色部分灰色部分是进行了大小为1的扩展用0来进行扩展。经过卷积操作得到输出为3×3×2用H​o​​×W​o​​×K表示大小的特征图即3×3大小的2通道特征图其中H​o​​计算公式为Ho(H−F2×P)/S1W​o​​同理。 而输出特征图中的每个像素是每组滤波器与输入图像每个特征图的内积再求和再加上偏置bo​​偏置通常对于每个输出特征图是共享的。输出特征图o[:,:,0]中的最后一个−2计算如图中右下角公式所示。 在卷积操作中卷积核是可学习的参数经过上面示例介绍每层卷积的参数大小为D×F×F×K。在多层感知器模型中神经元通常是全部连接参数较多。而卷积层的参数较少这也是由卷积层的主要特性即局部连接和共享权重所决定。 局部连接每个神经元仅与输入神经元的一块区域连接这块局部区域称作感受野receptive field。在图像卷积操作中即神经元在空间维度spatial dimension即上图示例H和W所在的平面是局部连接但在深度上是全部连接。对于二维图像本身而言也是局部像素关联较强。这种局部连接保证了学习后的过滤器能够对于局部的输入特征有最强的响应。局部连接的思想也是受启发于生物学里面的视觉系统结构视觉皮层的神经元就是局部接受信息的。 权重共享计算同一个深度切片的神经元时采用的滤波器是共享的。例如图4中计算o[:,:,0]的每个每个神经元的滤波器均相同都为W0​​这样可以很大程度上减少参数。共享权重在一定程度上讲是有意义的例如图片的底层边缘特征与特征在图中的具体位置无关。但是在一些场景中是无意的比如输入的图片是人脸眼睛和头发位于不同的位置希望在不同的位置学到不同的特征 (参考斯坦福大学公开课)。请注意权重只是对于同一深度切片的神经元是共享的在卷积层通常采用多组卷积核提取不同特征即对应不同深度切片的特征不同深度切片的神经元权重是不共享。另外偏重对同一深度切片的所有神经元都是共享的。 通过介绍卷积计算过程及其特性可以看出卷积是线性操作并具有平移不变性shift-invariant平移不变性即在图像每个位置执行相同的操作。卷积层的局部连接和权重共享使得需要学习的参数大大减小这样也有利于训练较大卷积神经网络。 池化层 一般情况下在连续的卷积层之间会周期性地插入一个池化层也称汇聚层其处理输入数据的准则被称为池化函数。池化函数在计算某一位置的输出时会计算该位置相邻区域的输出的某种总体统计特征作为网络在该位置的输出。池化层的作用是逐渐降低数据体的空间尺寸从而减少网络中参数的数量以及耗费的计算资源同时也能有效控制过拟合。 池化包括最大池化、平均池化、L-2范数池化等。以最大池化(Max Pooling)为例池化层使用最大化(Max)操作即用一定区域内输入的最大值作为该区域的输出。最大池化最常用的形式是使用尺寸为2×22\times22×2的滤波器、步长为2来对每个深度切片进行降采样每个Max操作是从4个数字中取最大值也就是在深度切片中某个的区域这样可以将其中75%的激活信息都过滤掉而保持数据体通道数不变,具体示例如图6所示。 更详细的关于卷积神经网络的具体知识可以参考斯坦福大学公开课和图像分类教程。 4 - 构建分类器 4.1 Softmax回归 只通过一层简单的以Softmax为激活函数的全连接层得到分类结果。具体过程和网络结构如图7所示784维的输入特征经过节点数目为10的全连接层后直接通过Softmax函数进行多分类。 按照上述描述实现 Softmax 回归分类器对应的 softmax_regression() 函数。 API 解释 全连接 通常写法为 hidden fluid.layers.fc(inputx, size10, actsigmoid) def softmax_regression(img):定义softmax分类器一个以softmax为激活函数的全连接层:param img: 输入层:Return:predict -- 分类的结果# 以softmax为激活函数的全连接层输出层的大小必须为数字的个数10 predict fluid.layers.fc(inputimg, size10, actsoftmax)return predict 4.2 多层感知器 下面代码实现了一个含有两个隐藏层即全连接层的多层感知器。其中两个隐藏层的激活函数均采用ReLU输出层的激活函数用 Softmax。Softmax 回归模型采用了最简单的两层神经网络即只有输入层和输出层因此其拟合能力有限。为了达到更好的识别效果我们考虑在输入层和输出层中间加上若干个隐藏层,从而得到了多层感知器模型。其对应的网络结构如图8所示784维的输入特征先后经过两个节点数为128和64的全连接层最后通过 Softmax 函数进行多分类。 按照上述描述定义多层感知器模型对应的函数 multilayer_perceptron()。 API 解释 全连接 通常写法为 hidden fluid.layers.fc(inputx, size10, actsigmoid) def multilayer_perceptron(img):定义多层感知机分类器含有两个隐藏层全连接层的多层感知器其中前两个隐藏层的激活函数采用 ReLU输出层的激活函数用 Softmax:param img: 输入层Return:predict_image -- 分类的结果# 第一个全连接层本层神经元有128个 激活函数为 ReLU hidden fluid.layers.fc(inputimg, size128, actrelu) # 第二个全连接层本层神经元有64个 激活函数为 ReLU hidden fluid.layers.fc(inputhidden, size64, actrelu)# 以 softmax 为激活函数的全连接输出层输出层的大小必须为 10,对应 0-9 这 10 个数字prediction fluid.layers.fc(inputhidden, size10, actsoftmax)return prediction 4.3 卷积神经网络: 卷积网络的结构示意图如下所示 比如本次实验输入的二维图像可以经过两次卷积层后接池化层的结构在通过输出节点数目为10的以Softmax函数作为激活函数的全连接层后得到多分类输出。 根据上述描述和图示补全下面练习1—3处的代码实现卷积神经网络模型对应的函数 convolutional_neural_network()。 API 解释卷积 通常写法为 hidden fluid.nets.simple_img_conv_pool(input, num_filters, filter_size, pool_size, pool_stride, pool_padding0) 要注意的是PaddlePaddle将图像的通道数放在最前面即为[C H W]区别于[H W C]。其中: nput - 输入 num_filters - filters 的数量 filter_size - filter 的大小 pool_size - 池化的大小 pool_stride - 池化的步长 pool_padding - 池化的 padding 建议适当调节这些参数以达到训练精度要求。 API 参考文档http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/nets_cn.html ### hidden fluid.nets.simple_img_conv_pool(inputimg, num_filters2, filter_size3, pool_size2, pool_stride2, pool_padding1)### 练习1代码结束处 ####练习2# 使用fluid.nets.simple_img_conv_pool()函数完成第二个卷积-池化层# 根据需求自己设定参数### 练习2代码开始处 ### hidden fluid.nets.simple_img_conv_pool(inputhidden, num_filters2, filter_size3, pool_size2, pool_stride2, pool_padding1)### 练习2代码结束处 ####练习3# 使用fluid.layers.fc(----------)函数完成最后全连接层预测输出# 根据需求自己设定参数### 练习3代码开始处 ### prediction fluid.layers.fc(inputhidden, size10, actsoftmax)### 练习3代码结束处 ###return prediction为了在训练的时候能实时的观察到模型训练效果可以用一个画图函数把训练曲线展示出来。这个函数定义为 event_handler_plot(ploter_title, step, cost) train_prompt Train cost test_prompt Test cost cost_ploter Ploter(train_prompt, test_prompt)# 将训练过程绘图表示 def event_handler_plot(ploter_title, step, cost):cost_ploter.append(ploter_title, step, cost)cost_ploter.plot() 5 - 训练过程 5.1 配置网络结构 接下来需要配置分类网络的结构 首先通过 layers.data 配置数据输入层然后配置分类器代码中提供了三个不同的分类器每次使用选择其中一个注释掉其余两个即可。例如下方代码中选用的是卷积神经网络分类器。然后设置损失函数对于分类问题常常选择交叉熵损失函数。# 数据输入层 img fluid.layers.data(nameimg, shape[1, 28, 28], dtypefloat32) # 标签层名称为label,对应输入图片的类别标签 label fluid.layers.data(namelabel, shape[1], dtypeint64)# prediction softmax_regression(img) # 取消注释将使用 Softmax回归 # prediction multilayer_perceptron(img) # 取消注释将使用 多层感知器 prediction convolutional_neural_network(img) # 取消注释将使用 卷积神经网络# 使用类交叉熵函数计算predict和label之间的损失函数 cost fluid.layers.cross_entropy(inputprediction, labellabel) # 计算平均损失 avg_loss fluid.layers.mean(cost) #注意这个平均损失avg_loss在下面的优化器optimizer中要用到optimizer.minimize(avg_loss)# 计算分类准确率 acc fluid.layers.accuracy(inputprediction, labellabel) 设置test_program 我们通过克隆main_program得到test_program 为什要要这样做呢因为有些operator在训练和测试之间的操作是不同的例如batch_norm使用参数for_test来区分该程序是用来训练还是用来测试。 另外该api不会删除任何操作符,请在backward和optimization之前使用 test_program fluid.default_main_program().clone(for_testTrue) 5.2 创建优化器 参数创建完成后我们需要定义一个优化器optimizer为了改善模型的训练速度以及效果学术界先后提出了很多优化算法包括 Momentum、RMSProp、Adam 等已经被封装在fluid内部读者可直接调用。比如Adam就是一种常用的、效果良好的自适应学习率调整优化算法在 fluid 中可以使用接口 fluid.optimizer.Adam() 来创建 Adam 优化器。这个函数接受 4个参数分别是learning_rate, beta1, beta2 和 epsilon。相关的API在这里http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/optimizer_cn.html #练习4补全代码完成优化器的配置 #提示你也可以尝试使用其他优化器也可以适当的配置相关参数尤其是learning_rate对训练结果有一定影响 ### 练习代码开始处 ### ≈2行代码 optimizer fluid.optimizer.Adam(learning_rate0.005) optimizer.minimize(avg_loss)### 练习代码结束处 ### print(optimizer is ready) #我们还可以定义一个train_test()函数使用测试数据来测试训练效果。 def train_test(train_test_program, train_test_feed, train_test_reader):# 将分类准确率存储在acc_set中acc_set []# 将平均损失存储在avg_loss_set中avg_loss_set []# 将测试 reader yield 出的每一个数据传入网络中进行训练for test_data in train_test_reader():acc_np, avg_loss_np exe.run(programtrain_test_program,feedtrain_test_feed.feed(test_data),fetch_list[acc, avg_loss])acc_set.append(float(acc_np))avg_loss_set.append(float(avg_loss_np))# get test acc and loss# 获得测试数据上的准确率和损失值acc_val_mean numpy.array(acc_set).mean()avg_loss_val_mean numpy.array(avg_loss_set).mean()# 返回平均损失值平均准确率return avg_loss_val_mean, acc_val_mean 5.3 设置训练场所 下面设置训练使用的设备。在复杂量较低的时候使用 CPU 就可以完成任务但是对于大规模计算就需要使用 GPU 训练。目前 GPU 训练都是基于 CUDA 工具之上的。 #练习5 # 补全代码完成训练场所的设置。 #要求工作场所变量名称为place ### 练习代码开始处 ### ≈2行代码 use_cuda True place fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() print(运行完毕) ### 练习代码结束处 ### 5.4 读取数据集 paddle.dataset.mnist.train()和paddle.dataset.mnist.test()分别做训练和测试数据集。这两个函数各自返回一个reader——PaddlePaddle中的reader是一个Python函数每次调用的时候返回一个Python yield generator。 下面shuffle是一个reader decorator它接受一个reader A返回另一个reader B。reader B 每次读入buffer_size条训练数据到一个buffer里然后随机打乱其顺序并且逐条输出。 batch是一个特殊的decorator它的输入是一个reader输出是一个batched reader。在PaddlePaddle里一个reader每次yield一条训练数据而一个batched reader每次yield一个minibatch。 # 一个minibatch中有64个数据 BATCH_SIZE 32 #BATCH_SIZE# 每次读取训练集中的500个数据并随机打乱传入batched reader中batched reader 每次 yield 64个数据 train_reader paddle.batch(paddle.reader.shuffle(train(), buf_size500),batch_sizeBATCH_SIZE)# 读取测试集的数据每次 yield 64个数据 test_reader paddle.batch(paddle.reader.shuffle(test(), buf_size500),batch_sizeBATCH_SIZE)feeder fluid.DataFeeder(feed_list[img, label], placeplace) #创建执行器 exe fluid.Executor(place) exe.run(fluid.default_startup_program())#设置 main_program main_program fluid.default_main_program()#设置训练过程的超参 PASS_NUM 8 #设置训练样本训练的总 n 轮数这个参数可以根据需要进行改动以达到我们需要的训练效果# 将模型参数存储在名为 save_dirname 的文件中 save_dirname saved_model设置训练主循环 我们构建一个循环来进行训练直到训练结果足够好或者循环次数足够多。 如果训练迭代次数满足参数保存的迭代次数可以把训练参数保存到params_dirname。 epochs [epoch_id for epoch_id in range(PASS_NUM)]lists [] step 0 for epoch_id in epochs:for step_id, data in enumerate(train_reader()):metrics exe.run(main_program,feedfeeder.feed(data),fetch_list[avg_loss, acc])#我们可以把训练结果打印输出也可以用画图展示出来if step % 100 0: #每训练100次 打印一次log或者添加一个绘图点#print(Pass %d, Batch %d, Cost %f % (step, epoch_id, metrics[0]))event_handler_plot(train_prompt, step, metrics[0])step 1# test for epoch# 测试每个epoch的分类效果avg_loss_val, acc_val train_test(train_test_programtest_program,train_test_readertest_reader,train_test_feedfeeder)print(Test with Epoch %d, avg_cost: %s, acc: %s %(epoch_id, avg_loss_val, acc_val))lists.append((epoch_id, avg_loss_val, acc_val))# 保存训练好的模型参数用于预测if save_dirname is not None:fluid.io.save_inference_model(save_dirname, [img], [prediction],exe) Test with Epoch 0, avg_cost: 0.2838544199784724, acc: 0.9069488817891374 Test with Epoch 1, avg_cost: 0.22450397592841292, acc: 0.9254193290734825 Test with Epoch 2, avg_cost: 0.18711660684089357, acc: 0.9409944089456869 Test with Epoch 3, avg_cost: 0.17830089215909284, acc: 0.943091054313099 Test with Epoch 4, avg_cost: 0.1803132943502559, acc: 0.9401956869009584 Test with Epoch 5, avg_cost: 0.1785307344102774, acc: 0.9427915335463258 Test with Epoch 6, avg_cost: 0.17006214236217246, acc: 0.9452875399361023 Test with Epoch 7, avg_cost: 0.17242987517538233, acc: 0.9462859424920128 #我们从训练好的模型中找到acc值最好的 # find the best pass # 选择效果最好的pass best sorted(lists, keylambda list: float(list[2]))[-1] print(Best pass is %s, testing Avgcost is %s % (best[0], best[1])) print(The classification accuracy is %.2f%% % float((best[2]) * 100)) 6 - 应用模型 模型训练好之后我们可以使用训练好的模型对手写体数字图片进行分类下面程序展示了如何使用训练好的模型进行推断。 首先定义一个用来处理输入的图片的函数 load_image(file)。 它会将输入的图片处理成满足分类器输入要求的格式。 def load_image(file):im Image.open(file).convert(L)#因为mnist数据集是28*28的所以我们最好把预测图片的也resize成28、28的im im.resize((28, 28), Image.ANTIALIAS)#并且我么也需要把预测图片reshpe成1,1,28,28第一个1表示是一张图片第二个1表示是单通道灰度图后面两个28还是图片的H/W#并且我们需要把数据类型变成float32im numpy.array(im).reshape(1, 1, 28, 28).astype(numpy.float32)#因为训练的时候我们的图片进行了归一化处理所以预测时我们也做一下归一化。im im / 255.0 * 2.0 - 1.0return im #加载图片 tensor_img load_image(/home/aistudio/data/data2304/infer_3.png) 然后开始预测并输出结果 nference_scope fluid.core.Scope() with fluid.scope_guard(inference_scope):# 使用 fluid.io.load_inference_model 获取 inference program,# feed_target_names 用于指定需要传入网络的变量名# fetch_targets 指定希望从网络中fetch出的变量名[inference_program, feed_target_names,fetch_targets] fluid.io.load_inference_model(save_dirname, exe)# 开始预测results exe.run(inference_program,# 将预测数据封装为字典格式{feed_target_name: feed_target_data}feed{feed_target_names[0]: tensor_img},fetch_listfetch_targets)# 获取lab numpy.argsort(results)print(Inference result of image/infer_3.png is: %d % lab[0][0][-1])# 将feed构建成字典 {feed_target_name: feed_target_data}# 结果将包含一个与fetch_targets对应的数据列表# 我们可以实现批量预测通过一个循环每次预测一个mini_batchfor mini_batch in test_reader():#test_x numpy.array([data[0] for data in mini_batch]).astype(float32)test_x numpy.array([data[0].reshape(1, 28, 28) for data in mini_batch]).astype(float32)test_y numpy.array([data[1] for data in mini_batch]).astype(int64)# 真实进行预测mini_batch_result exe.run(inference_program,feed{feed_target_names[0]: test_x},fetch_listfetch_targets)# 打印预测结果mini_batch_result numpy.argsort(mini_batch_result) #找出可能性最大的列标升序排列mini_batch_result mini_batch_result[0][:, -1] #把这些列标拿出来print(预测结果%s%mini_batch_result)# 打印真实结果 label test_y # 转化为 labelprint(真实结果%s%label)#计数label_len len(label)right_counter 0for i in range(label_len):if mini_batch_result[i] label[i]:right_counter 1ratio (right_counter/label_len)print(准确率为%.2f%%%(ratio*100)) 7 - 总结 通过这个练习学习了 如何利用PaddlePaddle搭建CNN卷及网络并调用相关的的API接口对图片进行特征提取和分类 本次搭建的卷积神经网络是最基础的卷积模型后续章节中复杂的CNN网络都是从它们衍生出来的因此这个模型对之后的学习大有裨益。
http://www.pierceye.com/news/957811/

相关文章:

  • 西安网站seo优化做cpa广告建什么网站好
  • 南京手机网站开发网站建设需要哪些岗位
  • 青白江区网站开发招聘宿迁网站设计
  • 做暧暖爱视频每一刻网站wordpress头条采集
  • 海淀网站开发如何免费推广网站
  • 建设音乐网站宣传片拍摄总结
  • 个人网站推广中国制造网建站
  • 怎么管理好自己的网站自建vps和买机场哪个好
  • 站长之家素材网站郴州建网站
  • 服装微商城网站建设贵州建设考试网站
  • 安徽省建设安全协会网站htm5移动网站开发
  • 棋盘游戏类网站开发wordpress副标题怎么写
  • 重庆城市关键词优化ppt
  • 网站营销外包公司简介wordpress 微信二维码
  • 做酒业网站的要求软件开发app的公司
  • 可以做超链接或锚文本的网站有哪些口碑营销的本质是什么
  • 网上下载的网站模板怎么用莱芜金点子招聘网
  • 网站建设首先要免费游戏网站制作
  • 小橘子被做h网站注册帐号
  • 汉川网站推广服务PHP网站建设的课后笔记
  • 中国建设银行网站功能模块多少钱才算有钱人
  • 毕业设计网站成品wordpress 发布模块
  • 网站推广 济南江西 网站 建设 开发
  • 视频 播放网站怎么做的ppt模板大师
  • 桂林北站到象鼻山景区怎么坐车wordpress更改上传
  • 温州制作手机网站wordpress电子书下载
  • 企业型网站怎么做wordpress邮件服务器
  • 龙华网站(建设信科网络)网站建设哪家好推荐万维科技
  • 克拉玛依网站建设公司网站 正在建设中
  • 虚拟主机可以做视频网站嘛有哪些网站有收录做红酒的商行