当前位置:   article > 正文

Tensorflow2.x框架-MNIST数据集_头歌:本关任务:读取tensorflow2.x内置的mnist服饰数据集(注:如网速太慢,可用以下

头歌:本关任务:读取tensorflow2.x内置的mnist服饰数据集(注:如网速太慢,可用以下

MNIST数据集

博主微信公众号(左)、Python+智能大数据+AI学习交流群(右):欢迎关注和加群,大家一起学习交流,共同进步!

目录

摘要

一、导入模块

二、导入 MNIST 数据集

三、作为输入特征,输入神经网络时,将数据拉伸为一维数组

四、可视化训练集输入特征的第一个元素

五、打印出训练集输入特征的第一个元素

六、打印出训练集标签的第一个元素

七、打印出训练集(输入特征、标签)、测试集(输入特征、标签)的形状

八、完整代码

九、Sequential() 实现手写数字识别

十、Class() 实现手写数字识别


摘要

MNIST 数据集:

    提供 6w 张 28*28 像素点的 0~9 手写数字图片和标签,用于训练。

    提供 1w 张 28*28 像素点的 0~9 手写数字图片个标签,用于测试。

一、导入模块

  1. # 模块导入
  2. import tensorflow as tf
  3. from matplotlib import pyplot as plt

二、导入 MNIST 数据集

  1. # 导入数据集,分别为输入特征和标签
  2. mnist = tf.keras.datasets.mnist
  3. # (x_train, y_train):(训练集输入特征,训练集标签)
  4. # (x_test, y_test):(测试集输入特征,测试集标签)
  5. (x_train, y_train), (x_test, y_test) = mnist.load_data()

三、作为输入特征,输入神经网络时,将数据拉伸为一维数组

tf.keras.layers.Flatten()    # 将输入特征拉直为一维数组,也就是拉直为28*28=784个数值

把28*28=784个像素点的灰度值作为输入特征送入神经网络。

四、可视化训练集输入特征的第一个元素

  1. # 可视化训练集输入特征的第一个元素
  2. plt.imshow(x_train[0], cmap="gray") # 绘制灰度图
  3. plt.show()

可视化后的图片:一张黑底白字的手写数字图片5。

五、打印出训练集输入特征的第一个元素

  1. # 打印出训练集输入特征的第一个元素
  2. print(f"x_train[0]: \n {x_train[0]}")

输出结果:手写数字5的28行28列个像素值。0表示纯黑色,255表示纯白色。

  1. x_train[0]:
  2. [[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  3. 0 0 0 0 0 0 0 0 0 0]
  4. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  5. 0 0 0 0 0 0 0 0 0 0]
  6. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  7. 0 0 0 0 0 0 0 0 0 0]
  8. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  9. 0 0 0 0 0 0 0 0 0 0]
  10. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  11. 0 0 0 0 0 0 0 0 0 0]
  12. [ 0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136
  13. 175 26 166 255 247 127 0 0 0 0]
  14. [ 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253
  15. 225 172 253 242 195 64 0 0 0 0]
  16. [ 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251
  17. 93 82 82 56 39 0 0 0 0 0]
  18. [ 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241
  19. 0 0 0 0 0 0 0 0 0 0]
  20. [ 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154
  21. 0 0 0 0 0 0 0 0 0 0]
  22. [ 0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0
  23. 0 0 0 0 0 0 0 0 0 0]
  24. [ 0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0
  25. 0 0 0 0 0 0 0 0 0 0]
  26. [ 0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 0 0 0
  27. 0 0 0 0 0 0 0 0 0 0]
  28. [ 0 0 0 0 0 0 0 0 0 0 0 0 35 241 225 160 108 1
  29. 0 0 0 0 0 0 0 0 0 0]
  30. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119
  31. 25 0 0 0 0 0 0 0 0 0]
  32. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253
  33. 150 27 0 0 0 0 0 0 0 0]
  34. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252
  35. 253 187 0 0 0 0 0 0 0 0]
  36. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249
  37. 253 249 64 0 0 0 0 0 0 0]
  38. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253
  39. 253 207 2 0 0 0 0 0 0 0]
  40. [ 0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253
  41. 250 182 0 0 0 0 0 0 0 0]
  42. [ 0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201
  43. 78 0 0 0 0 0 0 0 0 0]
  44. [ 0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2
  45. 0 0 0 0 0 0 0 0 0 0]
  46. [ 0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0
  47. 0 0 0 0 0 0 0 0 0 0]
  48. [ 0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0
  49. 0 0 0 0 0 0 0 0 0 0]
  50. [ 0 0 0 0 136 253 253 253 212 135 132 16 0 0 0 0 0 0
  51. 0 0 0 0 0 0 0 0 0 0]
  52. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  53. 0 0 0 0 0 0 0 0 0 0]
  54. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  55. 0 0 0 0 0 0 0 0 0 0]
  56. [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  57. 0 0 0 0 0 0 0 0 0 0]]

六、打印出训练集标签的第一个元素

  1. # 打印出训练集标签的第一个元素
  2. print(f"y_train[0]: \n {y_train[0]}")

输出结果:

  1. y_train[0]:
  2. 5

七、打印出训练集(输入特征、标签)、测试集(输入特征、标签)的形状

  1. # 打印出整个训练集输入特征的形状
  2. print(f"x_train.shape: \n {x_train.shape}")
  3. # 打印出整个训练集标签的形状
  4. print(f"y_train.shape: \n {y_train.shape}")
  5. # 打印出整个测试集输入特征的形状
  6. print(f"x_test.shape: \n {x_test.shape}")
  7. # 打印出整个测试集标签的形状
  8. print(f"y_test.shape: \n {y_test.shape}")

输出结果:

    x_train —— 60000 个 28 行 28 列的数据

    y_train —— 60000 个标签

    x_test —— 10000 个 28 行 28 列的数据

    y_test —— 10000 个标签

  1. x_train.shape:
  2. (60000, 28, 28)
  3. y_train.shape:
  4. (60000,)
  5. x_test.shape:
  6. (10000, 28, 28)
  7. y_test.shape:
  8. (10000,)

八、完整代码

  1. # 模块导入
  2. import tensorflow as tf
  3. from matplotlib import pyplot as plt
  4. # 导入数据集,分别为输入特征和标签
  5. mnist = tf.keras.datasets.mnist
  6. # (x_train, y_train):(训练集输入特征,训练集标签)
  7. # (x_test, y_test):(测试集输入特征,测试集标签)
  8. (x_train, y_train), (x_test, y_test) = mnist.load_data()
  9. # 可视化训练集输入特征的第一个元素
  10. plt.imshow(x_train[0], cmap="gray") # 绘制灰度图
  11. plt.show()
  12. # 打印出训练集输入特征的第一个元素
  13. print(f"x_train[0]: \n{x_train[0]}")
  14. # 打印出训练集标签的第一个元素
  15. print(f"y_train[0]: \n {y_train[0]}")
  16. # 打印出整个训练集输入特征的形状
  17. print(f"x_train.shape: \n {x_train.shape}")
  18. # 打印出整个训练集标签的形状
  19. print(f"y_train.shape: \n {y_train.shape}")
  20. # 打印出整个测试集输入特征的形状
  21. print(f"x_test.shape: \n {x_test.shape}")
  22. # 打印出整个测试集标签的形状
  23. print(f"y_test.shape: \n {y_test.shape}")

九、Sequential() 实现手写数字识别

  1. # 模块导入
  2. import tensorflow as tf
  3. # 导入数据集,分别为输入特征和标签
  4. mnist = tf.keras.datasets.mnist
  5. # (x_train, y_train):(训练集输入特征,训练集标签)
  6. # (x_test, y_test):(测试集输入特征,测试集标签)
  7. (x_train, y_train), (x_test, y_test) = mnist.load_data()
  8. # 对输入网络的输入特征进行归一化,使原本0到255之间的灰度值,变为0到1之间的数值
  9. # (把输入特征的数值变小更适合神经网络吸收)
  10. x_train, x_test = x_train / 255.0, x_test / 255.0
  11. # 搭建网络结构
  12. model = tf.keras.models.Sequential([
  13. tf.keras.layers.Flatten(), # 将输入特征拉直为一维数组,也就是拉直为28*28=784个数值
  14. tf.keras.layers.Dense(128, activation="relu"), # 第一层网络128个神经元,使用relu激活函数
  15. tf.keras.layers.Dense(10, activation="softmax") # 第二层网络10个神经元,使用softmax激活函数,使输出符合概率分布
  16. ])
  17. # 配置训练方法
  18. model.compile(optimizer="adam", # 优化器
  19. loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), # 损失函数,输出是概率分布,from_logits=False
  20. metrics=["sparse_categorical_accuracy"]) # 数据集中的标签是数值,神经网络输出y是概率分布
  21. # 执行训练过程
  22. model.fit(x_train, # 训练集输入特征
  23. y_train, # 训练集标签
  24. batch_size=32, # 每次喂入网络32组数据
  25. epochs=5, # 数据集迭代5次
  26. validation_data=(x_test, y_test), # 测试集输入特征,测试集标签
  27. validation_freq=1) # 每迭代1次训练集执行一次测试集的评测
  28. # 打印出网络结构和参数统计
  29. model.summary()

十、Class() 实现手写数字识别

  1. # 模块导入
  2. import tensorflow as tf
  3. from tensorflow.keras import Model
  4. from tensorflow.keras.layers import Dense, Flatten
  5. # 导入数据集,分别为输入特征和标签
  6. mnist = tf.keras.datasets.mnist
  7. # (x_train, y_train):(训练集输入特征,训练集标签)
  8. # (x_test, y_test):(测试集输入特征,测试集标签)
  9. (x_train, y_train), (x_test, y_test) = mnist.load_data()
  10. # 对输入网络的输入特征进行归一化,使原本0到255之间的灰度值,变为0到1之间的数值
  11. # (把输入特征的数值变小更适合神经网络吸收)
  12. x_train, x_test = x_train / 255.0, x_test / 255.0
  13. # 搭建网络结构
  14. class MnistModel(Model):
  15. def __init__(self):
  16. super(MnistModel, self).__init__()
  17. self.flatten = Flatten() # 将输入特征拉直为一维数组,也就是拉直为28*28=784个数值
  18. self.d1 = Dense(128, activation="relu") # 第一层网络128个神经元,使用relu激活函数
  19. self.d2 = Dense(10, activation="softmax") # 第二层网络10个神经元,使用softmax激活函数,使输出符合概率分布
  20. def call(self, x):
  21. x = self.flatten(x)
  22. x = self.d1(x)
  23. y = self.d2(x)
  24. return y
  25. model = MnistModel()
  26. # 配置训练方法
  27. model.compile(optimizer="adam", # 优化器
  28. loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), # 损失函数,输出是概率分布,from_logits=False
  29. metrics=["sparse_categorical_accuracy"]) # 数据集中的标签是数值,神经网络输出y是概率分布
  30. # 执行训练过程
  31. model.fit(x_train, # 训练集输入特征
  32. y_train, # 训练集标签
  33. batch_size=32, # 每次喂入网络32组数据
  34. epochs=5, # 数据集迭代5次
  35. validation_data=(x_test, y_test), # 测试集输入特征,测试集标签
  36. validation_freq=1) # 每迭代1次训练集执行一次测试集的评测
  37. # 打印出网络结构和参数统计
  38. model.summary()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/350229
推荐阅读
相关标签
  

闽ICP备14008679号