Joshua Gordon《TensorFlow 2.0讲解》PPT

Tensorflow2.0 对于新手来说更为易用,而对于老手来说,功能更为强大,Josh Gordon 为我们介绍了TensorFlow2.0  的一些新的特征与使用技巧。

在构建模型方面,针对不同的使用人群,TensorFlow2.0 提供了不同层面的 API,针对刚接触 TensorFlow 的新手,提供了Sequential API, 针对工程师,开放了 FunctionalAPI 与 build-in 层,针对有更高需求的工程师,开放了 FunctionalAPI 与可定制的层,评估指标,损失函数等,而针对科研工作者,开放了 Subclassing,可以定制一切函数。

在训练模型方面,从简单到复杂也分很多层次。从快速实验的 model.fit(),到定制回调函数 callbacks,到定制训练循环 batch (使用 GAN 时很有效),到完全定制训练过程,包括优化算法等 (GradientTape).

在数据方面,提供了 tensorflow_datasets,能够轻松地加载数据集。

在并行训练方面,得益于分布式策略,无需改变代码,就可以在多台机器、多个 GPU 上训练(MirroredStrategy, MultiWorkerMirroredStrategy)。

教程最后还介绍了两个项目:TinyML: 轻量级的机器学习项目 与 TF.js.

Joshua Gordon 《TensorFlow 2.0讲解》

神经架构搜索研究指南 -5

  1. 系列文章:《神经架构搜索研究指南 -1
  2. 系列文章:《神经架构搜索研究指南 -2
  3. 系列文章:《神经架构搜索研究指南 -3
  4. 系列文章:《神经架构搜索研究指南 -4

9. SNAS:随机神经结构搜索

ICLR 2019:SNAS: Stochastic Neural Architecture Search

这篇论文的作者提出了随机神经结构搜索 (SNAS)。SNAS 是 NAS 的端到端解决方案,在同一轮的反向传播中同时训练神经算子参数和体系结构分布参数。在此过程中,它维护了 NAS 流程的完整性和可微性。

作者将 NAS 重新表述为单元中搜索空间的联合分布参数的优化问题。搜索梯度被用于,利用梯度信息进行泛化的可微损失的体系结构搜索。这种搜索梯度与基于增强学习的 NAS 优化了相同的目标,但为结构决策分配分数时效率更高。

如下所示,搜索空间使用一个有向无环图 (DAG) 表示,称为父图。在图中,节点 xi 代表隐式表示。边 (i, j) 表示要在节点之间选择的信息流和操作。

A conceptual visualization for a forward pass within SNAS.
A conceptual visualization for a forward pass within SNAS.

以下是 CIFAR-10 上 SNAS 和最先进的图像分类器的分类错误:

Classification errors of SNAS and state-of-the-art image classifiers on CIFAR-10.
Classification errors of SNAS and state-of-the-art image classifiers on CIFAR-10.

10. DARTS:可微结构搜索

ICLR 2019:DARTS: Differentiable Architecture Search

这篇论文以可微的方式构造任务,解决了结构搜索的可伸缩性问题。

本文没有在一组离散的候选结构上进行搜索,而是将搜索空间放宽为连续的。因此,可以通过梯度下降,对体系结构的验证集性能进行优化。基于梯度优化的数据效率提升,使得 DARTS 能够使用更少的计算资源获得出色的性能。该模型的性能也优于 ENAS。DARTS 既适用于卷积网络,也适用于递归网络。

作者寻找一种计算单元作为最终架构的构建模块。通过递归连接,学习单元可以被堆叠成卷积网络或递归网络。一个单元是由 N 个节点的有序序列组成的有向无环图。每个节点都是一个隐式的表示——例如一个特征图——并且每条有向边都与转换节点的一些操作相关联。一个单元格被假定为有两个输入节点和一个输出节点。卷积单元的输入节点定义为前两层的单元输出。最近文献里提到的卷积单元里,它们的输入节点被定义为当前步骤的输入和上一步所携带的状态。对所有中间节点应用缩减操作(例如 concatenation 操作)来生成输出单元。

 An overview of DARTS
An overview of DARTS.

该模型与 CIFAR-10 上最先进的图像分类器的比较如下:

Comparison with state-of-the-art image classifiers on CIFAR-10.
Comparison with state-of-the-art image classifiers on CIFAR-10.

——》本系列文章完《——

神经架构搜索研究指南 -4

  1. 系列文章:《神经架构搜索研究指南 -1
  2. 系列文章:《神经架构搜索研究指南 -2
  3. 系列文章:《神经架构搜索研究指南 -3

7. Auto-Keras:高效的神经结构搜索系统

2018:Auto-Keras: An Efficient Neural Architecture Search System

本文提出了一个框架,使用贝叶斯优化引导网络形变,以提升 NAS 的效率。基于他们的方法,作者构建了一个名为 Auto-Keras 的开源 AutoML 系统。

该方法中,网络的主要组成模块,是在贝叶斯优化算法的指导下,通过神经结构的形变来寻找搜索空间。NAS 空间不是欧氏空间,因此作者设计了一个神经网络核函数来解决这一问题。核函数是将一个神经结构变形为另一个神经结构的编辑距离。

Neural Network Kernel. Given two neural networks fa, fb , and matchings between the similar layers, the figure shows how the layers of fa can be changed to the same as fb . Similarly, the skip-connections in fa also need to be changed to the same as fb according to a given matching.
Neural Network Kernel. Given two neural networks fa, fb, and matchings between the similar layers, the figure
shows how the layers of fa can be changed to the same as fb. Similarly, the skip-connections in fa also need to be changed to the same as fb according to a given matching.

利用贝叶斯优化来指导网络形态的第二个挑战是获取函数的优化。这些方法不适用于网络形态的树结构的搜索。通过优化树结构空间的获取函数,解决了这一难题。置信度上界 (UCB) 被选择作为获取函数。
该体系结构的搜索模块是包含贝叶斯优化器和高斯过程的模块。搜索算法在 CPU 上运行,模型训练器模块在 GPU 上进行计算。

该模块在分离的进程中用训练数据训练神经网络,以实现并行化。图模块处理神经网络的计算图,并由搜索模块控制,进行网络形态学操作。模型存储是一个包含经过训练的模型的池子。由于这些模型很大,所以它们存储在存储设备上。

Auto-Keras System Overview
Auto-Keras System Overview

下面是该模型与其他模型在不同数据集上的性能比较:

Classification Error Rate
Classification Error Rate

8. 基于贝叶斯优化和最优传输的神经结构搜索

2018:Neural Architecture Search with Bayesian Optimisation and Optimal Transport

这篇论文提出了一种基于高斯过程 (贝叶斯优化,即 BO) 的神经结构搜索框架 NASBOT。这是通过在神经网络体系结构的空间中开发一个距离度量来实现的,该距离度量可以通过最优传输程序来计算。

作者提出了一种神经网络结构的 (伪) 距离,称为 OTMANN (神经网络结构的最优传输度量),可以通过最优传输程序进行快速计算。他们还开发了一个 BO 框架来优化神经网络结构上的函数,称为 NASBOT (使用贝叶斯优化和最优传输的神经结构搜索)。

为了实现 BO 方案,本文提出了一种神经网络结构的核函数,并给出了一种优化神经网络结构获取函数的方法,它采用进化算法对获取函数进行优化。

这个方法有一个初始的网络池,并计算这些网络上的获取函数。然后该网络池的一组 Nmut 个突变被生成出来。首先要做的就是从被评估的网络集合中随机选择 Nmut 个候选对象,这样那些具有较高的函数值的网络更有可能被选中。然后对每个候选对象进行修改,以生成一个新的体系结构。

可以通过增加或减少一个层中的计算单元数量、添加或删除层,或更改现有层的连接结构来更改体系结构。

最后一步是评估这些 Nmut 突变的获取函数,将其添加到初始池中,并重复指定的次数。在实验中,作者使用 NASBOT 来优化获取。通过实验,他们得出结论,NASBOT 的性能优于用于优化采集的进化算法。

 An illustration of some CNN architectures
An illustration of some CNN architectures

与其他模型相比,NASBOT 的性能如下图所示:

The first row gives the number of samples N and the dimensionality D of each dataset in the form (N, D). The subsequent rows show the regression MSE or classification error (lower is better) on the test set for each method. The last column is for Cifar10 where we took the best models found by each method in 24K iterations and trained it for 120K iterations. When we trained the VGG-19 architecture using our training procedure, we got test errors 0.1718 (60K iterations) and 0.1018 (150K iterations).
The first row gives the number of samples N and the dimensionality D of each dataset in the form (N, D). The subsequent rows show the regression MSE or classification error (lower is better) on the test set for each method. The last column is for Cifar10 where we took the best models found by each method in 24K iterations and trained it for 120K iterations. When we trained the VGG-19 architecture using our training procedure, we got test errors 0.1718 (60K iterations) and 0.1018 (150K iterations).

神经架构搜索研究指南 -3

  1. 系列文章:《神经架构搜索研究指南 -1
  2. 系列文章:《神经架构搜索研究指南 -2

5. 高效结构搜索的层次化表示

ICLR 2018:Hierarchical Representations for Efficient Architecture Search

该网络中提出的算法在 CIFAR-10 上实现了 3.6% 的 top-1 误差,在 ImageNet 上实现了 20.3% 的 top-1 误差。作者提出了一种描述神经网络结构的层次化表示方法,证明了用简单的随机搜索可以得到具有竞争力的图像分类网络结构,并提出了一种可扩展的进化搜索方法变体。

对于平面体系结构表示,他们研究了由单源、单汇聚(single-sink)计算图组成的神经网络体系结构家族,该计算图将源处的输入转换为汇聚处的输出。图中的每个节点都对应一个特征图,每个有向边都和某个操作关联,比如池化操作或者卷积操作。此操作转换输入节点中的特征图,并将其传递给输出节点。

Three-level hierarchical architecture representation
Three-level hierarchical architecture representation.

对于层次化结构,将在不同层次上有若干个不同的 motifs。在较高层次的 motifs 构建过程中,较低层次的 motifs 被作为构建模组。

A ARCHITECTURE VISUALIZATION
A ARCHITECTURE VISUALIZATION

这是 CIFAR-10 测试集中不同模型的错误率:

Classification error on the CIFAR-10 test set obtained using state-of-the-art models as well as the best-performing architecture found using the proposed architecture search framework. Existing models are grouped as (from top to bottom): handcrafted architectures, architectures found using reinforcement learning, and architectures found using random or evolutionary search.
Classification error on the CIFAR-10 test set obtained using state-of-the-art models as
well as the best-performing architecture found using the proposed architecture search framework.
Existing models are grouped as (from top to bottom): handcrafted architectures, architectures found
using reinforcement learning, and architectures found using random or evolutionary search.

6. 渐进神经结构搜索

ECCV 2018:Progressive Neural Architecture Search

该方法采用基于序列模型的优化策略 (SMBO) 学习卷积神经网络 (CNNs) 的结构。本文基于神经结构搜索 (NAS) 方法。

本文中,搜索算法的任务是识别一个好的卷积单元,而不是一个完整的 CNN。每个单元格包含 B 个块,每个块是应用于两个输入数据的组合运算符。每个输入都可以在组合之前进行转换 —— 例如,通过卷积进行转换。然后根据训练集的大小和最终 CNN 所要求的运行时间,决定叠加起来的单元的数量。

The best cell structure found by our Progressive Neural Architecture Search.
The best cell structure found by our Progressive Neural Architecture Search.

通过使用步长为 1 或步长为 2 的基本单元叠加预定数量的副本,可以将单元叠加转换为 CNN,如上图所示。然后,在步长为 2 的单元之间的步长为 1 的单元数量,调整为最多可以有 N 个。在网络的顶层引入了平均池化和 softmax 分类层。下图显示了模型在 CIFAR 测试集上的性能:

Performance of different CNNs on CIFAR test set.
Performance of different CNNs on CIFAR test set.

神经架构搜索研究指南 -2

系列文章:《神经架构搜索研究指南 -1

3. 可伸缩图像识别领域的可转移架构学习

2017:Learning Transferable Architectures for Scalable Image Recognition

在本文中,作者在一个小数据集上搜索结构上的一个组成模块,然后将该模块再转换到一个大数据集上。这是因为直接使用大型数据集将非常麻烦和耗时。

作者在 CIFAR-10 数据集上寻找最佳卷积层,并将其应用于 ImageNet 数据集。具体做法是将该层的更多副本堆叠在一起来实现的。每一层都有自己的参数,用于设计卷积架构。作者将这种体系结构称为 NASNet 架构。

他们还引入了正则化技术——ScheduledDropPath——来改进 NASNet 模型中的泛化性能。该方法的错误率为 2.4%。最大的 NASNet 模型平均精度达到 43.1%。

与前一篇文章一样,本文也使用了神经体系结构搜索 (NAS) 框架。本文的方案中,卷积网络的总体结构是人工预置好的。它们由重复几次的卷积单元组成。每个卷积层具有相同的结构,但权重不同。

该网络有两种类型的单元:返回相同维度特征图的卷积单元(Normal Cell),以及返回特征图的卷积单元(Reduction Cell)。后者特征图的高度和宽度在卷积输出时减少了一半。

 Scalable architectures for image classification consist of two repeated motifs termed Normal Cell and Reduction Cell. This diagram highlights the model architecture for CIFAR-10 and ImageNet. The choice for the number of times the Normal Cells that gets stacked between reduction cells, N, can vary in our experiments.
Scalable architectures for image classification consist of two repeated motifs termed Normal Cell and Reduction Cell. This diagram highlights the model architecture for CIFAR-10 and ImageNet. The choice for the number of times the Normal Cells that gets stacked between reduction cells, N, can vary in our experiments.

在本文提出的搜索空间中,每个单元接收两个初始隐藏状态作为输入,这两个初始隐藏状态是前两层或输入图像中的两个单元的输出。在给定这两个初始隐藏状态的情况下,控制器 RNN 递归地预测卷积单元结构的其余部分。

Controller model architecture for recursively constructing one block of a convolutional cell. Each block requires selecting 5 discrete parameters, each of which corresponds to the output of a softmax layer. Example constructed block shown on right. A convolutional cell contains B blocks, hence the controller contains 5B softmax layers for predicting the architecture of a convolutional cell. In our experiments, the number of blocks B is 5.
Controller model architecture for recursively constructing one block of a convolutional cell. Each block requires selecting 5 discrete parameters, each of which corresponds to the output of a softmax layer. Example constructed block shown on right. A convolutional cell contains B blocks, hence the controller contains 5B softmax layers for predicting the architecture of a convolutional cell. In our experiments, the number of blocks B is 5.

下面是 CIFAR-10 数据集上神经结构搜索的性能:

Performance of Neural Architecture Search and other state-of-the-art models on CIFAR-10. All results for NASNet are the mean accuracy across 5 runs.
Performance of Neural Architecture Search and other state-of-the-art models on CIFAR-10. All results for NASNet are the mean accuracy across 5 runs.

4. 参数共享的高效神经结构搜索

2018:Efficient Neural Architecture Search via Parameter Sharing

本文作者提出了一种称为高效神经结构搜索 (ENAS) 的方法。在这种方法中,控制器通过在大型计算图中搜索最优子图来发现神经网络结构。该控制器经过训练,可以选出在验证集上获得最佳准确度的子图。

然后训练所选子图对应的模型,使正则交叉熵损失最小化。参数通常在子模型之间共享,以便 ENAS 能够提供更好的性能。在 CIFAR-10 测试中,ENAS 的错误率为 2.89%,而神经结构搜索 (NAS) 的错误率为 2.65%。

本文强制所有子模型共享权值,以避免从零开始训练每个子模型达到收敛,从而提高了 NAS 的效率。
本文用单个有向无环图(DAG)表示 NAS 的搜索空间。通过引入一个具有 N 个节点的 DAG,设计出了递归单元,该单元表示局部计算,图中的边表示 N 个节点之间的信息流。

ENAS 的控制器是一个 RNN,它决定在 DAG 中的每个节点上执行哪些计算以及激活哪些边。控制器网络是一个包含 100 个隐藏单元的 LSTM。

An example of a recurrent cell in our search space with 4 computational nodes. Left: The computational DAG that corresponds to the recurrent cell. The red edges represent the flow of information in the graph. Middle: The recurrent cell. Right: The outputs of the controller RNN that result in the cell in the middle and the DAG on the left. Note that nodes 3 and 4 are never sampled by the RNN, so their results are averaged and are treated as the cell’s output.
An example of a recurrent cell in our search space with 4 computational nodes. Left: The computational DAG that corresponds to the recurrent cell. The red edges represent the flow of information in the graph. Middle: The recurrent cell. Right: The outputs of the controller RNN that result in the cell in the middle and the DAG on the left. Note that nodes 3 and 4 are never sampled by the RNN, so their results are averaged and are treated as the cell’s output.
The graph represents the entire search space while the red arrows define a model in the search space, which is decided by a controller. Here, node 1 is the input to the model whereas nodes 3 and 6 are the model’s outputs.
The graph represents the entire search space while the red arrows define a model in the search space, which is decided by a controller. Here, node 1 is the input to the model whereas nodes 3 and 6 are the model’s outputs.

在 ENAS 中,需要学习两组参数:控制器 LSTM 的参数和子模型的共享参数。在训练的第一阶段,对子模型的共享参数进行训练。在第二阶段,对控制器 LSTM 的参数进行训练。这两个阶段在 ENAS 的训练期间交替进行。

An example run of a recurrent cell in our search space with 4 computational nodes, which represent 4 layers in a convolutional network. Top: The output of the controller RNN. Bottom Left: The computational DAG corresponding to the network’s architecture. Red arrows denote the active computational paths. Bottom Right: The complete network. Dotted arrows denote skip connections.
An example run of a recurrent cell in our search space with 4 computational nodes, which represent 4 layers in a convolutional network. Top: The output of the controller RNN. Bottom Left: The computational DAG corresponding to the network’sarchitecture. Red arrows denote the active computational paths. Bottom Right: The complete network. Dotted arrows denote skip connections.

以下是 ENAS 在 CIFAR-10 数据集上的表现情况:

Classification errors of ENAS and baselines on CIFAR-10. In this table, the first block presents DenseNet, one of the state-ofthe-art architectures designed by human experts. The second block presents approaches that design the entire network. The last block presents techniques that design modular cells which are combined to build the final network.
Classification errors of ENAS and baselines on CIFAR-10. In this table, the first block presents DenseNet, one of the state-ofthe-art architectures designed by human experts. The second block presents approaches that design the entire network. The last block presents techniques that design modular cells which are combined to build the final network.

神经架构搜索研究指南 -1

从训练到用不同的参数做实验,设计神经网络的过程是劳力密集型的,非常具有挑战性,而且常常很麻烦。但是想象一下,如果能够将这个过程实现自动化呢?将这种想象转变为现实,就是本指南的核心内容。

我们将探索一系列的研究论文,这些论文试图解决具有挑战性的自动化神经网络设计任务。在本指南中,我们假设读者尝试过使用 KerasTensorFlow 等框架从头开始设计神经网络。

1. 基于强化学习的神经结构搜索

2016:Neural Architecture Search with Reinforcement Learning

本文利用递归神经网络 (RNN) 生成神经网络的模型描述。为了提高 RNN 在验证集上的精度,作者对 RNN 进行了强化学习训练,该方法在 CIFAR-10 数据集上的错误率为 3.65。

本文提出的神经结构搜索是基于梯度的。本文提出的方法是基于以下考虑:神经网络的结构和连通性可以用变长串来描述。被称为控制器的神经网络用于生成这样的字符串。然后,字符串指定的子网络根据真实数据进行训练,并在验证集上得到初始的准确度度量。然后,使用这个准确度数据计算策略梯度,再用后者更新控制器。因此,具有较高准确度的结构可以得到较高的选中概率。

An overview of Neural Architecture Search
An overview of Neural Architecture Search

神经网络结构搜索中,该控制器用于生成神经网络的结构超参数。在下图中,控制器用于生成一个卷积神经网络。控制器预测滤波器高度、滤波器宽度和步长。预测由 softmax 分类器执行,然后作为输入,输入到下一个时间步。一旦控制器完成了生成结构的过程,带有这个结构的神经网络就会建立起来,并用它进行训练。

How our controller recurrent neural network samples a simple convolutional network. It predicts filter height, filter width, stride height, stride width, and number of filters for one layer and repeats. Every prediction is carried out by a softmax classifier and then fed into the next time step as input.
How our controller recurrent neural network samples a simple convolutional network. It predicts filter height, filter width, stride height, stride width, and number of filters for one layer and repeats. Every prediction is carried out by a softmax classifier and then fed into the next time step as input.

于子网络的训练需要花费数小时的时间,为了加快控制器的学习过程,作者采用了分布式训练和异步参数更新的方法。

 Distributed training for Neural Architecture Search. We use a set of S parameter servers to store and send parameters to K controller replicas. Each controller replica then samples m architectures and run the multiple child models in parallel. The accuracy of each child model is recorded to compute the gradients with respect to θc, which are then sent back to the parameter servers.
Distributed training for Neural Architecture Search. We use a set of S parameter servers to store and send parameters to K controller replicas. Each controller replica then samples m architectures and run the multiple child models in parallel. The accuracy of each child model is recorded to compute the gradients with respect to θc, which are then sent back to the parameter servers.

该模型与其他模型的错误率对比如下:

Performance of Neural Architecture Search and other state-of-the-art models on CIFAR-10
Performance of Neural Architecture Search and other state-of-the-art models on CIFAR-10.

2. 高效结构搜索的层次化表示

ICLR 2018:Hierarchical Representations for Efficient Architecture Search

该网络中提出的算法在 CIFAR-10 上实现了 3.6% 的 top-1 误差,在 ImageNet 上实现了 20.3% 的 top-1 误差。作者提出了一种描述神经网络结构的层次化表示方法,证明了用简单的随机搜索可以得到具有竞争力的图像分类网络结构,并提出了一种可扩展的进化搜索方法变体。

对于平面体系结构表示,他们研究了由单源、单汇聚(single-sink)计算图组成的神经网络体系结构家族,该计算图将源处的输入转换为汇聚处的输出。图中的每个节点都对应一个特征图,每个有向边都和某个操作关联,比如池化操作或者卷积操作。此操作转换输入节点中的特征图,并将其传递给输出节点。

An example of a three-level hierarchical architecture representation.
An example of a three-level hierarchical architecture representation.

对于层次化结构,将在不同层次上有若干个不同的 motifs。在较高层次的 motifs 构建过程中,较低层次的 motifs 被作为构建模组。

A ARCHITECTURE VISUALIZATION
A ARCHITECTURE VISUALIZATION

这是 CIFAR-10 测试集中不同模型的错误率:

 Classification error on the CIFAR-10 test set obtained using state-of-the-art models as well as the best-performing architecture found using the proposed architecture search framework. Existing models are grouped as (from top to bottom): handcrafted architectures, architectures found using reinforcement learning, and architectures found using random or evolutionary search.
Classification error on the CIFAR-10 test set obtained using state-of-the-art models as well as the best-performing architecture found using the proposed architecture search framework. Existing models are grouped as (from top to bottom): handcrafted architectures, architectures found using reinforcement learning, and architectures found using random or evolutionary search.

零基础入门PyTorch深度学习

Pytorch 是 Torch 的 Python 版本,是由 Facebook 开源的神经网络框架,专门针对 GPU 加速的深度神经网络(DNN)编程。Torch 是一个经典的对多维矩阵数据进行操作的张量(Tensor )库,在机器学习和其他数学密集型应用有广泛应用。与 Tensorflow 的静态计算图不同,Pytorch 的计算图是动态的,可以根据计算需要实时改变计算图。

Vipul Vaibhaw 在 Github 开源了一份关于 Pytorch 深度学习的书册,《First steps towards Deep Learning with PyTorch》,这是一本关于深度学习的开源书籍。这本书应该是非数学的,迎合了那些没有深度学习经验,数学知识和兴趣很少的读者。这本书旨在帮助读者迈出深度学习的『第一步』。

主要内容覆盖了:

  1. 理解人工神经网络
  2. PyTorch 介绍
  3. 如何让计算机看见?
  4. 如何让计算机记忆?
  5. 下一步学习

GitHub地址项目 GitHub 地址

TensorFlow 2.0 正式版发布

此前,Google 在 TensorFlow 开发者大会 (TensorFlow Dev Summit) 上发布了 TensorFlow 2.0 的 Alpha 版本。经过近 7 个月的努力,今天,TensorFlow 2.0 正式版现已推出!TensorFlow 2.0 由社区推动,社区的声音让 Google 了解到开发者需求的是一个灵活、强大且易于使用的平台,并且支持部署 TensorFlow 2.0 到任何平台上。TensorFlow 2.0 为开发者、企业与研究人员提供了一个全面的生态系统,以推动最先进的机器学习研究与构建大规模的机器学习应用。—— 同时,跨象乘云™ 也提供了 TensorFlow 2.0 的实战课程

TensorFlow 2.0 让 ML 应用的开发变得更容易。KerasEager Execution 更紧密地结合至  TensorFlow 并成为默认选项,并以原生 Python 的方式执行函数,TensorFlow 2.0 让开发应用的体验变得更接近于原生 Python 开发。对于想要推进机器学习进步的研究人员,Google 在 TensorFlow 底层 API 上投入了大量精力:Google 暴露了内部使用的所有算子 (ops),并且为关键概念(如变量和 checkpoints)提供了可继承的接口。这允许开发者基于 TensorFlow 内部方法进行开发,而不必重新编译 TensorFlow。

TensorFlow 2.0 Training and Deployment
TensorFlow 2.0 Training and Deployment

为了能够在不同运行时环境(如云、Web、浏览器、Node.js、移动端以及嵌入式系统)中运行模型,Google 使用了标准化的文件结构 SavedModel 。让开发者在TensorFlow 中运行模型的同时,可以通过 TensorFlow Serving 部署模型,通过 TensorFlow Lite 部署至移动或嵌入式系统中,并且在浏览器或 Node.js 中使用 TensorFlow.js 训练和运行模型。

对于高性能训练场景,您可以使用 Distribution Strategy API 进行分布训练,修改少量代码并获得出色的开箱即用 (out-of-the-box) 性能。支持使用 Keras Model.fit 进行分布式训练,并支持自定义训练循环 (custom training loops)。此外,现已提供多 GPU 支持

TensorFlow 2.0 在 GPU 性能提升上也作出了很多努力。TensorFlow 2.0 通过使用 Volta 与 Turing GPU 混合精度,仅需几行代码,即可提升 3 倍训练性能(可见ResNet-50 与 BERT 模型的示例)。TensorFlow 2.0 紧密结合了 TensorRT ,通过使用改进的 API,提升了 NVIDIA T4 Cloud GPUs 在谷歌云的可用性与性能。

在使用 TensorFlow 建模时,有效获取训练和验证数据至关重要。为此,Google 引入了  TensorFlow Datasets ,为包含多种数据类型(如图像、文本、视频等)的大量数据集提供了标准接口。

虽然 Google 仍保留了传统的基于会话(Session)的开发模式,但 Google 建议使用基于 Eager Execution 的更接近原生 Python 的开发模式。使用 tf.function 将代码转换为可远程执行、序列化和性能优化的计算图。此外,Autograph 还可以将常规的 Python 控制流直接转换为 TensorFlow 控制流。

当然,如果您使用过 TensorFlow 1.x 并正在寻找 2.0 的迁移指南,Google 也已经在此发布。TensorFlow 2.0 正式版还包含一个自动转换脚本以帮助您入门。

Google 内部及 TensorFlow 社区的许多用户进行了合作,以测试 TensorFlow 2.0 的功能,Google 为收集到的反馈感到高兴:如 Google News 团队在 TensorFlow 2.0 中使用了基于 BERT 的语言理解模型,该模型大大提高了报道的覆盖率。TensorFlow 2.0 提供的灵活且易于使用的 API,可快速将新想法落地。模型培训和服务已无缝集成到现有基础架构中。

此外,ML 不仅适用于 Python 开发者 —— 有了 TensorFlow.js,JavaScript开发者也可以使用 TensorFlow 进行训练和推理,并且我们也持续在 Swift 上进行投入,通过 Swift for TensorFlow 使其作为一种构建模型的语言。

还有很多值得介绍的功能,为了帮助大家快速了解这些新功能,我们为 TensorFlow 2.0 中的所有新功能创建了便捷指南。不仅如此,为了使 TensorFlow 2.0 入门更加容易,我们在还发布了使用2.0 API 的几种常用 ML 模型的参考实现。

快速上手:请尝试使用 Google Cloud’s Deep Learning VM Images —— 无需进行设置,预先配置的虚拟机即可帮助您构建 TensorFlow 2.0 深度学习项目。

DeepFashion:服装公开数据集

Large-scale Fashion (DeepFashion) Database
Large-scale Fashion (DeepFashion) Database

DeepFashion 是香港中文大学开放的一个 large-scale 数据集。包含 80 万张图片,包含不同角度,不同场景,买家秀,买家秀等图片。

每张图片也有非常丰富的标注信息,包括 50 种类别,1000 种属性,Bbox,特征点。

还有约 30 万的不同姿势/不同场景的图片 pairs。

实际上 DeepFashion 是由4个子集组成的。它们分别是:

1. Category and Attribute Prediction Benchmark

这个子集是用来做分类和属性预测的。共有 50 分类标记,1000 属性标记。包含 289,222 张图像。每张图像都有 1 个类别标注,1000 个属性标注,Bbox 边框,landmarks。数据集下载后可以直接使用。

 Category and Attribute Prediction Benchmark
Category and Attribute Prediction Benchmark

2. In-shop Clothes Retrieval Benchmark

这个是卖家秀图片集,每个商品 id,有多张不同角度的卖家秀,放在同一个文件夹内。7982 件商品,共 52712 张图像,每张图片都有 463 中属性,Bbox,landmarks,以及店铺描述。数据集下载后解压需要密码,密码需要邮件联系作者获取。

In-shop Clothes Retrieval Benchmark
In-shop Clothes Retrieval Benchmark

3. Consumer-to-shop Clothes Retrieval Benchmark

这个子集是卖家秀买家秀对应的数据集,每个商品id对应的文件夹中包含一张卖家秀和几张买家秀。33 881 种商品,共 239 557 张图片。每张图片都有 Bbox,303 种属性,以及来源说明(卖家,买家)。数据集解压同样需要密码。

Consumer-to-shop Clothes Retrieval Benchmark
Consumer-to-shop Clothes Retrieval Benchmark

4. Fashion Landmark Detection Benchmark:

这个子集主要是做 landmark和 Bbox 用的,包含 123 016 张图片,每张图片都有 landmarks 和 Bbox 的标记,还有类别标注(上衣,下装,全身),以及姿态(正常姿势,大幅度姿势等)信息。数据集可直接使用。

Fashion Landmark Detection Benchmark
Fashion Landmark Detection Benchmark

TensorFlow 2.0 实战教程

这是一份来自 IJCAI 2019上的一个 TensorFlow 2.0 实操教程,这个教程包含 117 页 PPT,由 Google 资深开发人员 Josh Gordon 讲授,提供了最新 TensorFlow 2.0 的实操介绍,重点介绍了最佳实践。读者将学习编写几种类型的神经网络(Dense, Convolutional, 和 Recurrent),以及生成对抗网络(Generative Adversarial Network)。

Hands on TensorFlow 2.0
Hands on TensorFlow 2.0

TensorFlow 是一个基于数据流编程(Dataflow Programming)的符号数学系统,被广泛应用于各类机器学习(Machine Learning)算法的编程实现,其前身是谷歌的神经网络算法库 DistBelief。

Tensorflow 拥有多层级结构,可部署于各类服务器、PC 终端和网页并支持 GPU 和 TPU 高性能数值计算,被广泛应用于谷歌内部的产品开发和各领域的科学研究。

如果你想学习新发布的 TensorFlow 2.0 版本,那么本教程非常适合您。不过您需要事先熟悉一些基本的机器学习知识。该教程将介绍深度学习中的关键概念。本教程的目标是帮助您高效地开始使用 TensorFlow,这样您就可以继续自学了。

《Hands on TensorFlow 2.0》教程下载

《动手学深度学习》PyTorch 版

我们知道,作为 MXNet 的作者之一,李沐的这本《动手学深度学习》也是使用 MXNet 框架写成的。但是很多入坑机器学习的萌新们,使用的却是 PyTorch。如果有教材对应的 PyTorch 实现代码就更好了!今天就给大家带来这本书的 PyTorch 实现源码。最近,来自印度理工学院的数据科学小组,把《动手学深度学习》从 MXNet 『翻译』成了 PyTorch,经过 3 个月的努力,这个项目已经基本完成,并登上了 GitHub 热榜。

d2l-pytorch
d2l-pytorch

其中,每一小节都是可以运行的 Jupyter 记事本,你可以自由修改代码和超参数来获取及时反馈,从而积累深度学习的实战经验。

GitHub地址项目 GitHub 地址

滴滴开源的 AoE:工程实践中的图像处理

近期,滴滴开源了 AOE 项目,很多人还是一脸懵逼,不太清楚 AOE 到底是干什么的,所以今天我们再来听听官方工程师是怎么介绍的吧,不信你还是听不懂:近期我们开发了一个银行卡 OCR 项目。需求是用手机对着银行卡拍摄以后,通过推理,可以识别出卡片上的卡号。

工程开发过程中,我们发现手机拍摄以后的图像,并不能满足模型的输入要求。以 Android 为例,从摄像头获取到的预览图像是带 90 度旋转的 NV21 格式的图片,而我们的模型要求的输入,只需要卡片区域这一块的图像,并且需要转成固定尺寸的 BGR 格式。所以在图像输入到模型之前,我们需要对采集到的图像做图像处理,如下图所示:

OCR 案例
OCR 案例

在开发的过程中,我们对 YUV 图像格式和 libyuv 进行了研究,也积累了一些经验。下文我们结合银行卡 OCR 项目,讲一讲里面涉及到的一些基础知识:

  1. 什么是YUV格式
  2. 如何对YUV图像进行裁剪
  3. 如何对YUV图像进行旋转
  4. 图像处理中的Stride
  5. 如何进行缩放和格式转换
  6. libyuv的使用

想要对采集到的 YUV 格式的图像进行处理,首先我们需要了解什么是 YUV 格式。

什么是 YUV 格式

YUV 是一种颜色编码方法,YUV,分为三个分量:

  • 『Y』 表示明亮度(Luminance 或 Luma),也就是灰度值;
  • 『U』和『V』 表示的则是色度(Chrominance 或 Chroma)。
  • 主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。

这部分专业的知识,网络上有详细的解释。我们简单理解一下,RGB 和 YUV 都使用三个值来描述一个像素点,只是这三个值的意义不同。通过固定的公式,我们可以对 RGB 和 YUV 进行相互转换。工程里常见的 I420,NV21,NV12,都是属于 YUV420,每四个 Y 共用一组 UV 分量。YUV420 主要包含两种格式,YUV420SP 和 YUV420P。

  • YUV420SP,先排列Y分量,UV分量交替排列,例如:NV12: YYYYYYYY UVUV 和 NV21: YYYYYYYY VUVU (上文中我们在安卓上采集到的图像就是这种格式)。

    YUV420SP
    YUV420SP
  • YUV420P,先排列U(或者V)分量,再排列V(或者U)分量。例如:I420: YYYYYYYY UU VV 和 YV12: YYYYYYYY VV UU。

    YUV420P
    YUV420P

了解了 YUV 的图像格式以后,我们就可以尝试对图片进行裁剪和旋转了。我们的想法是先在图片上裁剪出银行卡的区域,再进行一次旋转。

对图片进行裁剪和旋转
对图片进行裁剪和旋转

如何对 YUV 图像进行裁剪

YUV420SP 和 YUV420P 裁剪的过程类似,以 YUV420SP 为例,我们要裁剪图中的这块区域:

YUV420SP
YUV420SP

在图上看起来就非常明显了,只要找到裁剪区域对应的 Y 分量和 UV 分量,按行拷贝到目标空间里就可以了。

我们再来看一张图,是否可以用上面的方法来裁剪图中的这块区域呢?

答案是否定的,如果你按照上面说的方法来操作,最后你会发现你保存出来的图,颜色基本是不对的,甚至会有内存错误。原因很简单,仔细观察一下,当 ClipLeft 或者 ClipTop 是奇数的时候,会导致拷贝的时候 UV 分量错乱。如果把错误的图像数据输入到模型里面,肯定是得不到我们期望的结果的。所以我们在做裁剪的时候,需要规避掉奇数的场景,否则你会遇到意想不到的结果。

如何对 YUV 图像进行旋转?

对上文裁剪后的图像做顺时针 90 度旋转,相比裁剪,转换要稍微复杂一些。

基本方法是一样的,拷贝对应的 Y 分量和 UV 分量到目标空间里。

在了解了裁剪和旋转的方法以后,我们发现在学习的过程中不可避免地遇到了 Stride 这个词。那它在图像中的作用是什么呢?

图像处理中的 Stride

Stride 是非常重要的一个概念,Stride 指在内存中每行像素所占的空间,它是一个大于等于图像宽度的内存对齐的长度。如下图所示:

Stride 是非常重要的一个概念
Stride 是非常重要的一个概念

回过头来看我们上面说到的裁剪和旋转,是否有什么问题?以 Android 上的 YV12 为例,Google Doc 里是这样描述的:

YV12 is a 4:2:0 YCrCb planar format comprised of a WxH Y plane followed by (W/2) x (H/2) Cr and Cb planes.

This format assumes
• an even width
• an even height
• a horizontal stride multiple of 16 pixels
• a vertical stride equal to the height

y_size = stride * height
c_stride = ALIGN(stride / 2, 16)
c_size = c_stride * height / 2
size = y_size + c_size * 2
cr_offset = y_size
cb_offize = y_size + c_size

所以在不同的平台和设备上,需要按照文档和 stride 来进行计算。例如计算 Buffer 的大小,很多文章都是简单的 “*3/2” ,仔细考虑一下,这其实是有问题的。如果不考虑 stride ,会有带来什么后果?如果 “运气” 足够好,一切看起来很正常。“运气”不够好,你会发现很多奇怪的问题,例如花屏,绿条纹,内存错误等等。这和我们平常工作中遇到的很多的奇怪问题一样,实际上背后都是有深层次的原因的。

经过裁剪和旋转,我们只需要把图像缩放成模型需要的尺寸,转成模型需要的 BGR 格式就可以了。

如何进行缩放和格式转换

以缩放为例,有临近插值,线性插值,立方插值,兰索斯插值等算法。YUV 和 RGB 之间的转换,转换的公式也有很多种,例如量化和非量化。这些涉及到专业的知识,需要大量的时间去学习和理解。

这么多的转换,我们是否都要自己去实现?

很多优秀的开源项目已经提供了完善的 API 给我们调用,例如 OpenCV,libyuv 等。我们需要做的是理解基本的原理,站在别人的肩膀上,做到心里有数,这样即使遇到问题,也能很快地定位解决。

经过调查和比较,我们选择了 libyuv 来做图像处理的库。libyuv 是 Google 开源的实现各种 YUV 与 RGB 之间相互转换、旋转、缩放的库。它是跨平台的,可在 Windows、Linux、Mac、Android 等操作系统,x86、x64、arm 架构上进行编译运行,支持 SSE、AVX、NEON等SIMD 指令加速。

libyuv 的使用

引入 libyuv 以后,我们只需要调用 libyuv 提供的相关 API 就可以了。在银行卡 OCR 工程使用的过程中,我们主要遇到了 2 个问题:

  1. 在Android开发的初期,我们发现识别率和我们的期望存在一定的差距。我们怀疑是模型的输入数据有问题,通过排查发现是使用libyuv的时候,没注意到它是little endian。例如这个方法:int BGRAToARGB(…),BGRA little endian,在内存里顺序实际是ARGB。所以在使用的时候需要弄清楚你的数据在内存里是什么顺序的,修改这个问题后识别率达到了我们的预期。
  2. 在大部分机型上运行正常,但在部分机型上出现了 Native 层的内存异常。

通过多次定位,最后发现是 stride 和 buffersize 的计算错误引起的。由于 libyuv 是 C/C++ 实现的,使用的时候不是那么的便捷。为了提高开发效率,我们提取了一个 AoeVision 组件,对libyuv封装了一层 JNI 接口,包括了一些基础的转换和一些 Sample,这样使用起来更加简单方便,AoeVision组件还在不断开发和完善中。

GitHub地址项目 GitHub 地址

计算机科学 (CS) 顶会历届最佳论文列表

历届最佳论文大列表,从 1996 年至 2018 年都包含了。机器学习、深度学习前沿 Paper 都能找得到!这些『顶会』包括:

AAAI, ACL, CHI, CIKM, CVPR, FOCS, FSE, ICCV, ICML, ICSE, IJCAI, INFOCOM, KDD, MOBICOM, NSDI, OSDI, PLDI, PODS, S&P, SIGCOMM, SIGIR, SIGMETRICS, SIGMOD, SODA, SOSP, STOC, UIST, VLDB, WWW

这个网页上,按照不同顶会,列举了各个年份的最佳 CS 论文,论文源地址和作者信息都有了!几个 AI 领域的代表性顶会最佳论文资源包括:

  •  AAAI (Artificial Intelligence)
  •  ACL (Natural Language Processing)
  • CVPR (Computer Vision)
  • ICCV (Computer Vision)
  • ICML (Machine Learning)
  • IJCAI (Artificial Intelligence)

以上是人工智能领域具有代表性的几个顶会,相应的最佳论文都按照不同年份列举出来了,非常便于查找和定位。除此之外,还包括其他 CS 顶会的最佳论文。

Google 发布姿势估测应用

Google 日前发布一款 TensorFlow Lite 示例应用,该应用使用 PoseNet 模型在 Android 中实现人体姿势估测。PoseNet 是一种视觉模块,通过检测人体关键部位的位置,来估测图像或视频中的人体姿势。例如,该模型可以估测图像中人物手肘和膝盖的所在位置。姿势估测模型只会识别人体关键部位的位置,而不会去辨别图像中的人物。TensorFlow Lite 现与您分享这款 Android 示例应用,该应用可利用设备的相机实时检测和显示个人的关键身体部位。

使用 PoseNet 模型在 Android 中实现人体姿势估测
使用 PoseNet 模型在 Android 中实现人体姿势估测

PoseNet 应用前景

姿势估测存在多种用途。例如,开发者可根据人体图像增强现实、制作计算机图形人物动画以及为运动中的运动员分析步态。在 Google I/O 2019 大会上,TensorFlow Lite 展示了使用 PoseNet 模块帮助用户学习舞蹈的应用 Dance Like。借助这款示例应用,应用开发者和机器学习专家能够更轻松地探索轻量级移动模型的各种可能性。

PoseNet 示例应用

不同于用 Java 编写的现有 Andriod 应用,PoseNet 示例应用的开发采用 Kotlin 语言。开发此应用旨在让所有人都能以低成本轻松使用 PoseNet 模型。示例应用包含可消除模型复杂性的 PoseNet 库。下图展示应用、PoseNet 库 和 TensorFlow Lite 库之间的工作流。

PoseNet 应用工作流
PoseNet 应用工作流

PoseNet 库

PoseNet 库提供了一个接口,通过该接口接收经处理的相机图像,并返回人体关键部位所在位置的相关信息。此功能由 estimateSinglePose() 函数提供,该函数会在经处理的 RGB 位图上运行 TensorFlow Lite 解释器并返回 Person 对象。了解 PoseNet 输入和输出的含义

PoseNet 示例应用

PoseNet 示例应用是一种设备端相机应用,该应用可通过相机捕获帧,并实时覆盖图像上的关键点。针对每张传入的相机图像,该应用均会执行以下步骤:

  1. 从相机预览中捕获图像数据,并将其格式从 YUV_420_888 转换为 ARGB_888。
  2. 创建 Bitmap 对象,以保存 RGB 格式帧数据的像素。将 Bitmap 裁剪并缩放至可输入模块的尺寸,从而将其传入模块。
  3. 调用 PoseNet 库的 estimateSinglePose () 函数,以获取 Person 对象。
  4. 将 Bitmap 重新缩放至屏幕尺寸。在 Canvas 对象上绘制新 Bitmap。
  5. 使用通过 Person 对象获取的关键点位置,在画布上绘制骨架。显示可信度高于特定阈值(默认为 0.2)的关键点。

为使姿势渲染与相机帧同步,我们对输出显示使用单个 SurfaceView,而非分别对姿势与相机使用 View 实例。SurfaceView 会在 View 画布上进行捕获、锁定和绘制,从而确保在屏幕上实时显示画面。

发展蓝图

我们希望未来能为此示例应用开发更多功能,其中包括:

  • 多姿势估测
  • 使用 GPU 代理实现 GPU 加速
  • 使用 NNAPI 代理实现 NNAPI 加速
  • 使用模型的训练后量化降低延迟
  • 更多模型选项,例如 ResNet PoseNet 模型

GitHub地址项目 GitHub 地址

TensorFlow VS. PyTorch V2

此前,跨象乘云™ 发布过《TensorFlow VS. PyTorch》 —— 谷歌的 Tensorflow 与 Facebook 的 PyTorch 一直是颇受社区欢迎的两种深度学习框架。那么究竟哪种框架最适宜自己手边的深度学习项目呢?本文作者从这两种框架各自的功能效果、优缺点以及安装、版本更新等诸多方面给出了自己的建议。如果你在读这篇文章,那么你可能已经开始了自己的深度学习之旅。如果你对这一领域还不是很熟悉,那么简单来说,深度学习使用了「人工神经网络」,这是一种类似大脑的特殊架构,这个领域的发展目标是开发出能解决真实世界问题的类人计算机。为了帮助开发这些架构,谷歌、Facebook 和 Uber 等科技巨头已经为 Python 深度学习环境发布了多款框架,这让人们可以更轻松地学习、构建和训练不同类型的神经网络。本文将详细介绍和比较两种流行的框架: TensorFlow 与 PyTorch。

谷歌的 TensorFlow

TensorFlow 是谷歌的开发者创造的一款开源的深度学习框架,于 2015 年发布。官方研究发布于论文《TensorFlow:异构分布式系统上的大规模机器学习》。TensorFlow 现已被公司、企业与创业公司广泛用于自动化工作任务和开发新系统,其在分布式训练支持、可扩展的生产和部署选项、多种设备(比如安卓)支持方面备受好评。

Facebook 的 PyTorch

PyTorch 是最新的深度学习框架之一,由 Facebook 的团队开发,并于 2017 年在 GitHub 上开源。有关其开发的更多信息请参阅论文《PyTorch 中的自动微分》。PyTorch 很简洁、易于使用、支持动态计算图而且内存使用很高效,因此越来越受欢迎。接下来还会更详细地介绍。

我们可以用 TensorFlow 和 PyTorch 构建什么?

神经网络起初是被用于解决手写数字识别或用相机识别汽车注册车牌等简单的分类问题。但随着近来框架的发展以及英伟达高计算性能图形处理单元(GPU)的进步,我们可以在 TB 级的数据上训练神经网络并求解远远更加复杂的问题。一个值得提及的成就是在 TensorFlow 和 PyTorch 中实现的卷积神经网络在 ImageNet 上都达到了当前最佳的表现。训练后的模型可以用在不同的应用中,比如目标检测、图像语义分割等等。

尽管神经网络架构可以基于任何框架实现,但结果却并不一样。训练过程有大量参数都与框架息息相关。举个例子,如果你在 PyTorch 上训练一个数据集,那么你可以使用 GPU 来增强其训练过程,因为它们运行在 CUDA(一种 C++ 后端)上。TensorFlow 也能使用 GPU,但它使用的是自己内置的 GPU 加速。因此,根据你所选框架的不同,训练模型的时间也总是各不相同。

TensorFlow 顶级项目

  • Magenta:一个探索将机器学习用作创造过程的工具的开源研究项目
  • Sonnet:这是一个基于 TensorFlow 的软件库,可用于构建复杂的神经网络
  • Ludwig:这是一个无需写代码就能训练和测试深度学习模型的工具箱

PyTorch 顶级项目

  • CheXNet:使用深度学习来分析胸部 X 光照片,能实现放射科医生水平的肺炎监测
  • PYRO:这是一种用 Python 编写的通用概率编程语言(PPL),后端由 PyTorch 支持
  • Horizon:一个用于应用强化学习(Applied RL)的平台

这些只是基于 TensorFlow 和 PyTorch 构建的少量框架和项目。你能在 TensorFlow 和 PyTorch 的 GitHub 和官网上找到更多。

PyTorch 和 TensorFlow 对比

PyTorch 和 TensorFlow 的关键差异是它们执行代码的方式。这两个框架都基于基础数据类型张量(tensor)而工作。你可以将张量看作是下图所示的多维数组。

多维数组
多维数组

机制:动态图定义与静态图定义

TensorFlow 框架由两个核心构建模块组成:

  • 一个用于定义计算图以及在各种不同硬件上执行这些图的运行时间的软件库。
  • 一个具有许多优点的计算图(后面很快就会介绍这些优点)。

计算图是一种将计算描述成有向图的抽象方式。图是一种由节点(顶点)和边构成的数据结构,是由有向的边成对连接的顶点的集合。

当你在 TensorFlow 中运行代码时,计算图是以静态方式定义的。与外部世界的所有通信都是通过 tf.Sessionobject 和 tf.Placeholder 执行,它们是在运行时会被外部数据替换的张量。例如,看看以下代码段:

近期 Keras 被合并到了 TensorFlow 库中,这是一个使用 TensorFlow 作为后端的神经网络框架。从那时起,在 TensorFlow 中声明层的句法就与 Keras 的句法类似了。首先,我们声明变量并将其分配给我们将要声明的架构类型,这里的例子是一个 Sequential() 架构。

接下来,我们使用 model.add() 方法以序列方式直接添加层。层的类型可以从 tf.layers 导入,如下代码片段所示:

TensorFlow 和 PyTorch 的优缺点

TensorFlow 和 PyTorch 各有其优缺点。

TensorFlow 的优点:

  • 简单的内置高级 API
  • 使用 TensorBoard 可视化训练
  • 通过 TensorFlow serving 容易实现生产部署
  • 很容易的移动平台支持
  • 开源
  • 良好的文档和社区支持

TensorFlow 的缺点:

  • 静态图
  • 调试方法
  • 难以快速修改

PyTorch 的优点

  • 类 Python 的代码
  • 动态图
  • 轻松快速的编辑
  • 良好的文档和社区支持
  • 开源
  • 很多项目都使用 PyTorch

PyTorch 的缺点:

  • 可视化需要第三方
  • 生产部署需要 API 服务器

TensorFlow 还是 PyTorch?

PyTorch 和 TensorFlow 近期都发布了新版本:PyTorch 1.0(首个稳定版)和 TensorFlow 2.0(beta 测试版)。这两个版本都有重大的更新和新功能,让训练过程更高效、流畅和强大。

如果你要在自己的机器上安装这些框架的最新版,你可以用源代码 build 或通过 pip 安装。

TensorFlow 是一种非常强大和成熟的深度学习库,具有很强的可视化功能和多个用于高级模型开发的选项。它有面向生产部署的选项,并且支持移动平台。另一方面,PyTorch 框架还很年轻,拥有更强的社区动员,而且它对 Python 友好。

建议是:如果你想更快速地开发和构建 AI 相关产品,TensorFlow 是很好的选择。建议研究型开发者使用 PyTorch,因为它支持快速和动态的训练。