Keras作为TensorFlow的简化接口:教程

文本原文地址:https://blog.keras.io/keras-as-a-simplified-interface-to-tensorflow-tutorial.html

Sun 24 April 2016

By Francois Chollet

In Tutorials.

使用Keras作为TensorFlow工作流程一部分的完全指南。

如果TensorFlow是您的主要框架,并且您正在寻找一个 简单的高级模型定义接口,使得工作变得更加轻松,本教程非常合适你。

Keras层和纯TensorFlow张量完全兼容,因此,Keras为TensorFlow提供了一个很好的模型定义插件,甚至可以与其他TensorFlow库一起使用。让我们看看如何使用。

请注意,本教程假设您已经配置了Keras使用TensorFlow的后端(而不是Theano)。

我们将覆盖以下几点:

  1. 在TensorFlow张量上调用Keras层
  2. 使用Keras模型与TensorFlow
  3. 多GPU和分布式训练
  4. 导出具有TensorFlow服务的模型

一,在TensorFlow张量上调用Keras层

让我们从一个简单的例子开始:MNIST数字分类。我们将使用Keras Dense层(全连接层)的堆栈来构建TensorFlow数字分类器。

我们应该首先创建一个TensorFlow会话并且注册Keras。这意味着Keras将使用我们注册的会话来初始化它在内部创建的所有变量。

import tensorflow as tf
sess = tf.Session()

from keras import backend as K
K.set_session(sess)

现在让我们开始使用我们的MNIST模型。我们可以开始构建一个分类器,就像你在TensorFlow中一样:

# this placeholder will contain our input digits, as flat vectors
img = tf.placeholder(tf.float32, shape=(None, 784))

我们可以使用Keras层去加速模型的定义过程:

from keras.layers import Dense

# Keras layers can be called on TensorFlow tensors:
x = Dense(128, activation='relu')(img)  # fully-connected layer with 128 units and ReLU activation
x = Dense(128, activation='relu')(x)
preds = Dense(10, activation='softmax')(x)  # output layer with 10 units and a softmax activation

我们定义标签的占位符,我们将使用的损失函数:

labels = tf.placeholder(tf.float32, shape=(None, 10))

from keras.objectives import categorical_crossentropy
loss = tf.reduce_mean(categorical_crossentropy(labels, preds))

让我们用TensorFlow优化器训练模型:

from tensorflow.examples.tutorials.mnist import input_data
mnist_data = input_data.read_data_sets('MNIST_data', one_hot=True)

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
with sess.as_default():
    for i in range(100):
        batch = mnist_data.train.next_batch(50)
        train_step.run(feed_dict={img: batch[0],
                                  labels: batch[1]})

我们现在可以评估模型:

from keras.metrics import categorical_accuracy as accuracy

acc_value = accuracy(labels, preds)
with sess.as_default():
    print acc_value.eval(feed_dict={img: mnist_data.test.images,
                                    labels: mnist_data.test.labels})

在这种情况下,我们只使用Keras作为一个语法快捷方式来生成操作,将某些张量输入映射到某些张量输出。优化通过本地TensorFlow优化器而不是Keras优化器完成,我们甚至没有使用任何Keras模型!

关于本地TensorFlow优化器和Keras优化器的相对性能的注释:当优化模型“keras方式”与使用“TensorFlow优化器时”,存在微笑的速度差异。有点反直觉,Keras似乎在大多数时候会快5-10%。然而,这些差异是如此小,以至于不是很重要。

在训练和测试期间的不同表现

一些Keras层(例如,Dropout、BatchNormalization)在训练时和测试时上表现不同。您可以通过打印
layer.uses_learning_phase来确定一层是处于学习阶段还是训练阶段。
layer.uses_learning_phase是一个布尔型,如果这个层在训练模型和测试模型上有不同的表现则为True,其他情况为False。

如果您的模型包含这样的层,那么您需要将学习阶段的值指定为feed_dict的一部分,以便您的模型知道是否应用了dropout等。

Keras learning phase(标量TensorFlow张量)可以通过Keras后端访问:

from keras import backend as K
print K.learning_phase()

要使用learning phase,只需传递数值‘1’(训练模式)或者‘0’(测试模式)给feed_dict:

# train mode
train_step.run(feed_dict={x: batch[0], labels: batch[1], K.learning_phase(): 1})

例如,这里演示如何添加Droptou层到之前MNIST例程:

from keras.layers import Dropout
from keras import backend as K

img = tf.placeholder(tf.float32, shape=(None, 784))
labels = tf.placeholder(tf.float32, shape=(None, 10))

x = Dense(128, activation='relu')(img)
x = Dropout(0.5)(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.5)(x)
preds = Dense(10, activation='softmax')(x)

loss = tf.reduce_mean(categorical_crossentropy(labels, preds))

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
with sess.as_default():
    for i in range(100):
        batch = mnist_data.train.next_batch(50)
        train_step.run(feed_dict={img: batch[0],
                                  labels: batch[1],
                                  K.learning_phase(): 1})

acc_value = accuracy(labels, preds)
with sess.as_default():
    print acc_value.eval(feed_dict={img: mnist_data.test.images,
                                    labels: mnist_data.test.labels,
                                    K.learning_phase(): 0})
    原文作者:张天亮
    原文地址: https://zhuanlan.zhihu.com/p/24157634
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞