Tensorflow2.1无痛入门(根据官网API整理)

Tensorflow2.1无痛入门——官方API中文搬运及注释

神经网络小白,寒假开始学习神经网络,本来想根据B站慕课之类的demo进行学习,但是发现很多课程都是关于TensorFlow1.x的,本来以为差别不大,学了好久才发现相差甚远。。摸鱼好几天都没有找到合适的入门教材,最后发现官方的API才是入门最妥当的方式。。。浪费了不少时间。希望这里的整理可以帮到大家啦。(文章开头不能空两格真的很头疼)
原API附上

数据集以及基本介绍:

这个实例是神经网络入门的最简单的实例,按照API说,就像“Hello World”一样,这里使用的数据集是TensorFlow2.1自配的,不需要单独下载。数据集中包含10个类别的70000个灰度图像。图像以28 x 28显示,分别是10种衣物,我们将使用60000个图像来训练网络,用10000个图像来测试网络学习。
图片大概长成这个样子…(假装拥有一双AJ)在这里插入图片描述

神经网络的搭建

准备工作:

首先,我们要先将一些相关的包给导入进来

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt

然后,我们加载这个fashion数据集

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

这里的加载我就不多解释了,fashion_mnist.load_data()会传回训练集与测试集,以及他们的标签。类别的标签是不在数据集中的,所以直接复制就好了(官网上这么说的,这个问题不大)。
大家可以先自行查看一下这里的训练组,测试组以及他们标签的shape

train_images.shape#(60000, 28, 28)
len(train_labels)#60000
train_labels#array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)
test_images.shape#(10000, 28, 28)
len(test_labels)#10000

接下来,我们要对数据进行一个预处理,图片的每一个像素的颜色是0~255之间,0代表黑色, 255代表白色,我们要将像素转化为0~1之间。

train_images = train_images / 255.0
test_images = test_images / 255.0

好了,现在我们数据已经到手,可以开始构建我们的神经网络O(∩_∩)O~

构建网络:

构建网络包含两个步骤,分别是构建层,以及模型编译

神经网络层的构建

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

好了,到这里,我们神经网络的层次就已经构架完毕。
可以看到我们构建的神经网络有三个层:

第一层是输入层,在这里我们要将2828的图片所对应的2828的矩阵由二维通过keras.layers.Flatten()转化为一维矩阵,这个过程也叫作扁平化。这样一来第一层神经网络就有784个神经元。每个神经元分别对应一个像素点。

第二层是全连接层,全连接层在这里设置了128个神经元,激活函数使用的是rule。全连接层构建通过keras.layers.Dense()实现的。全连接层,就是当前层的神经元与上一层的每一个神经元一一都有连接。

最后一层也是全连接层,作为输出层,我们的分类一共有10个类别,所以这里的神经元个数就是10。值得一提的是,输出的十个数值是神经网络判定当前图片属于某一个类别的概率, 如图所示:

array([5.5488392e-10, 1.5445305e-12, 1.6554838e-10, 2.7955952e-15,
       7.5174762e-11, 9.2117226e-04, 9.5213594e-11, 1.7918178e-03,
       9.0349452e-09, 9.9728703e-01], dtype=float32)

这里可以看到,最后一类的概率最大,所以神经网络判定这张图片属于第十类。

好了,基本的层级已经构造完毕,接下来就可以编译模型了。

模型编译:

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

模型编译的代码显得很简单,这里有几个部分值得说明一下:

optimizer:优化器,优化器会根据网络的损失(loss)来对参数进行微调,使参数能够更好的拟合训练集。

Loss function:损失函数,损失函数常用的有三种MSE,Binary_crossentropy,categorical_crossentropy,三者的使用场合不同,MSE是均方差,crossentropy是交叉熵
,后两个函数分别使用与二分类(Binary)以及多分类,基于这个实例是10分类问题,所以选择后者。

Metrics:用于监控训练和测试步骤。本例使用精确性,即正确分类的图像的分数。

到此为止,我们的模型就已经构造完毕,可以开始训练我们的神经网络了(٩(๑>◡<๑)۶)。

模型训练:

根据官网的API,我做了一些修整。

使用训练集开始训练:(官网叫做Feed themodel…这个feed用的莫名喜感)

model.fit(train_images, train_labels, epochs=10)

短小精悍,结果如下:

Train on 60000 samples
Epoch 1/10
60000/60000 [==============================] - 4s 60us/sample - loss: 0.4940 - accuracy: 0.8258
Epoch 2/10
60000/60000 [==============================] - 3s 53us/sample - loss: 0.3706 - accuracy: 0.8663
Epoch 3/10
60000/60000 [==============================] - 3s 52us/sample - loss: 0.3306 - accuracy: 0.8787
Epoch 4/10
60000/60000 [==============================] - 3s 52us/sample - loss: 0.3090 - accuracy: 0.8871
Epoch 5/10
60000/60000 [==============================] - 3s 52us/sample - loss: 0.2937 - accuracy: 0.8921
Epoch 6/10
60000/60000 [==============================] - 3s 53us/sample - loss: 0.2785 - accuracy: 0.8967
Epoch 7/10
60000/60000 [==============================] - 4s 59us/sample - loss: 0.2667 - accuracy: 0.8999
Epoch 8/10
60000/60000 [==============================] - 3s 57us/sample - loss: 0.2562 - accuracy: 0.9050
Epoch 9/10
60000/60000 [==============================] - 3s 52us/sample - loss: 0.2455 - accuracy: 0.9083
Epoch 10/10
60000/60000 [==============================] - 3s 52us/sample - loss: 0.2365 - accuracy: 0.9123

好的,到这里,我们的神经网络就已经训练完毕了,准确率还算可以吧(新人已经很感动了),接下来,我们拿出测试集,用已训练的模型做测试,看看泛化能力怎么样:

测试集测试

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)
print('\nTest accuracy:', test_acc)

使用model.evaluate(测试集,测试label),返回损失和准确率,然后将准确率打印出来。
结果如下:

10000/10000 - 1s - loss: 0.3415 - accuracy: 0.8785
Test accuracy: 0.8785

感觉还不错吧。
如果想看看单独一张图的预测结果,可以这样处理:

predictions = model.predict(test_images)
print(predictions[0])
print(np.argmax(predictions[0]))

np.argmax()就是将输出层最大的概率对应的index指出来,这里看到就是9。
结果如下:

array([5.5488392e-10, 1.5445305e-12, 1.6554838e-10, 2.7955952e-15,
       7.5174762e-11, 9.2117226e-04, 9.5213594e-11, 1.7918178e-03,
       9.0349452e-09, 9.9728703e-01], dtype=float32
 9

好的,以上就是一个模型的构建,训练,以及使用的过程,如果想入门的小伙伴们应该已经可以开始玩耍了,下面的内容可以直接跳过(我觉得看着那个训练的进度条往前爬然后accuracy不断的提高已经很满足了。。。)

接下来的内容是为了更好的表示模型的结果而设置的。

结果具体化,可视化:

话不多说,先上代码:

def plot_image(i, predictions_array, true_label, img):
  predictions_array, true_label, img = predictions_array, true_label[i], img[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])

  plt.imshow(img, cmap=plt.cm.binary)

  predicted_label = np.argmax(predictions_array)
  if predicted_label == true_label:
    color = 'blue'
  else:
    color = 'red'

  plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
                                100*np.max(predictions_array),
                                class_names[true_label]),
                                color=color)

def plot_value_array(i, predictions_array, true_label):
  predictions_array, true_label = predictions_array, true_label[i]
  plt.grid(False)
  plt.xticks(range(10))
  plt.yticks([])
  thisplot = plt.bar(range(10), predictions_array, color="#777777")
  plt.ylim([0, 1])
  predicted_label = np.argmax(predictions_array)

  thisplot[predicted_label].set_color('red')
  thisplot[true_label].set_color('blue')

这里的代码应该跑一遍,查查英语就可看懂了,将错误的predict用红色的柱状显示出来,将正确的用蓝色的显示出来。

对单张图片进行测试:

i = 0
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions[i], test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions[i],  test_labels)
plt.show()

将多张图片进行预测:

num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
  plt.subplot(num_rows, 2*num_cols, 2*i+1)
  plot_image(i, predictions[i], test_labels, test_images)
  plt.subplot(num_rows, 2*num_cols, 2*i+2)
  plot_value_array(i, predictions[i], test_labels)
plt.tight_layout()
plt.show()

结果如图:
在这里插入图片描述

好了,到这里第一个神经网络实例就已经完成了。我在做这个实例的时候是根据官方文档来做的,没遇到什么问题,配置就是Tensorflow2.1。刚刚接触神经网路,懂得也不是很多,写博客是为了以后复习方便,当然也希望可以帮到一些朋友,让大家少走弯路。
如果在操作过程中发现了错误,也希望大家能在留言区提出来。
Thanks♪(・ω・)ノ祝大家新年快乐lalalalala
——2020.1.24 大年三十

发布了1 篇原创文章 · 获赞 1 · 访问量 30

猜你喜欢

转载自blog.csdn.net/weixin_44322824/article/details/104080135
今日推荐