2 AI 深度学习框架
2.1 Tensorflow
依赖模块:protobuf, tensorflow, tensorflow_cpu
$ pip show tensorflow-gpu
Name: tensorflow-gpu
Version: 2.5.0
Summary: TensorFlow is an open source machine learning framework for everyone.
Home-page: https://www.tensorflow.org/
Author: Google Inc.
Author-email: packages@tensorflow.org
License: Apache 2.0
Location: d:\dev\langs\python\python37\lib\site-packages
Requires: gast, astunparse, keras-preprocessing, google-pasta, tensorflow-estimator, six, termcolor, keras-nightly, numpy, tensorboard, protobuf, opt-einsum, typing-extensions, grpcio, wrapt, wheel, flatbuffers, h5py, absl-py
Required-by:
TensorFlow 是谷歌基于 DistBelief 进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着 N 维数 组,Flow(流)意味着基于数据流图的计算,TensorFlow 为张量从流图的一端流动到另一端计算过程。TensorFlow 是将复杂的数据结构传 输至人工智能神经网中进行分析和处理过程的系统。
TensorFlow 可被用于语音识别或图像识别等多项机器深度学习领域,对 2011 年开发的深度学习基础架构 DistBelief 进行了各方面的改进, 它可在小到一部智能手机、大到数千台数据中心服务器的各种设备上运行。TensorFlow 将完全开源,任何人都可以用。
TensorFlow 由谷歌人工智能团队谷歌大脑(Google Brain)开发和维护,拥有包括 TensorFlow Hub、TensorFlow Lite、TensorFlow Research Cloud 在内的多个项目以及各类应用程序接口 API。自 2015 年 11 月 9 日起,TensorFlow 依据阿帕奇授权协议(Apache 2.0 open source license)开放源代码。
什么是张量(tensor)
张量就是 N 维数组,百度百科上说它是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数。在不同的领域,张量有不同的理解。我认为这句 话讲得比较好:张量是不随坐标系而改变的物理系统内在的量。在机器视觉领域,我个人理解为在不同坐标系/参考系下变的 CV 特征。
术语
术语 | 解释 |
---|---|
one hot 编码 | |
tensor 张量 | 表示数据,一组多维数据(一维标量 Scalar、二维矢量/向量 vector,在 tensorflow 里都可以泛叫张量)。在 python numpy 里类型是 narray。 |
OP 算子 | |
Session 会话 | 在 tensorflow 1.x 里用来启动一个训练。 |
变量 | 用来维护状态 |
入门篇
表格 tensorflow 版本说明
版本 | 发布时间 | 功能&备注 |
---|---|---|
v1.0 | 2015.11 | 用于处理静态计算图 |
v2.0 | 2019.1 | 采用动态图(优先)模式开发。集成 keras。提供了不同等级 API 减少开发门槛。。 |
v2.4 |
TensorFlow 提供 Python 语言下的四个不同版本:CPU 版本(tensorflow)、包含 GPU 加速的版本(tensorflow-gpu),以及它们的每日编译版本(tf-nightly、tf-nightly-gpu)。
Tensorflow 1.x 和 2.x
TensorFlow 1.x 主要是用于处理静态计算图的框架。计算图中的节点是 Tensors,当图形运行时,它将保持 n 维数组;图中的边表示在运行图以实际执行有用计算时将在张量上运行的函数。先创建计算图后运行的方式即为 符号式编程 。
Tensorflow 2.0 出现于 2019 年 1 月。Tensorflow 2.0 中,采用动态图(优先)模式开发,动态图开发效率高,运行效率可能不如静态图;TensorFlow 2 也支持通过 tf.function
将动态图优先模式的代码转化为静态图模式
这种运算同时创建计算图和数值结果的方式叫做 命令式编程 。
Tensorflow 目前发布了两个版本:1.x 和 2.0,通过对这两个版本的使用,相较于 Tensorflow1.x,有以下感触:
(1)简单易用:
Tensorflow2 去除了冗余的接口,并将计算过程封装成了函数,方便开发者调用。同时,Tensorflow2 内置了 Keras,使用 Keras 开发神经网络更加便捷。
(2)工具多样化 :
Tensorflow2 提供绝大多数 AI 开发及落地应用的函数,从数据处理,到搭建及可视化网络,从训练网络到部署应用网络,从各种文件读取到保存等,几乎实现了 Opencv\pillow\Matplotlib 所包含的所有功能。
(3)兼容性好,受众广 :
Tensorflow2 针对不同等级的 AI 开发者提供了不同等级的接口,为底层开发者提供了底层接口,为高层开发者提供了高层接口。
(4)高效 :
Tensorflow2 使用了 Eager execution 机制,与 python 运行时集成度更高,动态图机制可以实时获取结果,开发效率更高。新的装饰器的加入,可将 python 对象转换为图结构,实现张量的跟踪。
总而言之,Tensorflow2 的发布,标志者 AI 新纪元的开启,解放了 AI 开发者,加速了 AI 的发展。
切换设备
# 查看设备类型
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {}
incarnation: 1361540258329500804
]
# 或者
import tensorflow as tf
tf.config.list_physical_devices()
[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]
开发篇
tensorflow 1.x 迁移到 2.x
使用 tensorflow 提供的迁移工具
- 单脚本转换
先进入到你要转换脚本(eg:yolov3.py) 的目录,然后:
tf_upgrade_v2 --infile yolov3.py --outfile yolov3.py
- 文件夹批量转换
先进入你要转换的文件夹根目录(eg:yolov3/),然后可以转换文件下所有 py 文件:
tf_upgrade_v2 --intree yolov3/ --outtree yolov3/ --copyotherfiles False
注意事项:
tf.compat.v1.disable_eager_execution() # 兼容 V1:禁止动态图
预训练模型 pre-trained models
除了 Xception and MobileNet,其他的 Applications 都与 TensorFlow 及 Theano 相容,我们就挑 VGG16 为例子,解释如何使用。这些模型的 隐藏层数都很多,也使用了大量的资料作训练,一般电脑可能要执行很久,等结果可能要很多轮的咖啡 XD,因此,Keras 将研发团队精心调校的模型及执行结 果收集进来,一般使用者就不用自己训练模型,可以直接套用,故称为预先训练的模型(pre-trained models)。
分布式训练
tf.distribute.Strategy
是一个可在多个 GPU、多台机器或 TPU 上进行分布式训练的 TensorFlow API。使用此 API,您只需改动较少代码就能分布现有模型和训练代码。
tensorboard
TensorBoard 是一个可视化工具,它可以用来展示网络图、张量的指标变化、张量的分布情况等。特别是在训练网络的时候,我们可以设置不同的参数(比如:权重 W、偏置 B、卷积层数、全连接层数等),使用 TensorBoader 可以很直观的帮我们进行参数的选择。
# Load the TensorBoard notebook extension
%load_ext tensorboard
# Open an embedded TensorBoard viewer
%tensorboard --logdir {logdir}
实现时用这些函数来记录数据: tf.summary
, summary_writer.add_summary
下面是训练时,传入回调函数 callbacks
log_dir="/logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
print(log_dir)
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)
model.fit(x=x_train,
y=y_train,
epochs=5,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback])
部署篇
本节参考
[1]. TensorFlow 官网 https://tensorflow.google.cn/overview/?hl=zh_cn
[2]. TensorFlow 中文社区 http://www.tensorfly.cn/
[3]. 开始使用 TensorBoard https://tensorflow.google.cn/tensorboard/get_started?hl=zh_cn
[4]. Tensorflow2.0——新世界的大门 https://www.douban.com/note/721362180/
2.2 Keras
官网: https://keras.io/datasets/
Keras 是一个对小白用户非常友好而简单的深度学习框架,严格来说并不是一个开源框架,而是一个高度模块化的神经网络库。
Keras 是一个开源的 python 库,可以让您轻松构建神经网络。 该库能够在 TensorFlow,Microsoft Cognitive Toolkit,Theano 和 MXNet 之上运行。
下载数据集缺省路径: C:\Users\%USER%\.keras
tensorflow.keras
TensorFlow 的高阶 API 基于 Keras API 标准,用于定义和训练神经网络。Keras 通过用户友好的 API 实现快速原型设计、先进技术研究和生产。
import numpy as np
import tensorflow as tf
from tensorflow import keras
Keras 模型由多个组件组成:
- 架构或配置,它指定模型包含的层及其连接方式。
- 一组权重值(即“模型的状态”)。
- 优化器(通过编译模型来定义)。
- 一组损失和指标(通过编译模型或通过调用
add_loss()
或add_metric()
来定义)。
您可以通过 Keras API 将这些片段一次性保存到磁盘,或仅选择性地保存其中一些片段:
- 将所有内容以 TensorFlow SavedModel 格式(或较早的 Keras H5 格式)保存到单个归档。这是标准做法。
- 仅保存架构/配置,通常保存为 JSON 文件。
- 仅保存权重值。通常在训练模型时使用。
示例 1: 简单模型 tf.keras.models.Sequential
import tensorflow as tf
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 #像素值整数转化成浮点数(0,1)
#4 层网络:第一层是输入层(将一个图片平滑化一维 28*28=784),二层减少到 128 层(激活函数 relu)
#三层 dropout 处理,四层 softmax 处理
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), #0.2 的丢弃率
tf.keras.layers.Dense(10, activation='softmax')
])
#为训练选择优化器和损失函数
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
#训练并验证模型
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
示例 2:针对专业人员的 自定义模型
import tensorflow as tf
class MyModel(tf.keras.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, activation='softmax')
def call(self, x):
x = self.conv1(x)
x = self.flatten(x)
x = self.d1(x)
return self.d2(x)
model = MyModel()
with tf.GradientTape() as tape:
logits = model(images)
loss_value = loss(logits, labels)
grads = tape.gradient(loss_value, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
2.3 Torch/PyTorch
Torch
Torch 是为 LuaJIT 编写的完整的科学计算环境,它是针对 Lua 语言的即时(JIT)编译器。 Torch 不仅是机器学习框架/库,还是更大的科学计算环境,但是它提供的功能之一是对机器学习的支持。
PyTorch
PyTorch 是 Facebook 团队于 2017 年 1 月发布的一个深度学习框架。基于以前的 Torch 库,PyTorch 是 Python 优先的机器 学习框架,被大量用于深度学习。它支持 CUDA 技术(来自 NVIDIA),可以在训练,分析和验证神经网络模型中充分利用专用 GPU 的功能。
Torch 的热门应用:在增强学习领域,用卷积神经网络和代理处理图像问题。
PyTorch 由 4 个主要的包组成:
- torch:类似于 Numpy 的通用数组库,可将张量类型转换为 torch.cuda.TensorFloat,并在 GPU 上进行计算。
- torch.autograd:用于构建计算图像并自动获取梯度的包。
- torch.nn:具有共享层和损失函数的神经网络库。
- torch.optim:具有通用优化算法(如 SGD、Adam 等)的优化包。
示例:ResNet18 神经网络
# 在 CPU 版本自动下载模型参数
class SurfaceDefectResNet(torch.nn.Module):
def __init__(self):
super(SurfaceDefectResNet, self).__init__()
# Downloading: "https://download.pytorch.org/models/resnet18-5c106cde.pth" to /home/admin/.cache/torch/hub/checkpoints/resnet18-5c106cde.pth
self.cnn_layers = torchvision.models.resnet18(pretrained=True)
num_ftrs = self.cnn_layers.fc.in_features
self.cnn_layers.fc = torch.nn.Linear(num_ftrs, 10)
def forward(self, x):
# stack convolution layers
out = self.cnn_layers(x)
return out
net = SurfaceDefectResNet()
Caffe
Caffe 最初由杨庆佳在加州大学伯克利分校读博期间发起,后来由伯克利 AI 研究公司(BAIR)和社区贡献者联合开发。它主要专注于用于计算机视觉应用的卷积神经网络。
PaddlePaddle
Paddle 即 Parallel Distributed Deep Learning(并行分布式深度学习)。
飞桨(PaddlePaddle) 以百度多年的深度学习技术研究和业务应用为基础,是中国首个开源开放、技术领先、功能完备的产业级深度学习平台, 集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体。目前,飞桨已凝聚超 265 万开发者,服务企业 10 万家,基于飞桨开源 深度学习平台产生了 34 万个模型。可视化框架是 visualdl。
2016 年 8 月,PaddlePaddle 发布。
2018 年 7 月,开源框架 v0.14 发布——提供从数据预处理到模型部署在内的深度学习全流程的底层能力支持。官方首次开源 CV/NLP/语音/强化学习等 10 个模型。
示例: mnist 手写数字数据集分类
import paddle
print(paddle.__version__)
from paddle.vision.transforms import Compose, Normalize
# 1.加载数据,数据归一化
transform = Compose([Normalize(mean=[127.5],
std=[127.5],
data_format='CHW')])
# 使用 transform 对数据集做归一化
print('download training data and load training data')
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
print('load finished')
# 2.组网:用 paddle.nn 下的 API,如 Conv2D、MaxPool2D、Linear 完成 LeNet 的构建。
import paddle
import paddle.nn.functional as F
class LeNet(paddle.nn.Layer):
def __init__(self):
super(LeNet, self).__init__()
self.conv1 = paddle.nn.Conv2D(in_channels=1, out_channels=6, kernel_size=5, stride=1, padding=2)
self.max_pool1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)
self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=5, stride=1)
self.max_pool2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2)
self.linear1 = paddle.nn.Linear(in_features=16*5*5, out_features=120)
self.linear2 = paddle.nn.Linear(in_features=120, out_features=84)
self.linear3 = paddle.nn.Linear(in_features=84, out_features=10)
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = self.max_pool1(x)
x = F.relu(x)
x = self.conv2(x)
x = self.max_pool2(x)
x = paddle.flatten(x, start_axis=1,stop_axis=-1)
x = self.linear1(x)
x = F.relu(x)
x = self.linear2(x)
x = F.relu(x)
x = self.linear3(x)
return x
法 1:基于高层 API,完成模型的训练与预测 Model.fit/evaluate
# 3.模块训练 model.fit
from paddle.metric import Accuracy
model = paddle.Model(LeNet()) # 用 Model 封装模型
optim = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())
# 配置模型
model.prepare(
optim,
paddle.nn.CrossEntropyLoss(),
Accuracy()
)
# 训练模型
model.fit(train_dataset,
epochs=2,
batch_size=64,
verbose=1
)
# 4.模型预测 model.evaluate
model.evaluate(test_dataset, batch_size=64, verbose=1)
法 2:基于基础 API,完成模型的训练与预测
组网后,开始对模型进行训练,先构建 train_loader
,加载训练数据,然后定义 train
函数,设置好损失函数后,按 batch 加载数据,完成模型的训练。
import paddle.nn.functional as F
train_loader = paddle.io.DataLoader(train_dataset, batch_size=64, shuffle=True)
# 加载训练集 batch_size 设为 64
def train(model):
model.train()
epochs = 2
optim = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())
# 用 Adam 作为优化函数
for epoch in range(epochs):
for batch_id, data in enumerate(train_loader()):
x_data = data[0]
y_data = data[1]
predicts = model(x_data)
loss = F.cross_entropy(predicts, y_data)
# 计算损失
acc = paddle.metric.accuracy(predicts, y_data)
loss.backward()
if batch_id % 300 == 0:
print("epoch: {}, batch_id: {}, loss is: {}, acc is: {}".format(epoch, batch_id, loss.numpy(), acc.numpy()))
optim.step()
optim.clear_grad()
model = LeNet()
train(model)
#模型预测
test_loader = paddle.io.DataLoader(test_dataset, places=paddle.CPUPlace(), batch_size=64)
# 加载测试数据集
def test(model):
model.eval()
batch_size = 64
for batch_id, data in enumerate(test_loader()):
x_data = data[0]
y_data = data[1]
predicts = model(x_data)
# 获取预测结果
loss = F.cross_entropy(predicts, y_data)
acc = paddle.metric.accuracy(predicts, y_data)
if batch_id % 20 == 0:
print("batch_id: {}, loss is: {}, acc is: {}".format(batch_id, loss.numpy(), acc.numpy()))
test(model)
其它深度学习框架
CNTK
CNTK 是微软开源的深度学习工具包,它通过有向图将神经网络描述为一系列计算步骤。在有向图中,叶节点表示输入值或网络参数,而其他节点表示其输入上的矩阵运算。
CNTK 允许用户非常轻松地实现和组合流行的模型,包括前馈 DNN,卷积网络(CNN)和循环网络(RNN / LSTM)。CNTK 本就是微软语音团队开源的,自然是更合适做语音任务,使用 RNN 等模型,以及在时空尺度分别进行卷积非常容易。
本章参考
[1]. Keras 官网 https://keras.io/datasets/
[2]. PaddlePaddle https://www.paddlepaddle.org.cn/
- 收藏|NLP 入门模型 Tensorflow 实现 https://mp.weixin.qq.com/s/-NEKxUOio8YS5EnRxHcvvw
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论