淘先锋技术网

首页 1 2 3 4 5 6 7

写在前面:说到Keras,大家肯定会对其与TensorFlow之间的关系有些疑惑,可以参考这两篇文章,兴许能解答一二,均有中文翻译。

Keras 是用Python编写的高级神经网络 API,能够在 TensorFlow、CNTK或Theano 上运行。Keras 的突出特点在于其易用性,是很容易上手且能够快速运行的深度学习库。
现在,其实可以简单的说Keras是TensorFlow的一个高阶API。

Keras有两个版本,支持多后端(backend)的Keras和tf.keras。

Multi-backend Keras

为了训练你自己的自定义神经网络,Keras 需要一个后端,即一个计算引擎——它可以构建网络的图和拓扑结构,运行优化器,并执行具体的数字运算。这个后端可以是TensorFlow、CNTK或Theano。
在 v1.1.0 之前,Keras 的默认后端都是 Theano。 v1.1.0 之后,TensorFlow开始成为 Keras 的默认后端。
关于后端引擎,具体可参考
Backend - Keras Documentation

tf.keras

tf.keras 是在 TensorFlow v1.10.0 中引入的,此时tf.keras 软件包与通过 pip 安装的 keras 软件包是分开的。在TensorFlow 2.0 中, tf.keras 是 TensorFlow 的官方高阶 API,用于快速简单的模型设计和训练。
Keras v2.3.0 是 Keras 第一个与 tf.keras 同步的版本,也将是最后一个支持多个后端的主要版本。之后,Multi-backend Keras 要被tf.keras替代了。

官方建议是:

we recommend that Keras users who use multi-backend Keras with the TensorFlow backend switch to tf.keras in TensorFlow 2.0.

Keras入门

我的开发环境是Mac,使用的是Arconda虚拟环境,并且已经安装了Tensorflow 2作为后端引擎。下面直接安装并使用Keras:
pip install keras

Keras的核心数据结构是用来组织层(layers)的模型(model),其中最简单的类型就是Sequential模型。

  • Sequential model:
from keras.models import Sequential
model = Sequential()
  • 通过.add()方法来叠加层:
from keras.layers import Dense, Flatten, Softmax

model.add(Flatten(input_shape = (28, 28)))
model.add(Dense(units=128, activation=‘relu’))
model.add(Dense(units=10))
  • 通过.compile()方法来配置神经网络的学习过程:
from keras.losses import SparseCategoricalCrossentropy

model.compile(optimizer=‘adam’, loss=SparseCategoricalCrossentropy(from_logits=True), metrics=[‘accuracy’])
  • 如果需要,在.compile()过程中也可以进一步配置超参数:
model.compile(optimizer=keras.optimizers.adam(learning_rate=0.001, beta_1=0.9, beta_2=0.99, amsgrad=False), loss=SparseCategoricalCrossentropy(from_logits=True), metrics=[‘accuracy’])
  • 接下来就是将训练数据给到该模型进行训练:
    model.fit(train_images, train_labels, epochs=10)

  • 通过测试数据来对训练的模型进行精度评估:
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)

  • 最后,用训练好的模型进行预测:

probability_model = Sequential([model, Softmax()])
predictions = probability_model.predict(test_images)

若要使用tf.keras,则需import tensorflow as tf,并将引入的keras库删掉,并将后面所有涉及keras的内容补全为tf.keras.,如tf.keras.models.Sequential()

说明

以上代码是参考TensorFlow 2的Keras入门教程改写而来,原教程是通过tf.keras来实现的。关于更多tf.keras的内容,请参考TensorFlow 的官方指南

附完整的代码:

import keras
from keras.models import Sequential
from keras.layers import Dense, Flatten, Softmax
from keras.losses import SparseCategoricalCrossentropy
import numpy as np

fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

train_images = train_images / 255.0
test_images = test_images / 255.0

model = Sequential()
model.add(Flatten(input_shape = (28, 28)))
model.add(Dense(units=128, activation='relu'))
model.add(Dense(units=10))

# model.compile(optimizer='adam',
#               loss=SparseCategoricalCrossentropy(from_logits=True),
#               metrics=['accuracy'])

model.compile(optimizer=keras.optimizers.adam(learning_rate=0.001, beta_1=0.9, beta_2=0.99, amsgrad=False),
              loss=SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=10)

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print('\nTest accuracy:', test_acc)

probability_model = Sequential([model, 
                                Softmax()])

predictions = probability_model.predict(test_images)

print(predictions[0])
print(np.argmax(predictions[0]))
print(test_labels[0])