【Tensorflow 2.0】—— 跟着官方demo学习Tensorflow 2.0框架基本API和用法

目录

前言

一、针对新手的damo

二、进阶demo

2.1 model.py

2.2 train.py

2.2.1 准备输入数据

2.2.2 搭建模型

2.2.3 定义损失函数及优化器

2.2.4 传参计算model()

2.3 运行结果


前言

同样的,对于新框架的学习直接看官网!!

TensorFlow Core不论您是机器学习新手还是专家,都可使用完整的端到端示例了解如何使用 TensorFlow。请试用 Google Colab 中的教程 - 无需进行任何初始设置。https://tensorflow.google.cn/tutorials?hl=zh_cn官网提供的是Jupyter 笔记本格式的教程,能够一段一段的边看边运行,可惜Jupyter服务器在国外,所以国内没法运行。那就直接看好了。

一、针对新手的damo

初学者的 TensorFlow 2.0 教程  |  TensorFlow Corehttps://tensorflow.google.cn/tutorials/quickstart/beginner?hl=zh_cn1. 下载并安装 TensorFlow 2.0 测试版包。将 TensorFlow 载入你的程序:

# 安装 TensorFlow

import tensorflow as tf

2. 载入并准备好 Keras自带的MNIST 数据集。将样本从整数转换为浮点数:

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

3. 将模型的各层堆叠起来,以搭建 tf.keras.Sequential 模型。为训练选择优化器和损失函数:

model = tf.keras.models.Sequential([  # 定义模型网络结构
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',  # 定义模型优化器
              loss='sparse_categorical_crossentropy',  # 定义模型loss函数
              metrics=['accuracy'])  # 定义模型的指标

4. 训练并验证模型:

model.fit(x_train, y_train, epochs=5)  # 5轮

model.evaluate(x_test,  y_test, verbose=2)

5. 训练结果

【Tensorflow 2.0】—— 跟着官方demo学习Tensorflow 2.0框架基本API和用法_第1张图片

现在,这个照片分类器的准确度已经达到 98%。

二、进阶demo

针对专业人员的 TensorFlow 2.0 入门  |  TensorFlow Corehttps://tensorflow.google.cn/tutorials/quickstart/advanced?hl=zh_cn2.2 tensorflow2官方demo_哔哩哔哩_bilibiliTensorflow2官方demo,手写数字的识别https://www.bilibili.com/video/BV1n7411T7o6?spm_id_from=333.999.0.01. 注意在TensorFlow中,tensor的通道排序和pytorch有所不同。

       1)TensorFlow tensor: [batch, height, width, channel]

        2)Pytorch tensor:  [batch,channel, height, width]

2. 这个demo分为model.py和train.py两个脚本。

3.使用mnist数据集,是一个识别人手写的数据集。

        大概就是这样:【Tensorflow 2.0】—— 跟着官方demo学习Tensorflow 2.0框架基本API和用法_第2张图片

2.1 model.py

1. 模型的搭建风格

        使用Model Subclassing API,类似于pytorch的一种风格。

2. 先看一下import

        我们自己构造的MyModel继承了keras的Model类

        搭建网络用的Dense、Flatten、Conv2D函数来自keras的layers类

from tensorflow.keras.layers import Dense, Flatten, Conv2D
from tensorflow.keras import Model

3. 搭建 

class MyModel(Model):
  def __init__(self):
    super(MyModel, self).__init__() 
    self.conv1 = Conv2D(32, 3, activation='relu')  # 卷积层
    self.flatten = Flatten()  # 展平
    self.d1 = Dense(128, activation='relu')  # 全连接层
    self.d2 = Dense(10)  # 全连接层

  # 定义网络正向传播的过程
  def call(self, x):  
    x = self.conv1(x)      # input[batch,28,28,1] ouput[batch,26,26,32] 
    x = self.flatten(x)    # output[batch,21632]
    x = self.d1(x)         # output[batch,128]
    return self.d2(x)      # output[batch,10]

                1)super函数:避免多继承带来的问题 

                2)Conv2D函数,我们来看一下它的参数

        【Tensorflow 2.0】—— 跟着官方demo学习Tensorflow 2.0框架基本API和用法_第3张图片

        这里要注意padding的使用方式和pytorch不同。padding参数由两种值“valid”和“same”。默认“valid”。valid表示不需要补0,same表示需要补0.。输出图片大小的计算公式如下:

          【Tensorflow 2.0】—— 跟着官方demo学习Tensorflow 2.0框架基本API和用法_第4张图片

        3)Faltten函数:展平。因为要和后面的全连接层进行连接,所以要展成一维向量的形式。

        4)Dense函数的参数,比较重要的就是前两个参数 。还有一点需要注意,最后一个全连接层的节点数等于我们的分类数。因为mnist数据集的分类数是10,所以,规定最后一个全连接层的节点数为10。并且最后一个全连接层跟着的激活函数为“softmax”,最终softmax给出的就是属于每个类别的概率分布了。

                【Tensorflow 2.0】—— 跟着官方demo学习Tensorflow 2.0框架基本API和用法_第5张图片

        5)和pytorch的另一个区别:上面用到的Conv2D、Dense、Faltten函数的参数中没有指定input是什么。因为TensorFlow会自动进行推理,这也是TensorFlow的强大之处。

        6)再来看张量在这个网络中的变化情况。首先,输入进去的图片大小是28×28×1的,经过卷积层后,用上面的padding公式去计算,输出是26×26×32(通道数32是我们指定的)的;然后经过展平操作,batch数不变,图片变成1维向量,26×26×32=21632个值;输入到结点个数为128的全连接层,得到128个值的一维向量;最后,输入到结点个数为10的全连接层,得到10个值的一维向量。

2.2 train.py

        模型的搭建步骤遵循这篇博客:【Tensorflow1.0 和 Tensorflow2.0】—— 区别_玛丽莲茼蒿的博客-CSDN博客一、搭建深度学习模型的区别(背过!!!)对于Tensorflow1.0,step 01 :准备输入数据step 02:定义输入PlaceHolderstep 03:搭建模型step 04:定义损失函数及优化器step 05:初始化所有变量step 06:创建会话sessionstep 07:传参计算session.run()对于Tensorflow 2.0,...https://blog.csdn.net/qq_44886213/article/details/123721940?spm=1001.2014.3001.5502

2.2.1 准备输入数据

        1. 导入输入模块和数据集

        一共有60000张灰度图。

import tensorflow as tf
from model import MyModel

# ketas自带的数据集
mnist = tf.keras.datasets.mnist

# 下载数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

        默认下载到了C盘用户文件夹下的.keras目录下。

        【Tensorflow 2.0】—— 跟着官方demo学习Tensorflow 2.0框架基本API和用法_第6张图片 

        2. 加入通道数这一维度       

# Add a channels dimension
x_train = x_train[..., tf.newaxis].astype("float32")
x_test = x_test[..., tf.newaxis].astype("float32")

         从mnist导入的数据集是28×28的灰度图,通过下图加断点的方式可以看到:

        【Tensorflow 2.0】—— 跟着官方demo学习Tensorflow 2.0框架基本API和用法_第7张图片

     增加一个维度后,我们再通过加断点的方式来查看一下,数据集变成了28×28×1的格式

        【Tensorflow 2.0】—— 跟着官方demo学习Tensorflow 2.0框架基本API和用法_第8张图片

         3. 构造数据生成器

        构造训练集和测试集的数据生成器:

train_ds = tf.data.Dataset.from_tensor_slices(
    (x_train, y_train)).shuffle(10000).batch(32)

test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

        1)调用TensorFlow的from_tensor_slices函数:把数据x_train和标签y_train合并为元祖的方式作为输入。

       2)shuffle函数:每次从硬盘中导入10000张图片到内存(训练集一共有60000张),进行随机洗牌打乱顺序,保证数据的随机性。理论上来说,括号内的取值越接近训练集的总数越贴近随机采样(越好),但是内存不允许。

        3)batch函数:32张图作为一个batch。

2.2.2  搭建模型

        实例化一个我们的模型

# Create an instance of the model
model = MyModel()

2.2.3 定义损失函数及优化器

loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

optimizer = tf.keras.optimizers.Adam()

2.2.4 传参计算model()

        1. 定义历史平均loss和历史平均精确率

        他们在 每个epoch上累计值,然后打印出一个epoch累计的结果。便于一轮一轮地观察训练情况

train_loss = tf.keras.metrics.Mean(name='train_loss')
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')

test_loss = tf.keras.metrics.Mean(name='test_loss')
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy')

        2. 训练模型函数

@tf.function
def train_step(images, labels):
  with tf.GradientTape() as tape:
    # training=True is only needed if there are layers with different
    # behavior during training versus inference (e.g. Dropout).
    predictions = model(images, training=True)
    loss = loss_object(labels, predictions)  # 一张图的loss
    
  # 得到误差梯度(将loss反向传播到model.trainable_variables模型每一个可训练的参数中
  gradients = tape.gradient(loss, model.trainable_variables)  
  # 使用误差梯度更新模型参数
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

  train_loss(loss)  # 历史平均loss,全局变量(再次进入函数后在上一次结果的基础上变)
  train_accuracy(labels, predictions)  # 历史平均准确率

        1)tf.GradientTape:与pytorch不同,pytorch会自动跟踪每一个训练参数的误差梯度,而TensorFlow不会。 在这里使用tf.GradientTape函数去记,返回tape。

        2)tape.gradient函数:将loss反向传播到模型每一个可训练的参数中(model.trainable_variables),最终得到误差梯度

        3)优化器Adam的apply_gradients函数:将误差梯度和模型的所有可训练参数用Zip函数打包成元祖,作为函数的输入。使用误差梯度更新模型参数。

        4)最后两行是用来计算历史平均loss和历史平均准确率。根据后面将要讲的“清零”代码,可以看出,计算的是一个epoch的历史平均loss和历史平均准确率。

        5)tf.function修饰器:用来将修饰的函数转化成图结构,那么以后这个函数内就不能加断点了,但是会大大提升训练的效率。

        3. 测试模型函数

@tf.function
def test_step(images, labels):
  # training=False is only needed if there are layers with different
  # behavior during training versus inference (e.g. Dropout).
  predictions = model(images, training=False)
  t_loss = loss_object(labels, predictions)

  test_loss(t_loss)
  test_accuracy(labels, predictions)

       4. 开始跑训练及测试

EPOCHS = 5

for epoch in range(EPOCHS):
  # Reset the metrics at the start of the next epoch
  train_loss.reset_states()
  train_accuracy.reset_states()
  test_loss.reset_states()
  test_accuracy.reset_states()
    
  # 从训练数据生成器中取数据,训练
  for images, labels in train_ds:
    train_step(images, labels)

  for test_images, test_labels in test_ds:
    test_step(test_images, test_labels)

  print(
    f'Epoch {epoch + 1}, '
    f'Loss: {train_loss.result()}, '
    f'Accuracy: {train_accuracy.result() * 100}, '
    f'Test Loss: {test_loss.result()}, '
    f'Test Accuracy: {test_accuracy.result() * 100}'
  )

        1)reset_states函数:每一轮都把tf.keras.metrics(训练loss、训练准确率、测试loss、测试准确率)清零。这样才不影响下一轮的训练。

        2)result函数:获取tf.keras.metrics(训练loss、训练准确率、测试loss、测试准确率)的结果

2.3 运行结果

Epoch 1, Loss: 0.13267311453819275, Accuracy: 96.02333068847656, Test Loss: 0.061965566128492355, Test Accuracy: 98.06999969482422
Epoch 2, Loss: 0.042059458792209625, Accuracy: 98.72000122070312, Test Loss: 0.048135414719581604, Test Accuracy: 98.3499984741211
Epoch 3, Loss: 0.023382706567645073, Accuracy: 99.24333190917969, Test Loss: 0.05048979073762894, Test Accuracy: 98.3499984741211
Epoch 4, Loss: 0.01350458711385727, Accuracy: 99.57333374023438, Test Loss: 0.0620846264064312, Test Accuracy: 98.25
Epoch 5, Loss: 0.009131859056651592, Accuracy: 99.69999694824219, Test Loss: 0.06238056719303131, Test Accuracy: 98.33999633789062

你可能感兴趣的:(python(项目实验),tensorflow)