背景信息

IRIS数据集是机器学习入门中最常用的数据集之一,但PaddlePaddle官方文档中并没有给出对该数据集分类的示例,因此本文进行了尝试,并通过两层全连接网络最终实现了该数据集的分类。

数据集说明

下载的数据集中类别标签是字符串,为方便使用将其替换为0、1、2,如下所示,前四列为特征值,最后一列为标签:

4.6,3.2,1.4,0.2,0
5.3,3.7,1.5,0.2,0
5.0,3.3,1.4,0.2,0
7.0,3.2,4.7,1.4,1
6.4,3.2,4.5,1.5,1
6.9,3.1,4.9,1.5,1
5.5,2.3,4.0,1.3,1
整理流程

实现的代码包括如下几个部分

  1. iris数据文件读取并切分为训练集和测试集两部分。
  2. 从训练集和测试集中分布提取标签和特征。
  3. 实现PaddlePaddle使用的reader函数。
  4. 定义模型并进行训练。
  5. 进行预测

详细代码

# 引入所需包
import paddle.v2 as paddle
import numpy as np
import random
#读取数据函数,输入为数据文件名和训练、测试切分比率,返回为list类型的训练数据集和测试数据集
def loadData(fileName,ratio):   trainingData=[]testData=[]with open(fileName) as txtData:lines=txtData.readlines()for line in lines:lineData=line.strip().split(',')    #去除空白和逗号“,”if random.random()<ratio:             #数据集分割比例trainingData.append(lineData)   #训练数据集列表else:testData.append(lineData)       #测试数据集列表return trainingData,testData#输入为list类型数据,分割为特征和标签两部分,返回为np.narray类型的特征数组和标签数组
def splitData(dataSet):  character=[]label=[]for i in range(len(dataSet)):character.append([float(tk) for tk in dataSet[i][:-1]])label.append(dataSet[i][-1])return np.array(character),np.array(label)
# 读取数据数组和标签数组,并将二者组合为PaddlePaddle中使用的reader
def paddle_reader(dataCharacter,dataLabel):def reader():       for i in xrange(len(dataLabel)):yield dataCharacter[i,:], int(dataLabel[i])return reader    
# 进行数据预处理工作
iris_file='/book/iris012.data'
ratio=0.7
trainingData, testData=loadData(iris_file,ratio) ##加载文件,按一定比率切分为训练样本和测试样本
#a1=random.shuffle(trainingData)
trainingCharacter,trainingLabel=splitData(trainingData)  #将训练样本切分为数据和标签两个数组
testCharacter,testLabel=splitData(testData)  #将测试样本切分为数据和标签两个数组
# 实现reader
train_reader=paddle_reader(trainingCharacter,trainingLabel)
test_reader=paddle_reader(testCharacter,testLabel)

---------------------------------下面为模型定义以及训练过程------------------------

# 该模型运行在单个CPU上
paddle.init(use_gpu=False, trainer_count=1)features = paddle.layer.data(name='features', type=paddle.data_type.dense_vector(4))
label = paddle.layer.data(name='label', type=paddle.data_type.integer_value(3))# 使用两侧全连接网络
fc1 = paddle.layer.fc(input=features, size=10, act=paddle.activation.Linear())
predict = paddle.layer.fc(input=fc1, size=3,act=paddle.activation.Softmax())cost = paddle.layer.classification_cost(input=predict, label=label)
parameters = paddle.parameters.create(cost)
optimizer = paddle.optimizer.Momentum(momentum=0)trainer = paddle.trainer.SGD(cost=cost,parameters=parameters,update_equation=optimizer)
#feeding={'features': 0, 'label': 1}
from paddle.v2.plot import Plotertrain_title = "Train cost"
test_title = "Test cost"
cost_ploter = Ploter(train_title, test_title)step = 0# event_handler to plot a figure
def event_handler_plot(event):global stepif isinstance(event, paddle.event.EndIteration):if step % 10 == 0:cost_ploter.append(train_title, step, event.cost)cost_ploter.plot()step += 1if isinstance(event, paddle.event.EndPass):# save parameterswith open('params_pass_%d.tar' % event.pass_id, 'w') as f:trainer.save_parameter_to_tar(f)result = trainer.test(reader=paddle.batch(test_reader, batch_size=10))cost_ploter.append(test_title, step, result.cost)
lists = []def event_handler(event):if isinstance(event, paddle.event.EndIteration):if event.batch_id % 10 == 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 parameterswith open('params_pass_%d.tar' % event.pass_id, 'w') as f:trainer.save_parameter_to_tar(f)result = trainer.test(reader=paddle.batch(test_reader, batch_size=10))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(train_reader, buf_size=100),batch_size=10),#feeding=feeding,event_handler=event_handler_plot,num_passes=50)

---------------------------------下面为模型验证过程------------------------

# 准备测试数据
test_data_creator = test_reader()
test_data = []
test_label = []for item in test_data_creator:test_data.append((item[0],))test_label.append(item[1])if len(test_data) == 100:break
#进行预测
probs = paddle.infer(output_layer=predict, parameters=parameters, input=test_data)for i in xrange(len(probs)):print "label=" + str(test_label[i]) + ", predict=" + str(np.argsort(-probs)[i][0])

可以看出,有部分值预测错误,主要原因是Iris数据集比较小的缘故,可以通过增加训练轮数来改善,比如将轮数增加到300,将会得到非常好的预测效果。

在PaddlePaddle框架下通过两层全连接网络实现IRIS数据分类相关推荐

  1. 【Text_classification】 PaddlePaddle框架下出错调整到运行的实验和记录

    使用的是Paddle框架2.0版本 网页: https://github.com/PaddlePaddle/PaddleHub/tree/release/v2.1/demo/text_classifi ...

  2. scrapy框架下的两个爬虫分工合作爬取智联招聘所有职位信息。

    爬虫一 本次爬取为两个爬虫,第一个爬虫爬取需要访问的URL并且存储到文本中,第二个爬虫读取第一个爬虫爬取的URl然后依次爬取该URL下内容,先运行第一个爬虫然后运行第二个爬虫即可完成爬取. 本帖仅供学 ...

  3. 在vue框架下element-ui两种引用阿里云图标库的方法

    方法一下载资源到本地 1.搜索想要的图标并添加入库 2.添加入项目 3.  下载解压放入src的文件中, 要在main.js文件中声明引入压缩包中的iconfont.css文件 注意文件路径 4.引入 ...

  4. 两层全连接网络反向传播梯度推导(矩阵形式、sigmoid、最小均方差MSE)

    Solving for Derivatives 虽然正文用了英文(写正文和敲公式的中英文输入法互换太折磨了-_-),但是都是贼简单的表述,希望能读下去,更希望能对您有帮助! h=XW1+b1hsigm ...

  5. ResNet在分别在Keras和tensorflow框架下的应用案例

    一.残差神经网络--ResNet的综述 深度学习网络的深度对最后的分类和识别的效果有着很大的影响,所以正常想法就是能把网络设计的越深越好, 但是事实上却不是这样,常规的网络的堆叠(plain netw ...

  6. 深度学习——残差神经网络ResNet在分别在Keras和tensorflow框架下的应用案例

    原文链接:https://blog.csdn.net/loveliuzz/article/details/79117397 一.残差神经网络--ResNet的综述 深度学习网络的深度对最后的分类和识别 ...

  7. 模式识别新研究:微软OCR两层优化提升自然场景下的文字识别精度

    模式识别新研究:微软OCR两层优化提升自然场景下的文字识别精度 发表于2015-03-30 23:46| 6209次阅读| 来源CSDN| 8 条评论| 作者霍强 模式识别微软亚洲研究院微软OCR文字 ...

  8. 基于PaddlePaddle框架实现桃子分类

    众所周知,图像相比文字能够提供更加生动,容易理解及更具艺术感的信息,是人们转递与交换信息的重要来源. 谈到图像分类,图像分类是根据图像的语义信息对不同类别图像进行区分,是计算机视觉中重要的基础问题,也 ...

  9. Caffe使用step by step:caffe框架下的基本操作和分析

    Caffe使用step by step:caffe框架下的基本操作和分析 时间:2015-10-16 11:40:09      阅读:808      评论:0      收藏:0      [点我 ...

最新文章

  1. [Contest20170910]string
  2. android编译.a文件,Android 7.1源码编译导入AS完整教程
  3. 蓝牙PSKEY的调整
  4. CodeForces - 1486E Paired Payment(分层图最短路)
  5. linux主机数据拷贝,linux 服务器之间拷贝文件
  6. Work Queue based multi-threading
  7. kali的burpsuite笔记
  8. (转)关于CNN中平移不变性的理解
  9. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
  10. 信号与系统实验二___MATLAB
  11. ERP应用优势和劣势有哪些
  12. 《活法》 -豆瓣评分8.4
  13. 如何添加PR视频特效?
  14. 军哥独家QCIE(囊括CCIE和HCIEv3.0)的全新课程。请大家参阅
  15. 计算机网络 | 实验二 WINPCWP编程
  16. 计算机win10分区软件,简单易用的win10分区软件:分区助手
  17. 【奇葩问题】每次打开excel文件都会出现两个窗口,一个是空白的sheet1,另一个是自己的文档
  18. 华为数据管理与分析课程
  19. Ring 4012PLM 打印机驱动
  20. this.$router.push方法,父子如何传值和接收值

热门文章

  1. 10个大数据领域的杰出公司
  2. Linux的三种权限含义,Linux chmod命令及权限含义
  3. 应届生去软通动力怎么样_超强干货:应届生如何找实习工作?
  4. Vue父组件监听子组件调用删除模块(个性化页面设置会使用到)
  5. python画聚类图_python绘制的聚类图Python的局部变量和全局变量使用解惑
  6. gateway网关_使用Sentinel实现gateway网关及服务接口限流
  7. LeetCode:67. 二进制求和(python、c++)
  8. ~~染色法判别二分图
  9. 小技巧 ----- 枚举整数的每一位数字
  10. 马虎的算式子 (枚举法)