机器学习之实战篇——MNIST手写数字0~9识别(全毗连神经网络模子) ...

打印 上一主题 下一主题

主题 1655|帖子 1655|积分 4965

文章传送

机器学习之监督学习(一)线性回归、多项式回归、算法优化[巨具体笔记]
机器学习之监督学习(二)二元逻辑回归
机器学习之监督学习(三)神经网络基础
机器学习之实战篇——猜测二手房房价(线性回归)
机器学习之实战篇——肿瘤良性/恶性分类器(二元逻辑回归)
MNIST数据集介绍:

MNIST数据集是机器学习和计算机视觉领域中最知名和广泛使用的数据集之一。它是一个大型手写数字数据库,包罗 70,000 张手写数字图像,60,000 张练习图像,10,000 张测试图像。每张图像是 28x28 像素的灰度图像素值范围从 0(白色)到 255(黑色),每张图像对应一个 0 到 9 的数字标签。
在实验开始前,为了熟悉这个伟大的数据集,读者可以先做一下下面的小实验,考试你的手写数字识别本领。只管识别手写数字对于人类来说小菜一碟,但由于图像分辨率比较低同时有些数字写的比较抽象,因此想要到达100%准确率还是很难的,实验表明类的平均准确率约为97.5%到98.5%,实验代码如下:
  1. import numpy as np
  2. from tensorflow.keras.datasets import mnist
  3. import matplotlib.pyplot as plt
  4. from random import sample
  5. # 加载MNIST数据集
  6. (_, _), (x_test, y_test) = mnist.load_data()
  7. # 随机选择100个样本
  8. indices = sample(range(len(x_test)), 100)
  9. correct = 0
  10. total = 100
  11. for i, idx in enumerate(indices, 1):
  12.     # 显示图像
  13.     plt.imshow(x_test[idx], cmap='gray')
  14.     plt.axis('off')
  15.     plt.show()
  16.     # 获取用户输入
  17.     user_answer = input(f"问题 {i}/100: 这个数字是什么? ")
  18.     # 检查答案
  19.     if int(user_answer) == y_test[idx]:
  20.         correct += 1
  21.         print("正确!")
  22.     else:
  23.         print(f"错误. 正确答案是 {y_test[idx]}")
  24.     print(f"当前正确率: {correct}/{i} ({correct/i*100:.2f}%)")
  25. print(f"\n最终正确率: {correct}/{total} ({correct/total*100:.2f}%)")
复制代码
实验过程

实验环境

pycharm+jupyter notebook
导入模块

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import tensorflow as tf
  4. from sklearn.metrics import accuracy_score
  5. from tensorflow.keras.layers import Input,Dense,Dropout
  6. from tensorflow.keras.regularizers import l2
  7. from tensorflow.keras.optimizers import Adam
  8. from tensorflow.keras.models import Sequential
  9. from tensorflow.keras.losses import SparseCategoricalCrossentropy
  10. from tensorflow.keras.callbacks import EarlyStopping
  11. import matplotlib
  12. matplotlib.rcParams['font.family'] = 'SimHei'  # 或者 'Microsoft YaHei'
  13. matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号 '-'
复制代码
导入MNIST数据集

导入mnist手写数字集(包括练习集和测试集)
  1. from tensorflow.keras.datasets import mnist
  2. (x_train, y_train), (x_test, y_test) = mnist.load_data()
复制代码
查看练习、测试数据集的规模
  1. print(f'x_train.shape:{x_train.shape}')
  2. print(f'y_train.shape:{y_train.shape}')
  3. print(f'x_test.shape:{x_test.shape}')
  4. print(f'y_test.shape:{y_test.shape}')
复制代码
  1. x_train.shape:(60000, 28, 28)
  2. y_train.shape:(60000,)
  3. x_test.shape:(10000, 28, 28)
  4. y_test.shape:(10000,)
复制代码
查看64张手写图片
  1. #查看64张训练手写图片内容
  2. #获取训练集规模
  3. m=x_train.shape[0]
  4. #创建4*4子图布局
  5. fig,axes=plt.subplots(8,8,figsize=(8,8))
  6. #每张子图随机呈现一张手写图片
  7. for i,ax in enumerate(axes.flat):
  8.     idx=np.random.randint(m)
  9.     #imshow():传入图片的像素矩阵,cmap='gray',显示黑白图片
  10.     ax.imshow(x_train[idx],cmap='gray')
  11.     #设置子图标题,将图片标签显示在图片上方
  12.     ax.set_title(y_train[idx])
  13.      # 移除坐标轴
  14.     ax.axis('off')
  15. #调整子图之间的间距
  16. plt.tight_layout()
复制代码
(由于空间限制,没有展现全64张图片)

将图片灰度像素矩阵转为灰度像素向量[展平],同时举行归一化[/255](0-255->0-1)
  1. x_train_flat=x_train.reshape(60000,28*28).astype('float32')/255
  2. x_test_flat=x_test.reshape(10000,28*28).astype('float32')/255
复制代码
查看展平后数据集规模
  1. print(f'x_train.shape:{x_train_flat.shape}')
  2. print(f'x_test.shape:{x_test_flat.shape}')
复制代码
  1. x_train.shape:(60000, 784)
  2. x_test.shape:(10000, 784)
复制代码
创建神经网络模子举行练习,测试,评估

开端创建第一个三层全毗连神经网络,隐层中采用‘relu’激活函数,使用分类交织熵损失函数(设置from_logits=True,淘汰练习过程计算误差),Adam学习率自顺应器(设置初始学习率0.001)
  1. #创建神经网络
  2. model1=Sequential(
  3.     [
  4.         Input(shape=(784,)),
  5.         Dense(128,activation='relu',name='L1'),
  6.         Dense(32,activation='relu',name='L2'),
  7.         Dense(10,activation='linear',name='L3'),
  8.     ],name='model1',
  9. )
  10. #编译模型
  11. model1.compile(loss=SparseCategoricalCrossentropy(from_logits=True),optimizer=Adam(learning_rate=0.001))
  12. #查看模型总结
  13. model1.summary()
复制代码
  1. Model: "model1"
  2. _________________________________________________________________
  3. Layer (type)                Output Shape              Param #   
  4. =================================================================
  5. L1 (Dense)                  (None, 128)               100480   
  6.                                                                  
  7. L2 (Dense)                  (None, 32)                4128      
  8.                                                                  
  9. L3 (Dense)                  (None, 10)                330      
  10.                                                                  
  11. =================================================================
  12. Total params: 104,938
  13. Trainable params: 104,938
  14. Non-trainable params: 0
复制代码
model1拟合练习集开始练习,迭代次数开端设置为20
  1. model1.fit(x_train_flat,y_train,epochs=20)
复制代码
  1. Epoch 1/20
  2. 1875/1875 [==============================] - 12s 5ms/step - loss: 0.2502
  3. Epoch 2/20
  4. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.1057
  5. Epoch 3/20
  6. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0748
  7. Epoch 4/20
  8. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0547
  9. Epoch 5/20
  10. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0438
  11. Epoch 6/20
  12. 1875/1875 [==============================] - 8s 5ms/step - loss: 0.0360
  13. Epoch 7/20
  14. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0300
  15. Epoch 8/20
  16. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0237
  17. Epoch 9/20
  18. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0223
  19. Epoch 10/20
  20. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0201
  21. Epoch 11/20
  22. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0166
  23. Epoch 12/20
  24. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0172
  25. Epoch 13/20
  26. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0131
  27. Epoch 14/20
  28. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0124
  29. Epoch 15/20
  30. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0133
  31. Epoch 16/20
  32. 1875/1875 [==============================] - 10s 5ms/step - loss: 0.0108
  33. Epoch 17/20
  34. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0095
  35. Epoch 18/20
  36. 1875/1875 [==============================] - 10s 5ms/step - loss: 0.0116
  37. Epoch 19/20
  38. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0090
  39. Epoch 20/20
  40. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0084
复制代码
查看model1练习结果,由于模子直接输出Logits,必要通过softmax函数激活输出概率向量,然后通过最大概率索引得出模子识别的手写数字
  1. #查看训练结果
  2. z_train_hat=model1.predict(x_train_flat)
  3. #经过softmax激活后得到概率向量构成的矩阵
  4. p_train_hat=tf.nn.softmax(z_train_hat).numpy()
  5. #找出每个概率向量最大概率对应的索引,即识别的数字
  6. y_train_hat=np.argmax(p_train_hat,axis=1)
  7. print(y_train_hat)
复制代码
可以将上述代码编写为函数:
  1. #神经网络输出->最终识别结果
  2. def get_result(z):
  3.     p=tf.nn.softmax(z)
  4.     y=np.argmax(p,axis=1)
  5.     return y
复制代码
为了明白上面的输出处理过程,查看第一个样本的逻辑输出、概率向量和识别数字
  1. print(f'Logits:{z_train_hat[0]}')
  2. print(f'Probabilities:{p_train_hat[0]}')
  3. print(f'targe:{y_train_hat[0]}')
复制代码
  1. Logits:[-21.427883  -11.558845  -15.150495   15.6205845 -58.351833   29.704205
  2. -23.925339  -30.009314  -11.389831  -14.521982 ]
  3. Probabilities:[6.2175050e-23 1.2013921e-18 3.3101813e-20 7.6482343e-07 0.0000000e+00
  4. 9.9999928e-01 5.1166414e-24 1.1661356e-26 1.4226123e-18 6.2059749e-20]
  5. targe:5
复制代码
输出model1练习准确率,准确率到达99.8%
  1. print(f'model1训练集准确率:{accuracy_score(y_train,y_train_hat)}')
复制代码
  1. model1训练集准确率:0.998133
复制代码
测试model1,准确率到达97.9%,相当不戳
  1. z_test_hat=model1.predict(x_test_flat)
  2. y_test_hat=get_result(z_test_hat)
  3. print(f'model1测试集准确率:{accuracy_score(y_test,y_test_hat)}')
复制代码
  1. 313/313 [==============================] - 1s 3ms/step
  2. model1测试集准确率:0.9789
复制代码
为了方便后续神经网络模子的实验,编写run_model函数包罗练习、测试模子的整个过程,引入早停机制,即当10个epoch内练习损失没有改善,则克制练习
  1. early_stopping = EarlyStopping(
  2.     monitor='loss',
  3.     patience=10,  # 如果10个epoch内训练损失没有改善,则停止训练
  4.     restore_best_weights=True  # 恢复最佳权重
  5. )
  6. def run_model(model,epochs):
  7.     model.fit(x_train_flat,y_train,epochs=epochs,callbacks=[early_stopping])
  8.     z_train_hat=model.predict(x_train_flat)
  9.     y_train_hat=get_result(z_train_hat)
  10.     print(f'{model.name}训练准确率:{accuracy_score(y_train,y_train_hat)}')
  11.     z_test_hat=model.predict(x_test_flat)
  12.     y_test_hat=get_result(z_test_hat)
  13.     print(f'{model.name}测试准确率:{accuracy_score(y_test,y_test_hat)}')
复制代码
查看模子在哪些图片上栽了跟头:
  1. #显示n张错误识别图片的函数
  2. def show_error_pic(x, y, y_pred, n=64):
  3.     wrong_idx = (y != y_pred)
  4.    
  5.     # 获取错误识别的图片和标签
  6.     x_wrong = x[wrong_idx]
  7.     y_wrong = y[wrong_idx]
  8.     y_pred_wrong = y_pred[wrong_idx]
  9.    
  10.     # 选择前n张错误图片
  11.     n = min(n, len(x_wrong))
  12.     x_wrong = x_wrong[:n]
  13.     y_wrong = y_wrong[:n]
  14.     y_pred_wrong = y_pred_wrong[:n]
  15.    
  16.     # 设置图片网格
  17.     rows = int(np.ceil(n / 8))
  18.     fig, axes = plt.subplots(rows, 8, figsize=(20, 2.5*rows))
  19.     axes = axes.flatten()
  20.    
  21.     for i in range(n):
  22.         ax = axes[i]
  23.         ax.imshow(x_wrong[i].reshape(28, 28), cmap='gray')
  24.         ax.set_title(f'True: {y_wrong[i]}, Pred: {y_pred_wrong[i]}')
  25.         ax.axis('off')
  26.    
  27.     # 隐藏多余的子图
  28.     for i in range(n, len(axes)):
  29.         axes[i].axis('off')
  30.    
  31.     plt.tight_layout()
  32.     plt.show()
  33. show_error_pic(x_test,y_test,y_test_hat)
复制代码
(出于空间限制,只展示部分图片)

模子优化

目前来看我们第一个较简单的神经网络表现得非常不错,练习准确率到达99.8%,测试准确率到达97.9%,而人类的平均准确率约为97.5%到98.5%,因此我们诊断模子存在肯定高方差的问题,可以思量引入正则化技术或增长数据量来优化模子,或者从另一方面,思量采用更加大型的神经网络看看可否到达更优的准确率。
model2:model1基础上,增长迭代次数至40次
  1. #创建神经网络
  2. model2=Sequential(
  3.     [
  4.         Input(shape=(784,)),
  5.         Dense(128,activation='relu',name='L1'),
  6.         Dense(32,activation='relu',name='L2'),
  7.         Dense(10,activation='linear',name='L3'),
  8.     ],name='model2',
  9. )
  10. #编译模型
  11. model2.compile(loss=SparseCategoricalCrossentropy(from_logits=True),optimizer=Adam(learning_rate=0.001))
  12. #查看模型总结
  13. model2.summary()
  14. run_model(model2,40)
复制代码
  1. Model: "model2"
  2. _________________________________________________________________
  3. Layer (type)                Output Shape              Param #   
  4. =================================================================
  5. L1 (Dense)                  (None, 128)               100480   
  6.                                                                  
  7. L2 (Dense)                  (None, 32)                4128      
  8.                                                                  
  9. L3 (Dense)                  (None, 10)                330      
  10.                                                                  
  11. =================================================================
  12. Total params: 104,938
  13. Trainable params: 104,938
  14. Non-trainable params: 0
  15. _________________________________________________________________
  16. Epoch 1/40
  17. 1875/1875 [==============================] - 10s 5ms/step - loss: 0.2670
  18. Epoch 2/40
  19. 1875/1875 [==============================] - 10s 5ms/step - loss: 0.1124
  20. Epoch 3/40
  21. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0786
  22. Epoch 4/40
  23. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0593
  24. Epoch 5/40
  25. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0468
  26. Epoch 6/40
  27. 1875/1875 [==============================] - 8s 5ms/step - loss: 0.0377
  28. Epoch 7/40
  29. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0310
  30. Epoch 8/40
  31. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0266
  32. Epoch 9/40
  33. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0246
  34. Epoch 10/40
  35. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0183
  36. Epoch 11/40
  37. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0180
  38. Epoch 12/40
  39. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0160
  40. Epoch 13/40
  41. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0170
  42. Epoch 14/40
  43. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0133
  44. Epoch 15/40
  45. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0135
  46. Epoch 16/40
  47. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0117
  48. Epoch 17/40
  49. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0108
  50. Epoch 18/40
  51. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0110
  52. Epoch 19/40
  53. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0107
  54. Epoch 20/40
  55. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0086
  56. Epoch 21/40
  57. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0096
  58. Epoch 22/40
  59. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0101
  60. Epoch 23/40
  61. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0083
  62. Epoch 24/40
  63. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0079
  64. Epoch 25/40
  65. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0095
  66. Epoch 26/40
  67. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0087
  68. Epoch 27/40
  69. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0063
  70. Epoch 28/40
  71. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0087
  72. Epoch 29/40
  73. 1875/1875 [==============================] - 8s 4ms/step - loss: 0.0080
  74. Epoch 30/40
  75. 1875/1875 [==============================] - 7s 4ms/step - loss: 0.0069
  76. Epoch 31/40
  77. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0053
  78. Epoch 32/40
  79. 1875/1875 [==============================] - 8s 4ms/step - loss: 0.0071
  80. Epoch 33/40
  81. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0056
  82. Epoch 34/40
  83. 1875/1875 [==============================] - 8s 4ms/step - loss: 0.0089
  84. Epoch 35/40
  85. 1875/1875 [==============================] - 8s 4ms/step - loss: 0.0062
  86. Epoch 36/40
  87. 1875/1875 [==============================] - 8s 4ms/step - loss: 0.0084
  88. Epoch 37/40
  89. 1875/1875 [==============================] - 8s 4ms/step - loss: 0.0051
  90. Epoch 38/40
  91. 1875/1875 [==============================] - 8s 4ms/step - loss: 0.0063
  92. Epoch 39/40
  93. 1875/1875 [==============================] - 8s 4ms/step - loss: 0.0074
  94. Epoch 40/40
  95. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0063
  96. 1875/1875 [==============================] - 5s 3ms/step
  97. model2训练准确率:0.9984166666666666
  98. 313/313 [==============================] - 1s 3ms/step
  99. model2测试准确率:0.98
复制代码
  可以看到测试准确率到达98%,略有提拔,但思量到运行时间翻倍,收益并不明显
  model3:采用宽度和厚度更大的神经网络,迭代次数20
  1. #增加模型宽度和厚度
  2. model3 = Sequential([
  3.     Input(shape=(784,)),
  4.     Dense(256, activation='relu', name='L1'),
  5.     Dense(128, activation='relu', name='L2'),
  6.     Dense(64, activation='relu', name='L3'),
  7.     Dense(10, activation='linear', name='L4'),
  8. ], name='model3')
  9. #编译模型
  10. model3.compile(loss=SparseCategoricalCrossentropy(from_logits=True),optimizer=Adam(learning_rate=0.001))
  11. #查看模型总结
  12. model3.summary()
  13. run_model(model3,20)
复制代码
  1. Model: "model3"
  2. _________________________________________________________________
  3. Layer (type)                Output Shape              Param #   
  4. =================================================================
  5. L1 (Dense)                  (None, 256)               200960   
  6.                                                                  
  7. L2 (Dense)                  (None, 128)               32896     
  8.                                                                  
  9. L3 (Dense)                  (None, 64)                8256      
  10.                                                                  
  11. L4 (Dense)                  (None, 10)                650      
  12.                                                                  
  13. =================================================================
  14. Total params: 242,762
  15. Trainable params: 242,762
  16. Non-trainable params: 0
  17. _________________________________________________________________
  18. Epoch 1/20
  19. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.2152
  20. Epoch 2/20
  21. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.0908
  22. Epoch 3/20
  23. 1875/1875 [==============================] - 12s 7ms/step - loss: 0.0623
  24. Epoch 4/20
  25. 1875/1875 [==============================] - 12s 7ms/step - loss: 0.0496
  26. Epoch 5/20
  27. 1875/1875 [==============================] - 12s 7ms/step - loss: 0.0390
  28. Epoch 6/20
  29. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.0341
  30. Epoch 7/20
  31. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.0291
  32. Epoch 8/20
  33. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.0244
  34. Epoch 9/20
  35. 1875/1875 [==============================] - 12s 7ms/step - loss: 0.0223
  36. Epoch 10/20
  37. 1875/1875 [==============================] - 12s 7ms/step - loss: 0.0187
  38. Epoch 11/20
  39. 1875/1875 [==============================] - 12s 7ms/step - loss: 0.0206
  40. Epoch 12/20
  41. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.0145
  42. Epoch 13/20
  43. 1875/1875 [==============================] - 12s 7ms/step - loss: 0.0176
  44. Epoch 14/20
  45. 1875/1875 [==============================] - 12s 7ms/step - loss: 0.0153
  46. Epoch 15/20
  47. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.0120
  48. Epoch 16/20
  49. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.0148
  50. Epoch 17/20
  51. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.0125
  52. Epoch 18/20
  53. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.0123
  54. Epoch 19/20
  55. 1875/1875 [==============================] - 13s 7ms/step - loss: 0.0120
  56. Epoch 20/20
  57. 1875/1875 [==============================] - 13s 7ms/step - loss: 0.0094
  58. 1875/1875 [==============================] - 6s 3ms/step
  59. model3训练准确率:0.9989333333333333
  60. 313/313 [==============================] - 1s 4ms/step
  61. model3测试准确率:0.9816
复制代码
  model3练习准确率到达99.9%,测试准确率也取得了目前为止的新高98.2%
  model4:model1基础上,加入Dropout层引入正则化
  1. #Dropout正则化
  2. model4 = Sequential([
  3.     Input(shape=(784,)),
  4.     Dense(128, activation='relu', name='L1'),
  5.     Dropout(0.3),
  6.     Dense(64, activation='relu', name='L2'),
  7.     Dropout(0.2),
  8.     Dense(10, activation='linear', name='L3'),
  9. ], name='model4')
  10. #编译模型
  11. model4.compile(loss=SparseCategoricalCrossentropy(from_logits=True),optimizer=Adam(learning_rate=0.001))
  12. #查看模型总结
  13. model4.summary()
  14. run_model(model4,20)
复制代码
  1. Model: "model5"
  2. _________________________________________________________________
  3. Layer (type)                Output Shape              Param #   
  4. =================================================================
  5. L1 (Dense)                  (None, 128)               100480   
  6.                                                                  
  7. dropout_2 (Dropout)         (None, 128)               0         
  8.                                                                  
  9. L2 (Dense)                  (None, 64)                8256      
  10.                                                                  
  11. dropout_3 (Dropout)         (None, 64)                0         
  12.                                                                  
  13. L3 (Dense)                  (None, 10)                650      
  14.                                                                  
  15. =================================================================
  16. Total params: 109,386
  17. Trainable params: 109,386
  18. Non-trainable params: 0
  19. _________________________________________________________________
  20. Epoch 1/20
  21. 1875/1875 [==============================] - 15s 7ms/step - loss: 0.3686
  22. Epoch 2/20
  23. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.1855
  24. Epoch 3/20
  25. 1875/1875 [==============================] - 17s 9ms/step - loss: 0.1475
  26. Epoch 4/20
  27. 1875/1875 [==============================] - 17s 9ms/step - loss: 0.1289
  28. Epoch 5/20
  29. 1875/1875 [==============================] - 20s 11ms/step - loss: 0.1124
  30. Epoch 6/20
  31. 1875/1875 [==============================] - 19s 10ms/step - loss: 0.1053
  32. Epoch 7/20
  33. 1875/1875 [==============================] - 22s 12ms/step - loss: 0.0976
  34. Epoch 8/20
  35. 1875/1875 [==============================] - 15s 8ms/step - loss: 0.0907
  36. Epoch 9/20
  37. 1875/1875 [==============================] - 12s 6ms/step - loss: 0.0861
  38. Epoch 10/20
  39. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0807
  40. Epoch 11/20
  41. 1875/1875 [==============================] - 10s 5ms/step - loss: 0.0794
  42. Epoch 12/20
  43. 1875/1875 [==============================] - 11s 6ms/step - loss: 0.0744
  44. Epoch 13/20
  45. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0733
  46. Epoch 14/20
  47. 1875/1875 [==============================] - 8s 4ms/step - loss: 0.0734
  48. Epoch 15/20
  49. 1875/1875 [==============================] - 8s 4ms/step - loss: 0.0691
  50. Epoch 16/20
  51. 1875/1875 [==============================] - 10s 5ms/step - loss: 0.0656
  52. Epoch 17/20
  53. 1875/1875 [==============================] - 11s 6ms/step - loss: 0.0674
  54. Epoch 18/20
  55. 1875/1875 [==============================] - 12s 7ms/step - loss: 0.0614
  56. Epoch 19/20
  57. 1875/1875 [==============================] - 11s 6ms/step - loss: 0.0601
  58. Epoch 20/20
  59. 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0614
  60. 1875/1875 [==============================] - 5s 3ms/step
  61. model5训练准确率:0.9951833333333333
  62. 313/313 [==============================] - 1s 2ms/step
  63. model5测试准确率:0.98
复制代码
  model5练习准确率下降到了99.5%,但是相比model1测试准确率98%略有提拔,Dropout正则化简直有用低落了模子方差,增强了模子的泛化本领
  综上思量,使用model3的框架同时引入Dropout正则化,迭代练习40次,构建model7
  1. #最终全连接神经网络
  2. model7 = Sequential([
  3.     Input(shape=(784,)),
  4.     Dense(256, activation='relu', name='L1'),
  5.     Dropout(0.3),
  6.     Dense(128, activation='relu', name='L2'),
  7.     Dropout(0.2),
  8.     Dense(64, activation='relu', name='L3'),
  9.     Dropout(0.1),
  10.     Dense(10, activation='linear', name='L4'),
  11. ], name='model7')
  12. #编译模型
  13. model7.compile(loss=SparseCategoricalCrossentropy(from_logits=True),optimizer=Adam(learning_rate=0.001))
  14. #查看模型总结
  15. model7.summary()
  16. run_model(model7,40)
复制代码
  1. Model: "model7"
  2. _________________________________________________________________
  3. Layer (type)                Output Shape              Param #   
  4. =================================================================
  5. L1 (Dense)                  (None, 256)               200960   
  6.                                                                  
  7. dropout_4 (Dropout)         (None, 256)               0         
  8.                                                                  
  9. L2 (Dense)                  (None, 128)               32896     
  10.                                                                  
  11. dropout_5 (Dropout)         (None, 128)               0         
  12.                                                                  
  13. L3 (Dense)                  (None, 64)                8256      
  14.                                                                  
  15. dropout_6 (Dropout)         (None, 64)                0         
  16.                                                                  
  17. L4 (Dense)                  (None, 10)                650      
  18.                                                                  
  19. =================================================================
  20. Total params: 242,762
  21. Trainable params: 242,762
  22. Non-trainable params: 0
  23. _________________________________________________________________
  24. Epoch 1/40
  25. 1875/1875 [==============================] - 16s 8ms/step - loss: 0.3174
  26. Epoch 2/40
  27. 1875/1875 [==============================] - 14s 7ms/step - loss: 0.1572
  28. Epoch 3/40
  29. 1875/1875 [==============================] - 16s 9ms/step - loss: 0.1255
  30. Epoch 4/40
  31. 1875/1875 [==============================] - 23s 12ms/step - loss: 0.1047
  32. Epoch 5/40
  33. 1875/1875 [==============================] - 19s 10ms/step - loss: 0.0935
  34. Epoch 6/40
  35. 1875/1875 [==============================] - 30s 16ms/step - loss: 0.0839
  36. Epoch 7/40
  37. 1875/1875 [==============================] - 20s 11ms/step - loss: 0.0776
  38. Epoch 8/40
  39. 1875/1875 [==============================] - 21s 11ms/step - loss: 0.0728
  40. Epoch 9/40
  41. 1875/1875 [==============================] - 17s 9ms/step - loss: 0.0661
  42. Epoch 10/40
  43. 1875/1875 [==============================] - 14s 8ms/step - loss: 0.0629
  44. Epoch 11/40
  45. 1875/1875 [==============================] - 16s 8ms/step - loss: 0.0596
  46. Epoch 12/40
  47. 1875/1875 [==============================] - 26s 14ms/step - loss: 0.0566
  48. Epoch 13/40
  49. 1875/1875 [==============================] - 22s 12ms/step - loss: 0.0533
  50. Epoch 14/40
  51. 1875/1875 [==============================] - 16s 8ms/step - loss: 0.0520
  52. Epoch 15/40
  53. 1875/1875 [==============================] - 14s 7ms/step - loss: 0.0467
  54. Epoch 16/40
  55. 1875/1875 [==============================] - 15s 8ms/step - loss: 0.0458
  56. Epoch 17/40
  57. 1875/1875 [==============================] - 15s 8ms/step - loss: 0.0451
  58. Epoch 18/40
  59. 1875/1875 [==============================] - 19s 10ms/step - loss: 0.0443
  60. Epoch 19/40
  61. 1875/1875 [==============================] - 43s 23ms/step - loss: 0.0417
  62. Epoch 20/40
  63. 1875/1875 [==============================] - 38s 20ms/step - loss: 0.0409
  64. Epoch 21/40
  65. 1875/1875 [==============================] - 21s 11ms/step - loss: 0.0392
  66. Epoch 22/40
  67. 1875/1875 [==============================] - 16s 9ms/step - loss: 0.0396
  68. Epoch 23/40
  69. 1875/1875 [==============================] - 20s 11ms/step - loss: 0.0355
  70. Epoch 24/40
  71. 1875/1875 [==============================] - 17s 9ms/step - loss: 0.0368
  72. Epoch 25/40
  73. 1875/1875 [==============================] - 18s 10ms/step - loss: 0.0359
  74. Epoch 26/40
  75. 1875/1875 [==============================] - 18s 10ms/step - loss: 0.0356
  76. Epoch 27/40
  77. 1875/1875 [==============================] - 16s 8ms/step - loss: 0.0360
  78. Epoch 28/40
  79. 1875/1875 [==============================] - 17s 9ms/step - loss: 0.0326
  80. Epoch 29/40
  81. 1875/1875 [==============================] - 19s 10ms/step - loss: 0.0335
  82. Epoch 30/40
  83. 1875/1875 [==============================] - 19s 10ms/step - loss: 0.0310
  84. Epoch 31/40
  85. 1875/1875 [==============================] - 21s 11ms/step - loss: 0.0324
  86. Epoch 32/40
  87. 1875/1875 [==============================] - 16s 9ms/step - loss: 0.0301
  88. Epoch 33/40
  89. 1875/1875 [==============================] - 17s 9ms/step - loss: 0.0303
  90. Epoch 34/40
  91. 1875/1875 [==============================] - 15s 8ms/step - loss: 0.0319
  92. Epoch 35/40
  93. 1875/1875 [==============================] - 17s 9ms/step - loss: 0.0300
  94. Epoch 36/40
  95. 1875/1875 [==============================] - 17s 9ms/step - loss: 0.0305
  96. Epoch 37/40
  97. 1875/1875 [==============================] - 14s 7ms/step - loss: 0.0290
  98. Epoch 38/40
  99. 1875/1875 [==============================] - 19s 10ms/step - loss: 0.0288
  100. Epoch 39/40
  101. 1875/1875 [==============================] - 20s 11ms/step - loss: 0.0272
  102. Epoch 40/40
  103. 1875/1875 [==============================] - 38s 20ms/step - loss: 0.0264
  104. 1875/1875 [==============================] - 18s 9ms/step
  105. model7训练准确率:0.9984333333333333
  106. 313/313 [==============================] - 2s 5ms/step
  107. model7测试准确率:0.9831
复制代码
  model7练习准确率99.8%,测试准确率到达了98.3%,相比model1的97.9%,取得了接近0.4%的提拔。
  本实验是学习了神经网络基础后的一个实验练习,因此只采用全毗连神经网络模子。我们知道CNN模子在图像识别上本领更强,因此在实验最后创建一个CNN网络举行测试(gpt生成网络框架)。
  1. from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten
  2. model8 = Sequential([
  3.     Input(shape=(28, 28, 1)),
  4.     Conv2D(32, kernel_size=(3, 3), activation='relu'),
  5.     MaxPooling2D(pool_size=(2, 2)),
  6.     Conv2D(64, kernel_size=(3, 3), activation='relu'),
  7.     MaxPooling2D(pool_size=(2, 2)),
  8.     Flatten(),
  9.     Dense(128, activation='relu'),
  10.     Dense(10, activation='linear')
  11. ], name='cnn_model')
  12. #编译模型
  13. model8.compile(loss=SparseCategoricalCrossentropy(from_logits=True),optimizer=Adam(learning_rate=0.001))
  14. #查看模型总结
  15. model8.summary()
  16. model8.fit(x_train,y_train,epochs=20,callbacks=[early_stopping])
  17. z_train_hat=model8.predict(x_train)
  18. y_train_hat=get_result(z_train_hat)
  19. print(f'{model8.name}训练准确率:{accuracy_score(y_train,y_train_hat)}')
  20. z_test_hat=model8.predict(x_test)
  21. y_test_hat=get_result(z_test_hat)
  22. print(f'{model8.name}测试准确率:{accuracy_score(y_test,y_test_hat)}')
复制代码
  cnn网络:
cnn_model练习准确率:0.9982333333333333
cnn_model测试准确率:0.9878
可以看到测试准确率到达了98.8%,比我们上面的全毗连神经网络要优异。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表