经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » 人工智能基础 » 查看文章
基于tensorflow2.0 使用tf.keras实现Fashion MNIST
来源:cnblogs  作者:no_name01  时间:2019/4/3 16:08:20  对本文有异议

本次使用的是2.0测试版,正式版估计会很快就上线了 tf2好像更新了蛮多东西 虽然教程不多 还是找了个试试 的确简单不少,但是还是比较喜欢现在这种写法

老样子先导入库

  1. import tensorflow as tf
  2. import tensorflow_datasets as tfds
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import math
  6. import tqdm
  7. import tqdm.auto
  8. tqdm.tqdm = tqdm.auto.tqdm
  9. print(tf.__version__)
  10. #导入库

我的版本是2.0.0-dev20190402

现在正在使用google的colab 训练,因为我本地tensorflow2.0死活装不上一直报错了 折腾了一天放弃了 何况google还有免费gpu和tpu能用 速度也不会太慢

导入了库然后接着导入数据集

  1. dataset,metadata = tfds.load('fashion_mnist',as_supervised=True,with_info=True)
  2. train_dataset,test_dataset = dataset['train'],dataset['test']
  3. #导入数据集

创建个标签 方便以后看

  1. class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
  2. 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
  3. #映射标签

查看训练样本个数个测试样本个数 

  1. num_train_examples = metadata.splits['train'].num_examples
  2. num_test_examples = metadata.splits['test'].num_examples
  3. print("训练样本个数: {}".format(num_train_examples))
  4. print("测试样本个数:{}".format(num_test_examples))

训练样本个数: 60000 测试样本个数:10000

接下来标准化样本 直接/255

  1. def normalize(images,labels): #定义标准化函数
  2. images = tf.cast(images,tf.float32)
  3. images /= 255
  4. return images,labels
  5. train_dataset = train_dataset.map(normalize)#标准化
  6. test_dataset = test_dataset.map(normalize) #标准化

图像数据中每个像素的值是范围内的整数[0,255],为了使模型正常工作,需要将这些值标准化为范围[0,1]

显示样本

  1. #显示前25幅图像。训练集并在每个图像下面显示类名
  2. plt.figure(figsize=(10,10))
  3. i = 0
  4. for (image, label) in test_dataset.take(25):
  5. image = image.numpy().reshape((28,28))
  6. plt.subplot(5,5,i+1)
  7. plt.xticks([])
  8. plt.yticks([])
  9. plt.grid(False)
  10. plt.imshow(image, cmap=plt.cm.binary)
  11. plt.xlabel(class_names[label])
  12. i += 1
  13. plt.show()

建立模型

  1. #建立模型
  2. model = tf.keras.Sequential([
  3. tf.keras.layers.Flatten(input_shape=(28,28,1)), #输入层
  4. tf.keras.layers.Dense(256,activation=tf.nn.relu),#隐藏层1
  5. tf.keras.layers.Dense(128,activation=tf.nn.relu),#隐藏层2
  6. tf.keras.layers.Dense(10,activation=tf.nn.softmax)#输出层
  7. ])

一个四层模型这就建立好了。。。。。 一个输入层两个隐藏层一个输出层

  •  输入 tf.keras.layers.Flatten-这一层将图像从2d-数组转换为28。×28个像素,一个784像素的一维数组(28*28)。将这一层想象为将图像中的逐行像素拆开,并将它们排列起来。该层没有需要学习的参数,因为它只是重新格式化数据。

  • “隐藏” tf.keras.layers.Dense-由128个神经元组成的密集连接层。每个神经元(或节点)从前一层的所有784个节点获取输入,根据训练过程中将学习到的隐藏参数对输入进行加权,并将单个值输出到下一层。

  •  输出量 tf.keras.layers.Dense-A 10节点Softmax层,每个节点表示一组服装。与前一层一样,每个节点从其前面层的128个节点获取输入。每个节点根据学习到的参数对输入进行加权,然后在此范围内输出一个值。[0, 1],表示图像属于该类的概率。所有10个节点值之和为1。

接下来定义优化器和损失函数

  1. #定义优化器和损失函数
  2. model.compile(optimizer='adam',
  3. loss='sparse_categorical_crossentropy',
  4. metrics=['accuracy'])

然后再设置一下训练轮次和样本

  1. BATCH_SIZE = 32
  2. train_dataset = train_dataset.repeat().shuffle(num_train_examples).batch(BATCH_SIZE)
  3. test_dataset = test_dataset.batch(BATCH_SIZE)

训练样本开冲!

  1. #训练模型
  2. model.fit(train_dataset, epochs=5, steps_per_epoch=math.ceil(num_train_examples/BATCH_SIZE))

然后放上结果

  1. Epoch 1/5
  2. 1875/1875 [==============================] - 52s 28ms/step - loss: 0.8060 - accuracy: 0.7083
  3. Epoch 2/5
  4. 1875/1875 [==============================] - 35s 18ms/step - loss: 0.5326 - accuracy: 0.8074
  5. Epoch 3/5
  6. 1875/1875 [==============================] - 33s 18ms/step - loss: 0.4673 - accuracy: 0.8315
  7. Epoch 4/5
  8. 1875/1875 [==============================] - 34s 18ms/step - loss: 0.4341 - accuracy: 0.8439
  9. Epoch 5/5
  10. 1875/1875 [==============================] - 34s 18ms/step - loss: 0.4145 - accuracy: 0.8507
  11. <tensorflow.python.keras.callbacks.History at 0x7f8b2bdfca90>

0.85的准确率 还行吧 google的GPU还是蛮快的吧

最后看一下模型在测试集上面的表现如何

  1. test_loss, test_accuracy = model.evaluate(test_dataset, steps=math.ceil(num_test_examples/32))
  2. print('Accuracy on test dataset:', test_accuracy)
  1. 313/313 [==============================] - 6s 18ms/step - loss: 0.4331 - accuracy: 0.8435
  2. Accuracy on test dataset: 0.8435

还行吧 相差无几,后面还有一些跟之前差不多的用模型预测和显示结果图片就不放上来了 放在下面的完整代码

下一张尝试一下使用CNN卷积神经网络,反正使用tf.keras建立起来也是蛮简单的

最后放上代码

  1. import tensorflow as tf
  2. import tensorflow_datasets as tfds
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import math
  6. import tqdm
  7. import tqdm.auto
  8. tqdm.tqdm = tqdm.auto.tqdm
  9. print(tf.__version__)
  10. #导入库
  11. dataset,metadata = tfds.load('fashion_mnist',as_supervised=True,with_info=True)
  12. train_dataset,test_dataset = dataset['train'],dataset['test']
  13. #导入数据集
  14. class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
  15. 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
  16. #映射标签
  17. num_train_examples = metadata.splits['train'].num_examples
  18. num_test_examples = metadata.splits['test'].num_examples
  19. print("训练样本个数: {}".format(num_train_examples))
  20. print("测试样本个数:{}".format(num_test_examples))
  21. def normalize(images,labels): #定义标准化函数
  22. images = tf.cast(images,tf.float32)
  23. images /= 255
  24. return images,labels
  25. train_dataset = train_dataset.map(normalize)#标准化
  26. test_dataset = test_dataset.map(normalize) #标准化
  27.  
  28. #绘制一个图像
  29. for image, label in test_dataset.take(1):
  30. break
  31. image = image.numpy().reshape((28,28))
  32. plt.figure()
  33. plt.imshow(image, cmap=plt.cm.binary)
  34. plt.colorbar()
  35. plt.grid(False)
  36. plt.show()
  37. #显示前25幅图像。训练集并在每个图像下面显示类名
  38. plt.figure(figsize=(10,10))
  39. i = 0
  40. for (image, label) in test_dataset.take(25):
  41. image = image.numpy().reshape((28,28))
  42. plt.subplot(5,5,i+1)
  43. plt.xticks([])
  44. plt.yticks([])
  45. plt.grid(False)
  46. plt.imshow(image, cmap=plt.cm.binary)
  47. plt.xlabel(class_names[label])
  48. i += 1
  49. plt.show()
  50. #建立模型
  51. model = tf.keras.Sequential([
  52. tf.keras.layers.Flatten(input_shape=(28,28,1)), #输入层
  53. tf.keras.layers.Dense(256,activation=tf.nn.relu),#隐藏层1
  54. tf.keras.layers.Dense(128,activation=tf.nn.relu),#隐藏层2
  55. tf.keras.layers.Dense(10,activation=tf.nn.softmax)#输出层
  56. ])
  57. #定义优化器和损失函数
  58. model.compile(optimizer='adam',
  59. loss='sparse_categorical_crossentropy',
  60. metrics=['accuracy'])
  61. #设置训练参数
  62. BATCH_SIZE = 32
  63. train_dataset = train_dataset.repeat().shuffle(num_train_examples).batch(BATCH_SIZE)
  64. test_dataset = test_dataset.batch(BATCH_SIZE)
  65. #训练模型
  66. model.fit(train_dataset, epochs=5, steps_per_epoch=math.ceil(num_train_examples/BATCH_SIZE))
  67. test_loss, test_accuracy = model.evaluate(test_dataset, steps=math.ceil(num_test_examples/32))
  68. print('Accuracy on test dataset:', test_accuracy)
  69. for test_images, test_labels in test_dataset.take(1):
  70. test_images = test_images.numpy()
  71. test_labels = test_labels.numpy()
  72. predictions = model.predict(test_images)
  73. predictions.shape
  74. predictions[0]
  75. np.argmax(predictions[0])
  76. test_labels[0]
  77. def plot_image(i, predictions_array, true_labels, images):
  78. predictions_array, true_label, img = predictions_array[i], true_labels[i], images[i]
  79. plt.grid(False)
  80. plt.xticks([])
  81. plt.yticks([])
  82. plt.imshow(img[...,0], cmap=plt.cm.binary)
  83. predicted_label = np.argmax(predictions_array)
  84. if predicted_label == true_label:
  85. color = 'blue'
  86. else:
  87. color = 'red'
  88. plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
  89. 100*np.max(predictions_array),
  90. class_names[true_label]),
  91. color=color)
  92. def plot_value_array(i, predictions_array, true_label):
  93. predictions_array, true_label = predictions_array[i], true_label[i]
  94. plt.grid(False)
  95. plt.xticks([])
  96. plt.yticks([])
  97. thisplot = plt.bar(range(10), predictions_array, color="#777777")
  98. plt.ylim([0, 1])
  99. predicted_label = np.argmax(predictions_array)
  100. thisplot[predicted_label].set_color('red')
  101. thisplot[true_label].set_color('blue')
  102. i = 0
  103. plt.figure(figsize=(6,3))
  104. plt.subplot(1,2,1)
  105. plot_image(i, predictions, test_labels, test_images)
  106. plt.subplot(1,2,2)
  107. plot_value_array(i, predictions, test_labels)
  108. i = 12
  109. plt.figure(figsize=(6,3))
  110. plt.subplot(1,2,1)
  111. plot_image(i, predictions, test_labels, test_images)
  112. plt.subplot(1,2,2)
  113. plot_value_array(i, predictions, test_labels)
  114. num_rows = 5
  115. num_cols = 3
  116. num_images = num_rows*num_cols
  117. plt.figure(figsize=(2*2*num_cols, 2*num_rows))
  118. for i in range(num_images):
  119. plt.subplot(num_rows, 2*num_cols, 2*i+1)
  120. plot_image(i, predictions, test_labels, test_images)
  121. plt.subplot(num_rows, 2*num_cols, 2*i+2)
  122. plot_value_array(i, predictions, test_labels)
  123. img = test_images[0]
  124. print(img.shape)
  125. img = np.array([img])
  126. print(img.shape)
  127. predictions_single = model.predict(img)
  128. print(predictions_single)
  129. plot_value_array(0, predictions_single, test_labels)
  130. _ = plt.xticks(range(10), class_names, rotation=45)
  131. np.argmax(predictions_single[0])
完整代码

 

原文链接:http://www.cnblogs.com/imae/p/10646472.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号