TensorFlow2 开发指南 | 01 深度学习快速入门

自我介绍:大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我热爱AI、热爱编程、热爱分享! 这博客是我对学习的一点总结与思考。如果您也对 深度学习、机器视觉、算法、Python、C++ 感兴趣,可以关注我的动态,我们一起学习,一起进步~
我的博客地址为:【AI 菌】的博客
我的Github项目地址是:【AI 菌】的Github

在这里插入图片描述



前言:正确开启TensorFlow修炼之路

前一段时间我写了一个《Tensorlow2深度学习实战》的专栏,博友们的反应很强烈,表示里面的例程换个数据集都能跑通,而且测试效果还挺好!与此同时,也有一些刚接触深度学习的新人,表示直接上手实战有些难度,想知道TensorFlow2 该如何学习?比如下面这位同学的问题:
在这里插入图片描述
除此之外,还些同学在纠结是该学习TensorFlow还是Pytorch。我也及时给出了我的看法:
在这里插入图片描述
受同学们和博友们的鼓舞,我打算写一个TensorFlow2入门专栏,专门分享TensorFlow2从入门到进阶的系列文章。本专栏在保证内容完整性的基础上,力求简洁,旨在让初学者能够更快地、高效地入门TensorFlow2深度学习框架。

在学习TensorFlow2之前,我希望您对自己的知识储备有一个定位,您可以从下面几个方面考虑,从而选择适合自己的学习阶段:

1、如果您还是一个编程小白,或者没有Python编程基础,建议您先学习Python的基础语法。因为本专栏所有TensorFlow2例程都是基于Python语言编写的,所以学习并掌握Python是必要的。下面是一个比较精简的Python入门教程,可以参考其学习:

2、如果您已经掌握Python语言基础和TensorFlow2深度学习框架,迫切想用TensorFlow2去实现一些深度学习任务,可以选择学习下面的进阶教程:

3、如果您是深度学习小白,想对深度学习原理有进一步的掌握,可以学习下面的理论系列文章:

好啦,话不多说,下面就让我们一起进入第一课:TensorFlow2 开发指南 | 01 深度学习快速入门


一、认识 TensorFlow

(1)TensorFlow 简介

TensorFlow 是 Google 于 2015 年发布的深度学习框架,最初版本只支持符号式编程。得益于发布时间较早,以及 Google 在深度学习领域的影响力,TensorFlow 很快成为最流行的深度学习框架。目前来看,TensorFlow 和 PyTorch 框架是业界使用最为广泛的两个深度学习框架,TensorFlow 在工业界拥有完备的解决方案和用户基础, PyTorch 得益于其精简灵活的接口设计,可以快速设计调试网络模型,在学术界获得好评。

(2)TensorFlow2 新亮相

由于 TensorFlow1 接口设计频繁变动,功能设计重复冗余,符号式编程开发和调试非常困难等问题,TensorFlow 1.x 版本一度被业界诟病。2019年,Google 推出 TensorFlow 2 正式版本,将以动态图优先模式运行,从而能够避免TensorFlow 1.x 版本的诸多缺陷,已获得业界的广泛认可
TensorFlow 2 是一个与 TensorFlow 1.x 使用体验完全不同的框架,TensorFlow 2 不兼容 TensorFlow 1.x 的代码,同时在编程风格、函数接口设计等上也大相径庭,TensorFlow 1.x 的代码需要依赖人工的方式迁移,自动化迁移方式并不靠谱。并且Google 即将停止支持 TensorFlow 1.x,所以不建议学习 TensorFlow 1.x 版本。

(3)TensorFlow 2 与 Keras 的区别

TensorFlow 2 与 Keras 之间既有联系又有区别。Keras 可以理解为一套高层 API 的设计规范,Keras 本身对这套规范有官方的实现,在 TensorFlow2 中也实现了这套规范,称为 tf.keras 模块,并且 tf.keras 将作为 TensorFlow 2 版本的唯一高层接口,避免出现接口重复冗余的问题。

二、环境配置与搭建

俗话说 “工欲善其事,必先利其器”,摆在学习TensorFlow2 前的第一个事就是要搭建好一个稳定的环境。TensorFlow2深度学习环境搭建无外乎以下两种方式:CPU平台搭建、CPU平台搭建。前者适用于一般配置电脑,后者适用于具有深度学习功能GPU的电脑。对于将从事计算机视觉方向的同学,墙裂建议后者。

(1)CPU平台搭建

首先在这里,我先说一下自己的安装环境和安装版本:

  • Windows 10
  • Anaconda 3
  • PyCharm 2019
  • TensorFlow 2.0.0

详细的安装教程可参见我之前的记录:Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建

(2)GPU平台搭建

同样,下面列出我的安装环境以及安装版本:

  • Windows 10
  • Anaconda 3
  • PyCharm 2020
  • TensorFlow 2.2.0

详细的安装教程可参见我之前的记录:Anaconda3+PyCharm+Cuda10.1+Cudnn7.6+tensorflow2.2安装与配置教程

三、面对初学者的快速入门

为了大家更快的入门,下面我将展示一个简单的入门案例——用TensorFlow2实现手写数字识别。对于初学者,我建议使用tf.keras的高层API接口进行实现,这样代码会更简洁,更容易上手。具体步骤如下:

(1)导入库

import tensorflow as tf  # 导入TF库
from tensorflow.keras import datasets, Sequential, layers  # 导入TF子库

(2)数据集准备

(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()   # 加载数据集,返回的是两个元组,分别表示训练集和测试集
x_train, x_test = x_train / 255.0, x_test / 255.0  # 归一化,将像素值缩放到0~1

(3)模型搭建

network = Sequential([
    layers.Flatten(input_shape=(28, 28)),
    layers.Dense(128, activation='relu'),
    layers.Dropout(0.2),
    layers.Dense(10, activation='softmax')
])

(4)模型装配与训练,并验证模型

# 模型装配
network.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 模型训练
network.fit(x_train, y_train, epochs=5)
# 验证模型
network.evaluate(x_test, y_test, verbose=2)

训练过程以及测试结果:

在这里插入图片描述
结果分析:
对mnist数据集训练完5个epos后,模型在验证集上的分类准确度达到97.68%。

四、面对进阶者的快速入门

对于已有一定TensorFlow基础的同学,我建议使用相对底层的方式去实现。这样代码虽然显得冗长,但是操作会更灵活,更有助于我们进行更深入的学习。具体步骤如下:

(1)导入库

import tensorflow as tf  # 导入TF库
from tensorflow.keras import datasets, layers, Model, losses, optimizers, metrics # 导入TF子库

(2)数据集准备

# 加载数据集,返回的是两个元组,分别表示训练集和测试集
(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()  
# 归一化,将像素值缩放到0~1
x_train = tf.convert_to_tensor(x_train, dtype=tf.float32)/255.  
x_test = tf.convert_to_tensor(x_test, dtype=tf.float32)/255.
# 使用 tf.data 来将数据集切分为 batch个一组,并对数据集进行打乱
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)

(3)使用类构建网络模型

class Network(Model):
    def __init__(self):
        super(Network, self).__init__()
        self.conv1 = layers.Conv2D(32, 3, activation='relu')
        self.flatten = layers.Flatten()
        self.fc1 = layers.Dense(128, activation='relu')
        self.fc2 = layers.Dense(10, activation='softmax')

    def call(self, x):
        x = tf.reshape(x, (-1, 28, 28, 1))
        x = self.conv1(x)
        x = self.flatten(x)
        x = self.fc1(x)
        y = self.fc2(x)
        return y
network = Network()  # 实例化

(4)模型的装配

这个部分主要涉及损失函数、优化器、评价标准的选择和构建

# 确定目标损失函数、优化器、评价标准
loss_object = losses.SparseCategoricalCrossentropy()
optimizer = optimizers.Adam()
# 训练集上的损失值、精确度
train_loss = metrics.Mean(name='train_loss')
train_accuracy = metrics.SparseCategoricalAccuracy(name='train_accuracy')
# 测试集上的损失值、精确度
test_loss = metrics.Mean(name='test_loss')
test_accuracy = metrics.SparseCategoricalAccuracy(name='test_accuracy')

(5)训练与测试函数的构建

# 训练
def train_step(images, labels):
    with tf.GradientTape() as tape:  # 建立梯度环境
        predictions = network(images)  # 前向计算
        loss = loss_object(labels, predictions)  # 计算损失
    gradients = tape.gradient(loss, network.trainable_variables)  # 计算网络中各个参数的梯度
    optimizer.apply_gradients(zip(gradients, network.trainable_variables))  # 更新网络参数
    train_loss(loss)  # 计算训练损失
    train_accuracy(labels, predictions)  # 计算训练精确度

# 测试
def test_step(images, labels):
    predictions = network(images)  # 前向计算
    t_loss = loss_object(labels, predictions)  # 计算当前轮上的损失
    test_loss(t_loss)  # 计算测试集上的损失
    test_accuracy(labels, predictions)  # 计算测试集上的准确率

(6)迭代训练并验证模型

for epoch in range(EPOCHS):
    # 在下一个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('Accuracy:{}'.format(test_accuracy.result()))
    # 打印训练结果
    template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'
    print(template.format(epoch+1,
                          train_loss.result(), train_accuracy.result(),
                          test_loss.result(), test_accuracy.result()))

训练过程以及测试结果:

在这里插入图片描述
结果分析:
对mnist训练集玩5个epos后,模型在训练集上的分类准确度达到99.69%,测试集上的分类准确度达到98.43%。


完整代码已经上传github仓库:https://github.com/Keyird/TensorFlow2-for-beginner
如果对你有帮助的话,欢迎star收藏~

最好的关系是互相成就,各位的「三连」就是【AI 菌】创作的最大动力,我们下期见!

AI 菌 CSDN认证博客专家 博客专家 CSDN合作伙伴 算法实习僧
研究僧一枚,CSDN博客专家,公众号【AI 修炼之路】作者。专注于无人驾驶(环境感知方向),热衷于分享AI、CV、DL、ML、OpenCV、Python、C++等相关技术文章。
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值