美文网首页
使用Keras和tensorfow,CNN手写数字识别

使用Keras和tensorfow,CNN手写数字识别

作者: smallcui | 来源:发表于2018-12-10 12:59 被阅读0次

    查看数据

    from tensorflow.keras.datasets import mnist
    import matplotlib.pyplot as plt
    (train_x,train_y),(test_x,test_Y)=mnist.load_data()
    plt.figure(figsize=(10, 10))
    
    for i in range(25):
        plt.subplot(5, 5, i+1 )
        plt.xticks([])
        plt.yticks([])
        plt.grid(False)
        plt.imshow(train_x[i], cmap=plt.cm.binary)
        plt.xlabel(train_y[i])
    plt.show()
    
    
    output_1_0.png

    处理数据 数据归一化

    train_x=train_x.reshape((-1,28,28,1))/255.0
    test_x=test_x.reshape((-1,28,28,1))/255.0
    
    

    使用全连接model

    import tensorflow as tf
    from tensorflow.python.keras.utils import multi_gpu_model
    
    model = tf.keras.models.Sequential([
      tf.keras.layers.Flatten(),
      tf.keras.layers.Dense(512, activation=tf.nn.relu),
      tf.keras.layers.Dropout(0.2),
      tf.keras.layers.Dense(10, activation=tf.nn.softmax)
    ])
    
    #model=multi_gpu_model(model,gpus=2)
    
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    history=model.fit(train_x, train_y, epochs=5,batch_size=64,validation_data=(test_x,test_Y))
    
    print(history.history)
    
    Train on 60000 samples, validate on 10000 samples
    Epoch 1/5
    60000/60000 [==============================] - 3s 44us/step - loss: 0.2453 - acc: 0.9292 - val_loss: 0.1210 - val_acc: 0.9645
    Epoch 2/5
    60000/60000 [==============================] - 2s 39us/step - loss: 0.1045 - acc: 0.9685 - val_loss: 0.0873 - val_acc: 0.9742
    Epoch 3/5
    60000/60000 [==============================] - 2s 39us/step - loss: 0.0734 - acc: 0.9772 - val_loss: 0.0760 - val_acc: 0.9754
    Epoch 4/5
    60000/60000 [==============================] - 2s 39us/step - loss: 0.0544 - acc: 0.9827 - val_loss: 0.0626 - val_acc: 0.9808
    Epoch 5/5
    60000/60000 [==============================] - 2s 39us/step - loss: 0.0431 - acc: 0.9865 - val_loss: 0.0606 - val_acc: 0.9809
    {'val_loss': [0.12101827680170536, 0.08727486125305295, 0.07602117696609348, 0.06258633336527274, 0.06062790886806324], 'val_acc': [0.9645, 0.9742, 0.9754, 0.9808, 0.9809], 'loss': [0.24529895100792248, 0.10447835950454076, 0.07340832727799813, 0.05438600577091177, 0.04305711637934049], 'acc': [0.9291833333333334, 0.96845, 0.9772, 0.9827166666666667, 0.9864833333333334]}
    

    卷积神经网络model

    import tensorflow as tf
    from tensorflow.python.keras.utils import multi_gpu_model
    
    
    model = tf.keras.models.Sequential([
        tf.keras.layers.Conv2D(32, kernel_size=(5, 5), input_shape=(28, 28, 1),activation='relu',name='conv2d-32'),
        tf.keras.layers.MaxPool2D(strides=(2, 2),name='MaxPool2D-32'),
        tf.keras.layers.Conv2D(64, kernel_size=(5, 5),activation='relu',name='Conv2D-64'),
        tf.keras.layers.MaxPool2D(strides=(2, 2),name='MaxPool2D-64'),
        tf.keras.layers.Flatten(name='Flatten'),
        tf.keras.layers.Dropout(0.5,name='Dropout'),
        tf.keras.layers.Dense(10, activation='softmax',name='Dense-10')
    ])
    model.summary()
    model=multi_gpu_model(model,gpus=2)
    
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    
    history=model.fit(train_x, train_y, epochs=10,validation_data=(test_x,test_Y))
    
    print(history.history)
    
    
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    conv2d-32 (Conv2D)           (None, 24, 24, 32)        832       
    _________________________________________________________________
    MaxPool2D-32 (MaxPooling2D)  (None, 12, 12, 32)        0         
    _________________________________________________________________
    Conv2D-64 (Conv2D)           (None, 8, 8, 64)          51264     
    _________________________________________________________________
    MaxPool2D-64 (MaxPooling2D)  (None, 4, 4, 64)          0         
    _________________________________________________________________
    Flatten (Flatten)            (None, 1024)              0         
    _________________________________________________________________
    Dropout (Dropout)            (None, 1024)              0         
    _________________________________________________________________
    Dense-10 (Dense)             (None, 10)                10250     
    =================================================================
    Total params: 62,346
    Trainable params: 62,346
    Non-trainable params: 0
    _________________________________________________________________
    Train on 60000 samples, validate on 10000 samples
    Epoch 1/10
    60000/60000 [==============================] - 10s 172us/step - loss: 0.1965 - acc: 0.9391 - val_loss: 0.0442 - val_acc: 0.9869
    Epoch 2/10
    60000/60000 [==============================] - 10s 160us/step - loss: 0.0712 - acc: 0.9780 - val_loss: 0.0314 - val_acc: 0.9904
    Epoch 3/10
    60000/60000 [==============================] - 10s 161us/step - loss: 0.0527 - acc: 0.9835 - val_loss: 0.0254 - val_acc: 0.9921
    Epoch 4/10
    60000/60000 [==============================] - 10s 161us/step - loss: 0.0439 - acc: 0.9862 - val_loss: 0.0216 - val_acc: 0.9928
    Epoch 5/10
    60000/60000 [==============================] - 10s 161us/step - loss: 0.0376 - acc: 0.9881 - val_loss: 0.0246 - val_acc: 0.9922
    Epoch 6/10
    60000/60000 [==============================] - 10s 160us/step - loss: 0.0353 - acc: 0.9888 - val_loss: 0.0188 - val_acc: 0.9937
    Epoch 7/10
    60000/60000 [==============================] - 10s 161us/step - loss: 0.0308 - acc: 0.9902 - val_loss: 0.0202 - val_acc: 0.9939
    Epoch 8/10
    60000/60000 [==============================] - 10s 161us/step - loss: 0.0291 - acc: 0.9911 - val_loss: 0.0235 - val_acc: 0.9923
    Epoch 9/10
    60000/60000 [==============================] - 10s 161us/step - loss: 0.0265 - acc: 0.9913 - val_loss: 0.0200 - val_acc: 0.9940
    Epoch 10/10
    60000/60000 [==============================] - 10s 161us/step - loss: 0.0259 - acc: 0.9917 - val_loss: 0.0228 - val_acc: 0.9918
    {'val_loss': [0.04419064577044919, 0.031431237593130205, 0.025389306041694364, 0.02164296607077413, 0.024627994345039768, 0.01881986585248378, 0.02021861595758237, 0.023530831995893096, 0.020035049462070312, 0.022779195395996793], 'val_acc': [0.9869, 0.9904, 0.9921, 0.9928, 0.9922, 0.9937, 0.9939, 0.9923, 0.994, 0.9918], 'loss': [0.1964585481060048, 0.07116204217337072, 0.05266052842771945, 0.04390566666952024, 0.037550158609023006, 0.03534947692871792, 0.030789569879024446, 0.029085736439652586, 0.026527962450721924, 0.025876243178133154], 'acc': [0.9391166666666667, 0.97805, 0.9835, 0.9862166666666666, 0.9880666666666666, 0.9887666666666667, 0.9902, 0.9910833333333333, 0.99135, 0.9917333333333334]}
    

    可视化model

    from IPython.display import SVG
    from tensorflow.python.keras.utils.vis_utils import model_to_dot
    
    SVG(model_to_dot(model).create(prog='dot', format='svg'))
    
    1544417740354.jpg

    打印训练曲线

    import matplotlib.pyplot as plt
    history_dict = history.history
    
    acc = history.history['acc']
    loss = history.history['loss']
    
    val_acc = history.history['val_acc']
    val_loss = history.history['val_loss']
    
    
    epochs = range(1, len(acc) + 1)
    
    # "bo" is for "blue dot"
    plt.plot(epochs, loss, 'bo', label='Training loss')
    plt.plot(epochs, val_loss, 'b', label='Training val_loss')
    
    # b is for "solid blue line"
    plt.title('Training and validation loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.legend()
    
    plt.show()
    
    
    plt.clf()   # clear figure
    acc_values = history_dict['acc']
    
    plt.plot(epochs, acc, 'bo', label='Training acc')
    plt.plot(epochs, val_acc, 'b', label='Training val_acc')
    
    plt.title('Training and validation accuracy')
    plt.xlabel('Epochs')
    plt.ylabel('Accuracy')
    plt.legend()
    
    plt.show()
    
    output_11_0.png output_11_1.png

    查看验证

    import numpy as np
    plt.figure(figsize=(10, 10))
    
    p_label=np.argmax(model.predict(test_x[0:49]),axis=1)
    
    p1_label=model.predict(test_x[0:49])
    p_max_labels=np.max(p1_label, axis=1)
    
    
    
    for i in range(49):
        plt.subplot(7,7,i+1)
        plt.imshow(test_x[i].reshape(28,28))
        plt.xticks([])
        plt.yticks([])
        if p_label[i]==test_Y[i]:
            color = 'blue'
        else:
            color = 'red'
        plt.xlabel("{} {:2.1f}% ({})".format(p_label[i],
                                             100 * p_max_labels[i],
                                             test_Y[i]),color=color)
    
    
    
    
    
    
    output_13_0.png

    看看那些错了

    p_label=np.argmax(model.predict(test_x),axis=1)
    result=np.equal(p_label,test_Y)
    index_wrong=np.where(result==False)
    print(index_wrong)
    x=test_x[index_wrong]
    right_y=test_Y[index_wrong]
    wrong_y=np.argmax(model.predict(x),axis=1)
    wrong_max=np.max(model.predict(x), axis=1)
    
    print(wrong_y)
    print(len(right_y))
    print(wrong_max)
    
    
    
    plt.figure(figsize=(12, 12))
    
    
    for i in range(49):
        plt.subplot(7,7,i+1)
        plt.imshow(x[i].reshape(28,28))
        plt.xticks([])
        plt.yticks([])
        if wrong_y[i]==right_y[i]:
            color = 'blue'
        else:
            color = 'red'
        plt.xlabel("{} {:2.1f}% ({})".format(wrong_y[i],
                                             100 * wrong_max[i],
                                             right_y[i]),color=color)
    
    
    (array([ 320,  340,  445,  449,  659,  684,  846,  947, 1014, 1039, 1112,
           1138, 1226, 1232, 1242, 1247, 1260, 1522, 1621, 1709, 1901, 2035,
           2070, 2130, 2293, 2329, 2414, 2447, 2462, 2488, 2597, 2654, 2770,
           2896, 2927, 2939, 2995, 3030, 3225, 3384, 3422, 3520, 3534, 3558,
           3730, 4027, 4176, 4400, 4731, 4761, 4807, 4814, 4823, 5937, 5997,
           6172, 6569, 6576, 6597, 6625, 6651, 8408, 9015, 9642, 9664, 9679,
           9698, 9729, 9770]),)
    [8 3 0 5 1 2 9 9 5 1 6 1 2 4 9 5 1 9 6 5 4 3 9 9 6 2 4 9 0 4 3 1 5 0 2 5 8
     0 9 6 0 4 8 0 9 1 7 1 2 8 0 0 4 3 9 5 2 1 7 2 8 5 2 7 7 2 5 6 0]
    69
    [0.5487968  0.7154917  0.9463902  0.95204204 0.6993093  0.61079836
     0.9542614  0.789387   0.99403703 0.8320868  0.9761881  0.59718984
     0.7508293  0.8380351  0.7072604  0.9447838  0.625205   0.66415906
     0.5856947  0.95903456 0.85126615 0.9803823  0.6441936  0.9830293
     0.7776802  0.8865479  0.7413854  0.5177151  0.71139973 0.7475217
     0.9774415  0.9998882  0.7372158  0.9488201  0.6718568  0.8249474
     0.5528     0.54504114 0.54805565 0.62762654 0.99735606 0.9991032
     0.65194035 0.9706246  0.6190088  0.4959286  0.8655964  0.6018419
     0.5978997  0.71149963 0.68390083 0.7572602  0.6328306  0.903725
     0.5591738  0.5529782  0.6141367  0.96959394 0.6757054  0.54540163
     0.9384903  0.4220014  0.6736965  0.5338367  0.58165085 0.41066182
     0.47381133 0.9988312  0.58307064]
    
    output_15_1.png

    相关文章

      网友评论

          本文标题:使用Keras和tensorfow,CNN手写数字识别

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