多元分类|第三天的Keras

作者: 静脉 | 来源:发表于2017-09-02 20:47 被阅读0次

    今天学习了一个多元分类的机器学习方法,在这里分享给大家。
    说是多元分类其实就是把四个象限的坐标分成四类。

    废话不多说,先贴代码。

    from keras.layers import Dense, Activation
    from keras.models import Sequential
    from keras import optimizers
    import numpy as np
    
    # collect the data
    x_train1 = 100*np.random.random((100, 2))
    x_train2 = [-100, 100]*np.random.random((100, 2))
    x_train3 = -100*np.random.random((100, 2))
    x_train4 = [100, -100]*np.random.random((100, 2))
    x_train = np.concatenate((x_train1, x_train2, x_train3, x_train4))
    y_train = np.array([[1, 0, 0, 0]*100 + [0, 1, 0, 0]*100 + [0, 0, 1, 0]*100 + [0, 0, 0, 1]*100])
    y_train = y_train.reshape((400, 4))
    
    x_test1 = 100*np.random.random((100, 2))
    x_test2 = [-100, 100]*np.random.random((100, 2))
    x_test3 = -100*np.random.random((100, 2))
    x_test4 = [100, -100]*np.random.random((100, 2))
    x_test = np.concatenate((x_test1, x_test2, x_test3, x_test4))
    y_test = y_train
    
    # set the model
    model = Sequential()
    model.add(Dense(4, input_dim=2, activation=None, use_bias=False))
    model.add(Activation('softmax'))
    
    # compile the model and pick the loss function and optimizer
    ada = optimizers.Adagrad(lr=0.1, epsilon=1e-8)
    model.compile(optimizer=ada, loss='categorical_crossentropy', metrics=['accuracy'])
    
    # training the model
    ly = []
    for i in range(10):
        model.fit(x_train, y_train, batch_size=400, epochs=100, shuffle=False)
        ly.append(model.layers[0].get_weights())
    
    # test the model
    
    score = model.evaluate(x_test, y_test, batch_size=400)
    print 'loss:', score[0], '\t\taccuracy:', score[1]
    for i in range(10):
        print 'first weight:\t', ly[i][0][0], '\t\tsecond weight:\t', ly[i][0][1]
    
    

    下面咱么开始分析

    导入相关模块

    from keras.layers import Dense, Activation
    from keras.models import Sequential
    from keras import optimizers
    import numpy as np
    

    因为之前介绍过这里就不多说了详情请了解线性回归|第一天的Keras分类训练|第二天的Keras

    收集训练数据

    # collect the data
    x_train1 = 100*np.random.random((100, 2))
    x_train2 = [-100, 100]*np.random.random((100, 2))
    x_train3 = -100*np.random.random((100, 2))
    x_train4 = [100, -100]*np.random.random((100, 2))
    x_train = np.concatenate((x_train1, x_train2, x_train3, x_train4))
    y_train = np.array([[1, 0, 0, 0]*100 + [0, 1, 0, 0]*100 + [0, 0, 1, 0]*100 + [0, 0, 0, 1]*100])
    y_train = y_train.reshape((400, 4))
    
    x_test1 = 100*np.random.random((100, 2))
    x_test2 = [-100, 100]*np.random.random((100, 2))
    x_test3 = -100*np.random.random((100, 2))
    x_test4 = [100, -100]*np.random.random((100, 2))
    x_test = np.concatenate((x_test1, x_test2, x_test3, x_test4))
    y_test = y_train
    
    • 在这里用np.random.random((100,2))生成一百个大小在0~1之间的二维向量。为了增加其一般性,并扩大规模,我们乘上100后,就变成了在第一象限的100个坐标,范围为0~100。同理后面也是作相似处理。然后四个象限的坐标数据就收集好了,我们通过np.concatenate方法把这四个象限的数据合并到一起,x_train就完成了。
    • y_train的处理比较简单,最后要把y_train进行重塑。变成4维的向量就是【0 ,1,0,0】1代表什么意思呢,就是第二类了。
    • 好了,后面x_test和y_test就如同上面一样了。

    设计训练模型

    # set the model
    model = Sequential()
    model.add(Dense(4, input_dim=2, activation=None, use_bias=False))
    model.add(Activation('softmax'))
    

    在这里有一个新东西就是softmax下面解释一下:
    softmax 是对上一层的所有输入例如y1,y2......yn.进行如下操作。
     yi <- yi/(y1+y2+y3....+yn)
    了解了吧。

    编译模型

    # compile the model and pick the loss function and optimizer
    ada = optimizers.Adagrad(lr=0.1, epsilon=1e-8)
    model.compile(optimizer=ada, loss='categorical_crossentropy', metrics=['accuracy'])
    
    • 加速器选用AdaGrad,learing_rate=0.1,epsilon(小量)=1e-8(0.00000001)
    • 值得一提的是loss = 'categorical_crossentropy'在进行多分类时一定要用到这一个loss_function.并且在使用此损失函数时,我们的y_train一定要写成【0,1,0,0】类似的向量。即向量中只能有0、1.维度为要分成的类数。

    训练模型

    ly = []
    for i in range(10):
        model.fit(x_train, y_train, batch_size=400, epochs=100, shuffle=False)
        ly.append(model.layers[0].get_weights())
    
    • 这里我们分成10此训练每次训练100轮然后每次训练我们可以获得它的weight,追踪weight的变化。
    • ly = [] 是用来存储每此训练后的weight数组。
    • 因为只有一层,所以layers[0]就行了。

    测试模型

    
    score = model.evaluate(x_test, y_test, batch_size=400)
    print 'loss:', score[0], '\t\taccuracy:', score[1]
    for i in range(10):
        print 'first weight:\t', ly[i][0][0], '\t\tsecond weight:\t', ly[i][0][1]
    
    • 我们这里用evalute方法评估一下该训练好的模型。该模型返回loss,和accuracy。
    • 然后我们再把weight打印出来。

    得到数据

    /home/kroossun/miniconda2/bin/python /home/kroossun/PycharmProjects/ML/multi_classfication.py
    Using TensorFlow backend.
    2017-09-02 19:01:10.912652: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
    2017-09-02 19:01:10.912672: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
    2017-09-02 19:01:10.912677: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
    2017-09-02 19:01:10.912681: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
    2017-09-02 19:01:10.912684: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
    Epoch 1/100
    400/400 [==============================] - 0s - loss: 14.7780 - acc: 0.0500
    Epoch 2/100
    400/400 [==============================] - 0s - loss: 13.3719 - acc: 0.1025
    .........
    Epoch 99/100
    400/400 [==============================] - 0s - loss: 0.0181 - acc: 0.9975
    Epoch 100/100
    400/400 [==============================] - 0s - loss: 0.0181 - acc: 0.9975
    400/400 [==============================] - 0s
    loss: 0.0185921788216       accuracy: 0.997500002384
    first weight:   [ 0.15896426 -0.41137934 -0.40870011  0.18085584]       second weight:  [ 0.10717846  0.10917206 -0.71580416 -0.70930481]
    first weight:   [ 0.17234965 -0.42518327 -0.42248955  0.19431336]       second weight:  [ 0.11188302  0.11416188 -0.72089857 -0.71434933]
    first weight:   [ 0.18458323 -0.43780571 -0.43509614  0.20663606]       second weight:  [ 0.11647248  0.11900952 -0.72586221 -0.71925527]
    first weight:   [ 0.19587189 -0.44945827 -0.44673175  0.21802464]       second weight:  [ 0.12095292  0.12372655 -0.730703   -0.72403347]
    first weight:   [ 0.20636941 -0.46029857 -0.45755425  0.22862951]       second weight:  [ 0.12533006  0.12832268 -0.73542821 -0.72869295]
    first weight:   [ 0.21619371 -0.47044694 -0.46768427  0.23856631]       second weight:  [ 0.12960933  0.13280627 -0.74004406 -0.73324138]
    first weight:   [ 0.22543719 -0.47999874 -0.4772172   0.24792583]       second weight:  [ 0.13379583  0.13718463 -0.74455637 -0.73768568]
    first weight:   [ 0.23417395 -0.48902947 -0.4862287   0.25678098]       second weight:  [ 0.13789426  0.14146428 -0.7489711  -0.74203229]
    first weight:   [ 0.24246417 -0.49760085 -0.49478057  0.2651912 ]       second weight:  [ 0.14190902  0.14565097 -0.75329334 -0.74628681]
    first weight:   [ 0.25035757 -0.50576413 -0.50292408  0.27320552]       second weight:  [ 0.14584419  0.1497499  -0.75752771 -0.75045419]
    
    Process finished with exit code 0
    
    
    • 这里我们训练了1000轮其实100轮已经够了,我们这里训练的有点多。
    • 可以看到,在训练集上accuracy为0.9975,测试集上,也是0.9975。说明我们的训练效果还是不错的。

    相关文章

      网友评论

        本文标题:多元分类|第三天的Keras

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