TensorFlow正准备发布2.0版本 。 在本文中,我们希望预览TensorFlow的高级API标题的方向,并回答一些常见问题。
Keras是一个非常受欢迎的高级API,用于构建和培训深度学习模型。 它用于快速原型设计,最先进的研究和生产。 虽然TensorFlow今天支持Keras,但是我们将Keras更紧密地集成到TensorFlow平台的其余部分。
通过将Keras建立为TensorFlow的高级API,我们使新的机器学习开发人员更容易开始使用TensorFlow。 单一的高级API可以减少混淆,使我们能够专注于为研究人员提供高级功能。
我们希望您能像我们一样喜欢使用它!
Keras有几个关键优势:
- 用户友好: Keras具有针对常见用例优化的简单,一致的界面。 它为用户错误提供清晰且可操作的反馈,并且通常提供有用的建议,易于理解错误消息。
- 模块化和可组合: Keras模型是通过将可配置的构建块连接在一起而制定的,几乎没有限制。 Keras的部分内容可以重复使用,而无需采用甚至不了解框架提供的所有内容。 例如,您可以使用图层或优化程序而无需使用Keras
Model
进行培训。 - 易于扩展:您可以编写自定义构建块来表达研究的新想法,包括新层,损失函数和[在此插入您的想法]以开发最先进的想法。
- 对于初学者和专家:深度学习开发人员来自许多背景和经验水平,而Keras提供有用的API,无论您刚刚开始,还是您有多年的经验。
从学习ML到研究,应用程序开发到部署,这些工作流程可以在更广泛的用例中实现更轻松,更高效的工作流程。
首先,我们将回答几个问题。 接下来,我们将仔细研究TensorFlow附带的Keras版本使您能够做到的事情。
常问问题
我以为Keras是一个单独的图书馆?
最重要的是,Keras是一个API规范。 Keras的参考实现是作为独立的开源项目维护的,您可以在www.keras.io上找到它 。 该项目独立于TensorFlow,并拥有一个活跃的贡献者和用户社区。 TensorFlow包含Keras API的完整实现(在tf.keras模块中),具有TensorFlow特定的增强功能。
Keras只是TensorFlow或其他库的包装器吗?
不,这是一个常见的(但可以理解的)错误观念。 Keras是用于定义和训练机器学习模型的API标准 。 Keras与特定实现无关:Keras API具有TensorFlow,MXNet,TypeScript,JavaScript,CNTK,Theano,PlaidML,Scala,CoreML和其他库的实现。
内置于TensorFlow的Keras版本与我在keras.io上可以找到的版本有什么区别?
TensorFlow包含Keras API(在tf.keras模块中)的实现,具有TensorFlow特定的增强功能。 这些包括支持热切执行直观调试和快速迭代,支持TensorFlow SavedModel模型交换格式,以及对分布式培训的集成支持,包括TPU培训。
使用tf.keras 模型子类 API时,急切执行特别有用。 这个API的灵感来自Chainer ,使您能够强制性地编写模型的正向传递。 tf.keras紧密集成到TensorFlow生态系统中,还包括对以下内容的支持:
- tf.data ,使您能够构建高性能输入管道。 如果您愿意,可以使用NumPy格式的数据训练模型,或使用tf.data进行缩放和性能训练。
- 分发策略 ,用于在各种计算配置中分发培训,包括分布在许多计算机上的GPU和TPU。
- 导出模型。 使用tf.keras API创建的模型可以使用TensorFlow SavedModel格式进行序列化,并使用TensorFlow Serving或其他语言绑定(Java,Go,Rust,C#等)提供。
- 导出的模型可以使用TensorFlow Lite部署在移动和嵌入式设备上,也可以与TensorFlow.js一起使用 (注意:您也可以使用相同的Keras API直接在JavaScript中开发模型)。
- 功能列 ,用于有效地表示和分类结构化数据。
- 还有更多的工作。
我该如何安装tf.keras? 我还需要通过pip安装Keras吗?
tf.keras包含在TensorFlow中。 您无需单独安装Keras。 例如,如果在Colab笔记本中运行:
!pip install tensorflow
导入张量流为tf
Dense = tf.keras.layers.Dense
您现在将使用tf.keras。 如果您不熟悉导入,可以查看一些最近的教程以获取示例。
您提到TensorFlow为初学者和专家提供不同的API样式。 这些看起来怎么样?
TensorFlow开发人员拥有许多经验水平(从第一次学习ML的学生到ML专家和研究人员)。 同样,TensorFlow的优势之一是它提供了几个API来支持不同的工作流程和目标。 同样,这是TensorFlow Keras集成的主要设计目标,用户可以选择Keras的一部分,而不必采用整个框架。
Sequential API
如果您是学生学习ML,我们建议您开始使用tf.keras Sequential API 。 它直观,简洁,适用于实践中95%的ML问题。 使用此API,您可以在大约10行代码中编写第一个神经网络。
点击 此处 查看仅用几行代码训练您的第一个神经网络的示例。
定义模型的最常用方法是构建图层图,这与我们考虑深度学习时通常使用的心理模型相对应。 最简单的模型类型是一堆层。 您可以使用Sequential API定义这样的模型,如下所示:
model = tf.keras.Sequential()
model.add(layers.Dense(64,activation ='relu'))
model.add(layers.Dense(64,activation ='relu'))
model.add(layers.Dense(10,activation ='softmax'))
然后可以在几行中编译和训练这样的模型:
model.compile(优化= '亚当', 损失= 'sparse_categorical_crossentropy', 度量= [ '准确性'])
model.fit(x_train,y_train,epochs = 5)
model.evaluate(x_test,y_test)
您可以在“学习和使用ML”部分的tensorflow.org/tutorials上找到更多使用Sequential API的示例。
单击 此处 获取教程,该教程将引导您使用Sequential API在Fashion MNIST数据集上训练您的第一个神经网络。
功能API
当然,顺序模型是一个简单的图层堆栈,不能代表任意模型。 可以使用Functional API构建更高级的模型,这使您可以定义复杂的拓扑,包括多输入和多输出模型,具有共享层的模型以及具有剩余连接的模型。
在使用功能API构建模型时,图层可以调用(在张量上),并返回张量作为输出。 然后可以使用这些输入张量和输出张量来定义模型。 例如:
inputs = tf.keras.Input(shape =(32,))
#一个层实例可以在张量上调用,并返回一个张量。
x = layers.Dense(64,activation ='relu')(输入)
x = layers.Dense(64,activation ='relu')(x)
predictions = layers.Dense(10,activation ='softmax')(x)
#实例化给定输入和输出的模型。
model = tf.keras.Model(inputs = inputs,outputs = predictions)
可以使用上面相同的简单命令来编译和训练这样的模型。 您可以在此处了解有关Functional API的更多信息。
Model Subclassing API
可以使用Model Subclassing API构建完全可自定义的模型。您可以在类方法的主体中以此样式强制定义自己的前向传递。 例如:
class MyModel(tf.keras.Model):
def __init __(self): super(MyModel,self).__ init __() #在这里定义你的图层。 self.dense_1 = layers.Dense(32,activation ='relu') self.dense_2 = layers.Dense(num_classes,activation ='sigmoid')
def呼叫(自我,输入): #在这里定义你的前锋, #使用之前在`__init__`中定义的图层 x = self.dense_1(输入) return self.dense_2(x)
这些模型更灵活,但可能更难调试。 可以使用前面显示的简单编译和拟合命令编译和训练所有三种类型的模型,或者您可以编写自己的自定义训练循环以进行完全控制。
例如:
model = MyModel()
使用tf.GradientTape()作为磁带: logits = model(images,training = True) loss_value =损失(logits,labels)
grads = tape.gradient(loss_value,model.variables) optimizer.apply_gradients(zip(grads,model.variables))
有关Model Subclassing样式的更多示例,请查看以下链接,或访问tensorflow.org/tutorials (请参阅“研究和实验”部分)。
使用Model Subclassing API实现 注意力的神经机器翻译
使用Model Subclassing API实现 的 GAN
如果我的研究不适合这些风格怎么办?
如果您发现tf.keras限制您的应用程序区域,您有很多选择。 您可以:
- 将kef.keras.layers与Keras模型定义分开使用,并编写自己的渐变和训练代码。 您可以单独和独立地使用tf.keras.optimizers,tf.keras.initializers,tf.keras.losses或tf.keras.metrics。
- 完全忽略tf.keras并使用低级TensorFlow,Python和AutoGraph来获得所需的结果。
这完全取决于你! 请注意,不推荐使用tf.layers中的非面向对象层,并且tf.contrib。*(包括tf.contrib.slim和tf.contrib.learn等高级API)将无法在TF 2.0中使用。
Estimators会发生什么?
估算器广泛用于Google以及更广泛的TensorFlow社区。 已经将几种模型打包为Premade Estimators ,包括线性分类器,DNN分类器,组合DNN线性分类器(又名宽和深模型)和梯度增强树。 这些模型已经投入生产并得到广泛部署,由于所有这些原因,Estimator API(包括Premade Estimators)将包含在TensorFlow 2.0中。
对于Premade Estimators的用户来说,新焦点对Keras和热切执行的影响将是微乎其微的。 我们可能会更改Premade Estimators的实现,同时保持API表面相同。 我们还将努力添加作为Premade Estimators实现的模型的Keras版本,我们将扩展Keras以更好地满足大规模生产要求。
也就是说,如果您正在开发自定义架构,我们建议使用tf.keras来构建模型而不是Estimator。 如果您正在使用需要Estimators的基础架构,您可以使用model_to_estimator()来转换模型,同时确保Keras在TensorFlow生态系统中工作。
继续到TensorFlow 2.0!
我们希望您能像我们一样喜欢使用tf.keras! 在接下来的几个月里,TensorFlow团队将专注于完善开发人员体验。 我们的文档和教程将反映这一路径。 我们期待您的想法和反馈(查看我们的社区资源 ),以及通过GitHub问题和PR的贡献。 感谢大家!