共计 4410 个字符,预计需要花费 12 分钟才能阅读完成。
作者 |Orhan Gazi Yalçın
编译 |VK
起源 |Towards Datas Science
如果你看看不同的教程,搜寻,花大量工夫钻研对于 TensorFlow 的 Stack Overflow,你可能曾经意识到有很多不同的办法来构建神经网络模型。
这始终是 TensorFlow 面临的问题。这就像是 TensorFlow 试图找到通往光明的深度学习环境的路线。因为 TensorFlow 是目前市场上最成熟的深度学习库,这基本上是你能失去的最好的。
Keras-TensorFlow 的关系
背景
TensorFlow 倒退成为一个深度学习平台并不是一夜之间产生的。最后,TensorFlow 将本人采购为一个符号数学库,用于跨一系列工作的数据流编程。因而,TensorFlow 最后提供的主张并不是一个纯正的机器学习库。指标是创立一个高效的数学库,以便在这种高效构造上构建的自定义机器学习算法可能在短时间内以高精度进行训练。
然而,用低级 api 反复地从头构建模型并不是很现实。因而,谷歌的工程师弗兰•库伊斯 - 克里特开发了 Keras,作为一个独立的高层次的深度学习库。尽管 Keras 曾经可能运行在不同的库之上,比方 TensorFlow, Microsoft Cognitive Toolkit, Theano 或 PlaidML,然而 TensorFlow 过来和当初依然是人们应用 Keras 的最常见的库。
现状
在看到了模型构建过程中的凌乱之后,TensorFlow 团队发表 Keras 将成为在 tensorflow2.0 中构建和训练模型的外围高级 API。另一种高级 API,Estimator api
Estimator API 和 Keras API
当初,让咱们回到问题上来:有很多不同的办法,人们应用 TensorFlow 来构建他们的模型。这个问题的次要起因是 TensorFlow 未能采纳繁多模型 API。
在 1.x 版本中,对于生产级我的项目,模型构建 API 是 Estimator API。然而,随着最近的变动,keras api 简直赶上了 Estimator API。最后,Estimator API 具备更高的可伸缩性,容许分布式,并且具备不便的跨平台性能。然而,当初 Estimator API 的大部分长处都已被打消,因而,很快 Keras API 将很可能成为构建 TensorFlow 模型的唯一标准 API。
因而,在本文中,咱们将只关注在 TensorFlow 中构建模型的 Keras API 办法,其中有三种:
- 应用 Sequential API
- 应用 Functional API
- 模型子类化
我将间接将它们与相应的模型构建代码进行比拟,这样你就能够理论测试它们了。让咱们深入研究编码。
进行比拟的初始代码
为了测试这三种 Keras 办法,咱们须要抉择一个深度学习问题。利用 MNIST 进行图像分类是一个非常简单的工作。咱们试图实现的是利用驰名的 MNIST 数据集训练一个辨认手写数字的模型。
MNIST 数据集(MNIST dataset)是一个大型手写数字数据库,通常用于训练各种图像处理零碎。MNIST 数据库蕴含 6 万张训练图片和 1 万张测试图片,这些图片来自美国人口普查局员工和美国高中生。如果你想遵循残缺的教程,你能够找到我的对于图像分类的独自教程:
https://towardsdatascience.co…
通过上面的代码,咱们将导入所有层和模型,这样在接下来的局部中就不会打搅咱们了。咱们还下载 MNIST 数据集并对其进行预处理,以便它能够用于咱们将应用这三种不同办法构建的所有模型。只需运行以下代码:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras import Input
from tensorflow.keras import Model
from tensorflow.estimator import DNNClassifier
from tensorflow.keras.datasets.mnist import load_data
(x_train, y_train), (x_test, y_test)= load_data(path="mnist.npz")
# 确保这些值是浮点数,这样除法后就能够失去小数点
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
# 通过将 RGB 代码除以最大 RGB 值来规范化
x_train /= 255
x_test /= 255
当初,这一部分曾经完结,让咱们集中探讨构建张量流模型的三种办法。
构建 Keras 模型的 3 种办法
有三种办法能够在 TensorFlow 中构建 Keras 模型:
- Sequential API:当你试图应用单个输出、输入和层分支构建简略模型时,Sequential API 是最好的办法。对于想疾速学习的老手来说,这是一个很好的抉择。
- Functional API:函数 API 是构建 Keras 模型最风行的办法。它能够实现 Sequential API 所能做的所有。此外,它容许多个输出、多个输入、分支和层共享。它是一种简洁易用的办法,并且依然容许很好的定制灵活性。
- 模型子类化:模型子类化是为须要齐全管制模型、层和训练过程的高级开发人员设计的。你须要创立一个定义模型的自定义类,而且你可能不须要它来执行日常工作。然而,如果你是一个有试验需要的钻研人员,那么模型子类化可能是最好的抉择,因为它会给你所有你须要的灵活性。
让咱们看看这些办法是如何实现的。咱们将建设一个具备繁多平坦层的根本前馈神经网络,将二维图像阵列转换为一维阵列和两个全连贯层。
Sequential API
在 Sequential API 中,咱们须要 tf.keras.Models 模块。咱们能够简略地将上面的所有层作为一个独自的层来传递。如你所见,这很简略。
model = Sequential([Flatten(input_shape=(28, 28)),
Dense(256,'relu'),
Dense(10, "softmax"),
])
Functional API
对于 Functional API,咱们须要独自定义咱们的输出。而后,咱们须要创立一个输入对象,同时创立所有层,这些层互相关联并与输入相关联。最初,咱们创立一个承受输出和输入作为参数的模型对象。代码依然十分洁净,然而咱们在 Functional API 中有了更大的灵活性。
inputs = Input(shape=(28, 28))
x = Flatten()(inputs)
x = Dense(256, "relu")(x)
outputs = Dense(10, "softmax")(x)
model = Model(inputs=inputs, outputs=outputs, name="mnist_model")
模型子类化
让咱们持续探讨模型子类化。在模型子类化中,咱们从创立一个扩大类基于 tf.keras.Model。模型子类化有两个要害性能:
__init__
函数充当构造函数。多亏了__init__
,咱们能够初始化模型的属性(例如,layer)。super 调用父构造函数(tf.keras.Model 中的构造函数)self 用于援用实例属性。- call function 是在定义层之后定义操作的中央。
为了应用模型子类化来构建同一个模型,咱们须要编写更多的代码,如下所示:
class CustomModel(tf.keras.Model):
def __init__(self, **kwargs):
super(CustomModel, self).__init__(**kwargs)
self.layer_1 = Flatten()
self.layer_2 = Dense(256, "relu")
self.layer_3 = Dense(10, "softmax")
def call(self, inputs):
x = self.layer_1(inputs)
x = self.layer_2(x)
x = self.layer_3(x)
return x
model = CustomModel(name='mnist_model')
结尾代码
当初你能够用三种不同的办法创立同一个模型,你能够抉择其中任何一个,构建模型,并运行上面的代码。
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x=x_train,y=y_train, epochs=10)
model.evaluate(x_test, y_test)
下面的行负责模型配置、训练和评估。当咱们比拟这三种办法的性能时,咱们发现它们十分靠近,但略有不同。
Method | Sequential API | Functional API | Model Subclassing |
---|---|---|---|
Loss | 0.08746038377285004 | 0.08131594955921173 | 0.0781003013253212 |
Accuracy | 97.82% | 98.06% | 98.20% |
咱们更简单的模型子类化办法优于 Sequential API 和 Functional API。这表明,这些办法在低端的设计上也有细微差别。然而,这些差别能够忽略不计。
最终评估
当初,你曾经理解了这三种 Keras 办法之间的异同。然而,让咱们用一个表格来总结一下:
Feature | Sequential API | Functional API | Model Subclassing |
---|---|---|---|
Customization | Low | Medium | High |
Difficulty to Build | Easy | Medium | Difficult |
Layer Sharing | No | Yes | Yes |
Multiple Branch | No | Yes | Yes |
Multiple Input | No | Yes | Yes |
Multiple Output | No | Yes | Yes |
Best Suited For | Beginners | Professionals | Resarchers |
总之,如果你刚刚起步,请保持应用 Sequential API。在深入研究更简单的模型时,请尝试 Functional API。如果你正在攻读博士学位,或者只是喜爱进行独立钻研,试试模型子类化。如果你是专业人士,请保持应用 Functional API。它可能会满足你的须要。
原文链接:https://towardsdatascience.co…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/