美文网首页
利用keras框架实现鸢尾花的识别

利用keras框架实现鸢尾花的识别

作者: 青漾 | 来源:发表于2019-07-25 16:07 被阅读0次

    利用keras框架实现鸢尾花的识别#

    前言

    本项目是朱某学习第二阶段深度学习给自己布置的一个家庭作业,在第二阶段的学习中,我学习了如何处理二元分类、多分类问题以及连续数据预测的问题。如何对送进网络的数据进行预处理。如何根据送进网络的验证数据正确处理过拟合问题。在学习过程中,我用到的数据集都是keras自带的数据集,因此我就想。能否根据自己自定义的一批数据来实现网络训练,并正确判断鸢尾花的类型,虽然艰难重重,但是最后还是成功了。

    数据集介绍

    本次项目采用采用的是鸢尾花数据集,Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例。数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可以通过这4个特征预测鸢尾花卉属于(iris-setosa, iris-versicolour, iris-virginica)中的哪一品种。在去年寒假我曾用过该数据集做个KNN算法的测试,虽然该数据集数据量较少,但因为有较大的相关性,放进神经网络训练,依然可以得到不错的结果。


    i鸢尾花
    数据格式

    为了方便计算机的读取,我们把三种花的类型分别用:0,1,2进行替代


    数据
    接下来我们读入数据
    import csv
    import random
    import numpy
    def loadDataset(filename, split, trainingSet=[], testSet=[]):
        with open(filename, 'rt') as csvfile:
            lines = csv.reader(csvfile)
            dataset = list(lines)
            # 转换成list,lines是所有的行
            for x in range(len(dataset) - 2):
                for y in range(5):
                    dataset[x][y] = float(dataset[x][y])
    
                if random.random() < split:
                    trainingSet.append(dataset[x])
                else:
                    testSet.append(dataset[x])
    
    
    trainingSet=[]
    testSet=[]
    loadDataset(r'iris.data.txt', 0.67, trainingSet, testSet)
    
    #通过设定一个概率阈值对数据集分割训练集和测试集
    partial_x_train = []
    #训练集输入
    partial_y_train = []
    #训练集标签
    x_val = []
    y_val = []
    
    #处理测试输入数据集,将前四个元素生成一个array,最后把array拼在一起,构建一个五维张量
    for i in trainingSet:
        partial_x_train.append((i[:4]))
    
    partial_x_train= numpy.asfarray(partial_x_train)
    #
    #处理测试输入标签
    # 初始化一个三维array,值的大小代表概率。根据数据赋值,把0,1,2对应元素赋值0.99,其他赋值0.01,最后整合成一个四维度张量
    for i in trainingSet:
        targets = numpy.zeros(3) + 0.01
        targets[int(i[4:][0])] = 0.99
    
        partial_y_train.append(targets)
    
    partial_y_train=numpy.array(partial_y_train)
    
    #exit
    #
    #处理测试输入数据集
    for i in testSet:
        x_val.append((i[:4]))
    
    x_val= numpy.asfarray(x_val)
    #
    # #处理测试输入标签
    
    for i in testSet:
        target = numpy.zeros(3) + 0.01
        target[int(i[4:][0])] = 0.99
    
        y_val.append(target)
    
    y_val=numpy.array(y_val)
    
    
    #将测试集的的一部分分为校验数据
    test_x=x_val[12:]
    test_y=y_val[12:]
    
    x_val1=x_val[:12]
    y_val1=y_val[:12]
    
    print(y_val1)
    

    通过观察,我们可以看出,一份数据的前四个数据决定最后一个数据,因为输出的数据总共有三个类别,因此我们设计一个输入4个结点输出三个节点的神经网络,因为数据量较少,我们设置两层中间层,每层64个节点。前两层我们使用‘relu’作为激活函数


    relu
    • 当结果是输出多个分类的概率时,用softmax激活函数


      softmax

    对于输出多个分类结果,最好的损失函数是categorical_crossentropy

    categorical_crossentropy性质:即受误差的影响,所以当误差大的时候,权重更新就快,当误差小的时候,权重的更新就慢。这是一个很好的性质。
    性质:
    a.非负性。(所以我们的目标就是最小化代价函数)
    b.当真实输出a与期望输出y接近的时候,代价函数接近于0.(比如y=0,a~0;y=1,a~1时,代价函数都接近0)。

    
    from keras import models
    from keras import layers
    model = models.Sequential()
    model.add(layers.Dense(64, activation='relu', input_shape=(4,)))
    #inputshape 4 代表输入5维度tensor
    model.add(layers.Dense(64, activation='relu'))
    #当结果是输出多个分类的概率时,用softmax激活函数,它将为3个分类提供不同的可能性概率值
    model.add(layers.Dense(3, activation='softmax'))
    
    #对于输出多个分类结果,最好的损失函数是categorical_crossentropy
    model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
    
    #
    history = model.fit(partial_x_train, partial_y_train, epochs=64, validation_data = (x_val1, y_val1))
    #
    #
    history_dict = history.history
    print(history_dict.keys())
    
    
    
    

    接下来我们根据训练数据的误差和校验数据的误差画出函数

    误差曲线

    接下来我们根据训练数据的误差和校验数据的精度画出函数


    误差曲线 准确度曲线

    可以看出第二种值是最大的,因此还是蛮准的,接下来我们对输入的数据进行一些简单的处理。统计化处理,把数值处理成期望为0,方差为1的分布。

    常用的数据处理方法有:

    • 把数值都变小,通常把数组转换到0和1之间。
    • 统一化,把数值处理成在一个取值范围之内。
    • 统计化处理,把数值处理成期望为0,方差为1的分布。

    第三种处理方式的公式如下,其中X’为均值,std为(X-X')的标准差

    X=(X-X')\div STD

    实现代码如下:(只对训练数据进行处理)

    
    mean = partial_x_train.mean(axis=0)
    partial_x_train -= mean
    std = partial_x_train.std(axis = 0)
    partial_x_train /= std
    ​
    x_val -= mean
    x_val /= std
    
    
    数据处理结果

    虽然最后评价出的准确值都差不多,但是我们可以看出训练时的准度高多了

    接下来开始进入CNN阶段。

    相关文章

      网友评论

          本文标题:利用keras框架实现鸢尾花的识别

          本文链接:https://www.haomeiwen.com/subject/hwyulctx.html