问题:实现在MNIST数据集上,对数字的识别。
分析:
(1)输入:MNIST手写的数字图片,它是一个28*28的二维图片,为了计算,我们将其转为784维的一个向量。
(2)输出:分类器的输出是0-9的数字的概率。
(3)分类器的设计:5层的卷积神经网络。即:conv->pool->conv->pool->FC->softmax
代码如下:
""" 定义卷积神经网络分类器: 输入的二维图像,经过两个卷积-池化层,使用以softmax为激活函数的全连接层作为输出层 Args: img -- 输入的原始图像数据 Return: predict -- 分类的结果 """ # Your Code Begin: # 第一个卷积-池化层 conv_pool_1=paddle.networks.simple_img_conv_pool( input=img, filter_size=5, num_filters=20, num_channel=1, pool_size=2, pool_stride=2, act=paddle.activation.Relu() ) # 第二个卷积-池化层 conv_pool_2=paddle.networks.simple_img_conv_pool( input=conv_pool_1, filter_size=5, num_filters=50, num_channel=20, pool_size=2, pool_stride=2, act=paddle.activation.Relu() ) # 全连接层 predict = paddle.layer.fc( input=conv_pool_2, size=10, act=paddle.activation.Softmax() ) # Your Code End: return predict
下面是完整代码:
#!/usr/bin/env python # -*- coding:utf-8 -*- """ Authors: xiake(kedou1993@163.com) Date: 2017/11/29 使用paddle框架实现逻辑数字识别案例,关键步骤如下: 1.定义分类器网络结构 2.初始化 3.配置网络结构 4.定义成本函数cost 5.定义优化器optimizer 6.定义事件处理函数 7.进行训练 8.利用训练好的模型进行预测 """ import os import numpy as np from PIL import Image import matplotlib matplotlib.use('Agg') import paddle.v2 as paddle from paddle.v2.plot import Ploter LEARNING_STEP = 0 # 绘图相关标注 TRAIN_TITLE_COST = "Train cost" TEST_TITLE_COST = "Test cost" TRAIN_TITLE_ERROR = "Train error rate" TEST_TITLE_ERROR = "Test error rate" def softmax_regression(img): """ 定义softmax分类器: 只通过一层简单的以softmax为激活函数的全连接层,可以得到分类的结果 Args: img -- 输入的原始图像数据 Return: predict -- 分类的结果 """ # Your Code Begin: predict = paddle.layer.fc( input=img, size=10, act=paddle.activation.Softmax() ) # Your Code End: return predict def multilayer_perceptron(img): """ 定义多层感知机分类器: 含有两个隐藏层(即全连接层)的多层感知器 其中两个隐藏层的激活函数均采用ReLU,输出层的激活函数用Softmax Args: img -- 输入的原始图像数据 Return: predict -- 分类的结果 """ # Your Code Begin: # 第一个全连接层 hidden1= paddle.layer.fc( input=img, size=128, act=paddle.activation.Relu() ) # 第二个全连接层 hidden2 = paddle.layer.fc( input=hidden1, size=64, act=paddle.activation.Relu() ) # 第三个全连接层,需要注意输出尺寸为10,,对应0-9这10个数字 predict = paddle.layer.fc( input=hidden2, size=10, act=paddle.activation.Softmax() ) # Your Code End: return predict def convolutional_neural_network(img): """ 定义卷积神经网络分类器: 输入的二维图像,经过两个卷积-池化层,使用以softmax为激活函数的全连接层作为输出层 Args: img -- 输入的原始图像数据 Return: predict -- 分类的结果 """ # Your Code Begin: # 第一个卷积-池化层 conv_pool_1=paddle.networks.simple_img_conv_pool( input=img, filter_size=5, num_filters=20, num_channel=1, pool_size=2, pool_stride=2, act=paddle.activation.Relu() ) # 第二个卷积-池化层 conv_pool_2=paddle.networks.simple_img_conv_pool( input=conv_pool_1, filter_size=5, num_filters=50, num_channel=20, pool_size=2, pool_stride=2, act=paddle.activation.Relu() ) # 全连接层 predict = paddle.layer.fc( input=conv_pool_2, size=10, act=paddle.activation.Softmax() ) # Your Code End: return predict def network_config(): """ 配置网络结构 Args: Return: images -- 输入层 label -- 标签数据 predict -- 输出层 cost -- 损失函数 parameters -- 模型参数 optimizer -- 优化器 """ """ 输入层: paddle.layer.data表示数据层, name=’pixel’:名称为pixel,对应输入图片特征 type=paddle.data_type.dense_vector(784):数据类型为784维(输入图片的尺寸为28*28)稠密向量 """ images = paddle.layer.data( name='pixel', type=paddle.data_type.dense_vector(784)) """ 数据层: paddle.layer.data表示数据层, name=’label’:名称为label,对应输入图片的类别标签 type=paddle.data_type.dense_vector(10):数据类型为10维(对应0-9这10个数字)稠密向量 """ label = paddle.layer.data( name='label', type=paddle.data_type.integer_value(10)) """ 选择分类器: 在此之前已经定义了3种不同的分类器,在下面的代码中, 我们可以通过保留某种方法的调用语句、注释掉其余两种,以选择特定的分类器 """ # predict = softmax_regression(images) # predict = multilayer_perceptron(images) predict = convolutional_neural_network(images) # 定义成本函数,paddle.layer.classification_cost()函数内部采用的是交叉熵损失函数 cost = paddle.layer.classification_cost(input=predict, label=label) # 利用cost创建参数parameters parameters = paddle.parameters.create(cost) # 创建优化器optimizer,下面列举了2种常用的优化器,不同类型优化器选一即可 # 创建Momentum优化器,并设置学习率(learning_rate)、动量(momentum)和正则化项(regularization) optimizer = paddle.optimizer.Momentum( learning_rate=0.01 / 128.0, momentum=0.9, regularization=paddle.optimizer.L2Regularization(rate=0.0005 * 128)) # 创建Adam优化器,并设置参数beta1、beta2、epsilon # optimizer = paddle.optimizer.Adam(beta1=0.9, beta2=0.99, epsilon=1e-06) config_data = [images, label, predict, cost, parameters, optimizer] return config_data def plot_init(): """ 绘图初始化函数: 初始化绘图相关变量 Args: Return: cost_ploter -- 用于绘制cost曲线的变量 error_ploter -- 用于绘制error_rate曲线的变量 """ # 绘制cost曲线所做的初始化设置 cost_ploter = Ploter(TRAIN_TITLE_COST, TEST_TITLE_COST) # 绘制error_rate曲线所做的初始化设置 error_ploter = Ploter(TRAIN_TITLE_ERROR, TEST_TITLE_ERROR) ploter = [cost_ploter, error_ploter] return ploter def load_image(file_path): """ 定义读取输入图片的函数: 读取指定路径下的图片,将其处理成分类网络输入数据对应形式的数据,如数据维度等 Args: file_path -- 输入图片的文件路径 Return: im -- 分类网络输入数据对应形式的数据 """ image = Image.open(file_path).convert('L') image = image.resize((28, 28), Image.ANTIALIAS) image = np.array(image).astype(np.float32).flatten() image = image / 255.0 return image def infer(predict, parameters, file_path): """ 定义判断输入图片类别的函数: 读取并处理指定路径下的图片,然后调用训练得到的模型进行类别预测 Args: predict -- 输出层 parameters -- 模型参数 file_path -- 输入图片的文件路径 Return: """ # 读取并预处理要预测的图片 test_data = [] cur_dir = os.path.dirname(os.path.realpath(__file__)) test_data.append((load_image(cur_dir + file_path),)) # 利用训练好的分类模型,对输入的图片类别进行预测 probs = paddle.infer( output_layer=predict, parameters=parameters, input=test_data) lab = np.argsort(-probs) print "Label of image/infer_3.png is: %d" % lab[0][0] def main(): """ 主函数:定义神经网络结构,训练模型并打印学习曲线、预测测试数据类别 """ # 初始化,设置是否使用gpu,trainer数量 paddle.init(use_gpu=False, trainer_count=1) # 定义神经网络结构 images, label, predict, cost, parameters, optimizer = network_config() # 构造trainer,配置三个参数cost、parameters、update_equation,它们分别表示成本函数、参数和更新公式 trainer = paddle.trainer.SGD( cost=cost, parameters=parameters, update_equation=optimizer) # 初始化绘图变量 (only with python-tk installed) cost_ploter, error_ploter = plot_init() # lists用于存储训练的中间结果,包括cost和error_rate信息,初始化为空 lists = [] def event_handler_plot(event): """ 定义event_handler_plot事件处理函数: 事件处理器,可以根据训练过程的信息做相应操作:包括绘图和输出训练结果信息 Args: event -- 事件对象,包含event.pass_id, event.batch_id, event.cost等信息 Return: """ global LEARNING_STEP if isinstance(event, paddle.event.EndIteration): # 每训练100次(即100个batch),添加一个绘图点 if LEARNING_STEP % 100 == 0: cost_ploter.append(TRAIN_TITLE_COST, LEARNING_STEP, event.cost) # 绘制cost图像,保存图像为‘train_test_cost.png’ cost_ploter.plot('./train_test_cost') error_ploter.append(TRAIN_TITLE_ERROR, LEARNING_STEP, event.metrics['classification_error_evaluator']) # 绘制error_rate图像,保存图像为‘train_test_error_rate.png’ error_ploter.plot('./train_test_error_rate') LEARNING_STEP += 1 # 每训练100个batch,输出一次训练结果信息 if event.batch_id % 100 == 0: print "Pass %d, Batch %d, Cost %f, %s" % ( event.pass_id, event.batch_id, event.cost, event.metrics) if isinstance(event, paddle.event.EndPass): # 保存参数至文件 with open('params_pass_%d.tar' % event.pass_id, 'w') as parameter_file: trainer.save_parameter_to_tar(parameter_file) # 利用测试数据进行测试 result = trainer.test(reader=paddle.batch( paddle.dataset.mnist.test(), batch_size=128)) print "Test with Pass %d, Cost %f, %s\n" % ( event.pass_id, result.cost, result.metrics) # 添加测试数据的cost和error_rate绘图数据 cost_ploter.append(TEST_TITLE_COST, LEARNING_STEP, result.cost) error_ploter.append( TEST_TITLE_ERROR, LEARNING_STEP, result.metrics['classification_error_evaluator']) # 存储测试数据的cost和error_rate数据 lists.append(( event.pass_id, result.cost, result.metrics['classification_error_evaluator'])) """ 训练模型: paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=8192): 表示trainer从paddle.dataset.mnist.train()这个reader中读取了buf_size=8192大小的数据并打乱顺序 paddle.batch(reader(), batch_size=128): 表示从打乱的数据中再取出batch_size=128大小的数据进行一次迭代训练 event_handler:事件处理函数,可以自定义event_handler,根据事件信息做相应的操作, 下方代码中选择的是event_handler_plot函数 num_passes:定义训练的迭代次数 """ def event_handler(event): if isinstance(event, paddle.event.EndIteration): if event.batch_id % 100 == 0: print "Pass %d, Batch %d, Cost %f, %s" % ( event.pass_id, event.batch_id, event.cost, event.metrics) if isinstance(event, paddle.event.EndPass): # save parameters with open('params_pass_%d.tar' % event.pass_id, 'w') as f: trainer.save_parameter_to_tar(f) result = trainer.test(reader=paddle.batch( paddle.dataset.mnist.test(), batch_size=128)) print "Test with Pass %d, Cost %f, %s\n" % ( event.pass_id, result.cost, result.metrics) lists.append((event.pass_id, result.cost, result.metrics['classification_error_evaluator'])) trainer.train( reader=paddle.batch( paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=8192), batch_size=128), event_handler=event_handler_plot, num_passes=10) # 在多次迭代中,找到在测试数据上表现最好的一组参数,并输出相应信息 best = sorted(lists, key=lambda list: float(list[1]))[0] print 'Best pass is %s, testing Avgcost is %s' % (best[0], best[1]) print 'The classification accuracy is %.2f%%' % (100 - float(best[2]) * 100) # 预测输入图片的类型 infer(predict, parameters, '/image/infer_3.png') if __name__ == '__main__': main()
相关推荐
基于python实现的CNN卷积神经网络手写数字识别项目源码+详细注释+数据集(毕业设计&期末大作业)基于python实现的CNN卷积神经网络手写数字识别项目源码+详细注释+数据集(毕业设计&期末大作业)基于python实现的CNN...
在本项目中,我们主要探讨的是如何利用Paddle框架构建一维卷积神经网络(1D CNN)对西储大学轴承数据集进行故障识别。这是一个典型的应用深度学习技术解决机械设备故障预测的问题,对于工业设备的健康管理和维护具有...
在本项目中,我们主要探讨了使用Paddle框架实现的几种不同的文本分类模型,包括ERNIE+FC、BiLSTM+Attention、CNN以及BOW。这些模型被应用于二分类、多分类以及多标签分类任务,展示了深度学习在自然语言处理(NLP)...
在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持...
在本项目中,你将利用Python编程语言以及PaddlePaddle深度学习框架,构建和训练两种经典的卷积神经网络(CNN)模型:一种是基础的CNN结构,另一种是较为复杂的VGG模型。PaddlePaddle是中国首个开源的深度学习平台,...
在本项目中,研究者使用了公开数据集和2008年的BCI竞赛数据集,构建了一个基于功率谱密度(PSD)特征和卷积神经网络(CNN)的运动想象二分类模型。 首先,我们来理解“运动想象”(MI,Motor Imagery)。这是一种...
例如,一个深度卷积神经网络(CNN)可以识别图像中的对象是猫、狗还是其他动物。 2. **目标检测**: 神经网络可以识别图像中的多个对象,并确定它们的位置和类别。例如,使用R-CNN、Fast R-CNN、Faster R-CNN、...
本资源是一个基于PaddlePaddle深度学习框架的神经网络实现多种水果图像分类识别的学习项目。该项目包含完整的Python源码、详细的项目说明文档以及用于训练和测试的水果图像数据集。通过这个项目,学习者可以深入了解...
在实际应用中,这些技术通常结合计算机视觉和深度学习模型,如卷积神经网络(CNN)和循环神经网络(RNN),来处理图像序列数据。例如,可以通过训练一个能够理解和学习手势特征的模型,如使用骨干网络预训练模型(如...
- **CNN结构**:本设计包含三个卷积层,分别采用不同大小的卷积核,两个池化层,以及一个全连接层,最后是输出层。 3. **数据预处理**: - **MNIST数据集**:广泛用于手写数字识别的标准化数据集,包含60,000个...
2. 构建模型:使用PaddlePaddle的神经网络模块,比如卷积神经网络(CNN)或者循环神经网络(RNN),设计一个适合手写数字识别的模型结构。 3. 训练模型:通过反向传播算法优化模型参数,以最小化预测标签与实际标签...
基于paddle搭建神经网络实现5种水果识别分类python源码+水果数据集.zip 数据集介绍 - 来源:爬虫爬取百度图片 - 内容:总共1036水果图片,共5个类别(苹果288张、香蕉275张、葡萄216张、橙子276张、梨251张) - 图像...
手写数字识别是机器学习领域中的经典问题,通常使用卷积神经网络(CNN)来解决。在这个项目中,开发者可能采用了类似MNIST数据集进行训练,MNIST是包含60,000个训练样本和10,000个测试样本的手写数字图像数据库,...
胶囊网络(Capsule Network)是一种在深度学习领域中新兴的模型,它由Geoffrey Hinton教授及其团队提出,旨在解决传统卷积神经网络(CNN)的一些固有问题,如位置不变性和特征丢失等。PaddlePaddle(飞桨)是中国...
【课程设计】基于百度飞桨Paddle实现语音情感识别是一个深度学习领域的实践项目,主要目标是利用百度的飞桨框架(PaddlePaddle)来构建一个能够识别人类语音中的情感倾向的模型。这个项目涵盖了多个关键的知识点,...
4. **前馈神经网络(Feed-Forward Networks)**:在自注意力层之后,每个块包含一个前馈神经网络,通常由两个全连接层构成,中间用ReLU激活函数分隔,用于非线性变换。 5. **残差连接(Residual Connections)** 和...
在本数据集中,Paddle可能被用来构建和训练卷积神经网络(CNN)进行图像分类,以识别不同手势。 3. **数据集结构**:根据描述,这个数据集可能包含20个子文件夹,每个对应一种手势,每个子文件夹下则包含该手势的...
它们采用了深度学习技术,特别是卷积神经网络(CNN),通过大量标注数据进行训练,以识别和定位行人特征。 追踪则是对检测到的行人进行连续的识别和跟踪,确保在视频序列中同一行人的运动轨迹连贯。PaddleDetection...
PaddlePaddle是中国阿里云开发的开源深度学习平台,它提供了一个灵活的框架,支持多种神经网络模型的实现,包括胶囊网络模型。使用PaddlePaddle实现胶囊网络,用户可以利用其高效的优化算法、分布式训练能力以及易于...