关于人工智能:用Keras构建神经网络的3种方法

作者|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/

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据