Keras与TensorFlow 2入门指南
1. Keras的提前停止技术
在从数据集中指定训练集和测试集后,还需要确定训练轮数(epochs)。轮数过大可能导致过拟合,而过小则可能导致欠拟合。此外,模型的改进可能会逐渐减少,后续的训练迭代变得多余。
提前停止(Early Stopping)是一种允许指定较大轮数,但当模型性能提升低于阈值时停止训练的技术。可以通过回调函数(callback function)来实现提前停止。
以下是一个使用提前停止的代码示例(
tf2_keras_callback.py
):
import tensorflow as tf
import numpy as np
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(64, activation='relu'))
model.add(tf.keras.layers.Dense(64, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
loss='mse', # mean squared error
metrics=['mae']) # mean absolute error
data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))
val_data = np.random.random((100, 32))
val_labels = np.random.random((100, 10))
callbacks = [
# stop training if "val_loss" stops improving for over 2 epochs
tf.keras.callbacks.EarlyStopping(patience=2, monitor='val_loss'),
# write TensorBoard logs to the ./logs directory
tf.keras.callbacks.TensorBoard(log_dir='./logs')
]
model.fit(data, labels, batch_size=32, epochs=50,
callbacks=callbacks,
validation_data=(val_data, val_labels))
model.evaluate(data, labels, batch_size=32)
这个代码定义了一个具有三个隐藏层的Keras模型,然后编译该模型。使用
np.random.random
函数初始化数据和标签。
callbacks
变量指定了提前停止的条件,即如果
val_loss
在两个轮次内没有改善,则停止训练。同时,还指定了TensorBoard的日志目录。
运行上述代码,虽然指定了50个轮次,但实际上在四个轮次后就停止了训练。
除了使用内置的提前停止回调函数,还可以定义自定义类来实现更细粒度的控制。以下是
tf2_keras_callback2.py
的代码示例:
import tensorflow as tf
import numpy as np
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(64, activation='relu'))
model.add(tf.keras.layers.Dense(64, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
loss='mse', # mean squared error
metrics=['mae']) # mean absolute error
data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))
val_data = np.random.random((100, 32))
val_labels = np.random.random((100, 10))
class MyCallback(tf.keras.callbacks.Callback):
def on_train_begin(self, logs={}):
print("on_train_begin")
def on_train_end(self, logs={}):
print("on_train_end")
return
def on_epoch_begin(self, epoch, logs={}):
print("on_epoch_begin")
return
def on_epoch_end(self, epoch, logs={}):
print("on_epoch_end")
return
def on_batch_begin(self, batch, logs={}):
print("on_batch_begin")
return
def on_batch_end(self, batch, logs={}):
print("on_batch_end")
return
callbacks = [MyCallback()]
model.fit(data, labels, batch_size=32, epochs=50,
callbacks=callbacks,
validation_data=(val_data, val_labels))
model.evaluate(data, labels, batch_size=32)
这个自定义类
MyCallback
包含了六个方法,分别在训练开始、训练结束、轮次开始、轮次结束、批次开始和批次结束时被调用。
2. Keras的评估指标
许多基于Keras的模型只使用“accuracy”作为评估训练模型的指标,例如:
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
然而,还有许多其他内置的评估指标,它们都封装在
tf.keras.metrics
命名空间的Keras类中。以下是一些常见的评估指标:
| 指标类名 | 描述 |
| — | — |
| Accuracy | 预测与标签匹配的频率 |
| BinaryAccuracy | 二分类预测与标签匹配的频率 |
| CategoricalAccuracy | 多分类预测与标签匹配的频率 |
| FalseNegatives | 假阴性的数量 |
| FalsePositives | 假阳性的数量 |
| Mean | 给定值的(加权)均值 |
| Precision | 预测相对于标签的精确率 |
| Recall | 预测相对于标签的召回率 |
| TrueNegatives | 真阴性的数量 |
| TruePositives | 真阳性的数量 |
之前提到的“混淆矩阵”中的TP、TN、FP和FN,分别对应Keras类
TruePositive
、
TrueNegative
、
FalsePositive
和
FalseNegative
。可以在网上搜索使用这些指标的代码示例。
3. 保存和恢复Keras模型
以下是一个创建、训练和保存Keras模型,然后恢复模型的代码示例(
tf2_keras_save_model.py
):
import tensorflow as tf
import os
def create_model():
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=['accuracy'])
return model
# Create a basic model instance
model = create_model()
model.summary()
checkpoint_path = "checkpoint/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
# Create checkpoint callback
cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path, save_weights_only=True, verbose=1)
# => model #1: create the first model
model = create_model()
mnist = tf.keras.datasets.mnist
(X_train, y_train),(X_test, y_test) = mnist.load_data()
X_train, X_test = X_train / 255.0, X_test / 255.0
print("X_train.shape:",X_train.shape)
model.fit(X_train, y_train, epochs = 2,
validation_data = (X_test,y_test),
callbacks = [cp_callback])
# pass callback to training
# => model #2: create a new model and load saved model
model = create_model()
loss, acc = model.evaluate(X_test, y_test)
print("Untrained model, accuracy: {:5.2f}%".format(100*acc))
model.load_weights(checkpoint_path)
loss,acc = model.evaluate(X_test, y_test)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
这个代码首先定义了一个创建和编译Keras模型的函数
create_model
。然后指定了保存模型的路径和检查点回调。使用MNIST数据集训练模型,并在训练过程中保存模型的权重。最后,创建一个新模型,评估其准确性,加载保存的权重,再次评估准确性。
运行上述代码后,会在当前目录下创建一个
checkpoint
子目录,其中包含保存的模型文件。
4. TensorFlow 2简介
TensorFlow 2是Google推出的开源框架,是TensorFlow的最新版本。它是一个适合机器学习和深度学习的现代框架,通过Apache许可证提供。
TensorFlow 2的一些改进部分归功于将Keras纳入其核心功能。TF 2扩展和优化了Keras,使其能够利用TF 2的所有高级功能。
TF 2的一些特点和相关技术如下:
- 支持
tf.keras
:用于ML和DL的高级代码规范
-
tensorflow.js v1.0
:在现代浏览器中使用TF
- TensorFlow Federated:用于ML和分散数据的开源框架
- 不规则张量(Ragged Tensors):嵌套的可变长度列表
- TensorFlow Probability:结合深度学习的概率模型
- Tensor2Tensor:深度学习模型和数据集的库
TF 2还支持多种编程语言和硬件平台,包括Python、Java、C++,以及桌面、服务器、移动设备(TF Lite),支持CPU、GPU和TPU,支持Linux和Mac OS X,以及Windows虚拟机。
TF 2的默认执行模式是即时执行(eager execution),而不是延迟执行(deferred execution)。它还提供了新的特性,如
@tf.function
装饰器和隐私相关功能。
TF 2可用于解决多种实际问题,包括图像识别、计算机视觉、语音识别、时间序列分析、语言检测、语言翻译、文本处理和手写识别等。与TF 1.x相比,TF 2的代码通常更简单、更清晰。
TF 2用C++编写,支持对原始值和张量的操作。它支持张量的算术运算、条件逻辑、
for
循环和
while
循环。数据可视化通过TensorBoard实现,TF 2的API可以嵌入Python脚本中。
5. TF 2代码示例
TF 2的代码示例涵盖了多个方面,包括:
-
常量和变量
:学习如何编写涉及TF常量和TF变量的代码。
-
@tf.function
装饰器
:这是一个新的Python函数装饰器,虽然不是总是必需的,但需要熟悉其使用,并且在使用时有一些非直观的注意事项。
-
算术运算和内置函数
:如何在TF 2中执行典型的算术运算,使用内置函数,计算三角函数值,使用
for
循环和计算指数值。
-
数组操作
:创建单位矩阵、常量矩阵、随机均匀矩阵和截断正态矩阵,以及二阶张量的乘法和Python数组到二阶张量的转换。
-
新特性使用
:如
tf.GradientTape
的使用。
总结
本文介绍了Keras的一些重要特性,包括提前停止技术、评估指标、模型的保存和恢复,以及TensorFlow 2的特点、使用场景、架构和代码示例。这些内容为进一步学习和使用Keras和TensorFlow 2提供了基础。在实际应用中,可以根据具体需求选择合适的技术和方法来构建和训练模型。
以下是TF 2使用的mermaid流程图:
graph LR
A[定义模型] --> B[编译模型]
B --> C[准备数据]
C --> D[训练模型]
D --> E{是否满足提前停止条件}
E -- 是 --> F[停止训练]
E -- 否 --> D
F --> G[评估模型]
G --> H[保存模型]
H --> I[恢复模型]
I --> J[再次评估模型]
这个流程图展示了使用TF 2构建、训练、评估和保存模型的基本流程,其中包含了提前停止的判断环节。
Keras与TensorFlow 2入门指南
6. TF 2架构详解
TF 2的架构设计旨在提供更高效、更直观的机器学习开发体验。与TF 1.x相比,它有了显著的改进。
6.1 执行模式
TF 1.x的默认执行模式是延迟执行,即先构建计算图,然后在会话中运行。而TF 2采用即时执行作为默认模式,这意味着代码在编写时就会立即执行,无需构建复杂的计算图。这种模式使得调试更加容易,代码的可读性和可维护性也大大提高。
例如,在TF 2中可以直接编写如下代码并立即看到结果:
import tensorflow as tf
x = tf.constant([1, 2, 3])
y = tf.constant([4, 5, 6])
z = x + y
print(z)
6.2 命名空间与模块
TF 2对命名空间进行了优化,去除了许多重复的功能,提供了更统一的API。其中,
tf.keras
是一个重要的命名空间,用于构建和训练深度学习模型。它提供了高级的模型构建接口,如
Sequential
模型、函数式API和子类化模型。
另外,
tf.compat.v1
提供了向后兼容性,允许用户在TF 2中使用TF 1.x的部分功能。同时,
tf_upgrade_v2
脚本可以帮助用户将TF 1.x的代码自动转换为TF 2的代码。
6.3 与硬件的交互
TF 2支持多种硬件平台,包括CPU、GPU和TPU。它可以自动检测可用的硬件资源,并在不同的设备上高效运行。例如,在有GPU的环境中,TF 2会自动将计算任务分配到GPU上,以加速训练过程。
以下是一个简单的代码示例,展示如何检查是否有GPU可用:
import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))
7. TF 2新特性深入探讨
7.1
@tf.function
装饰器
@tf.function
装饰器可以将Python函数转换为TensorFlow的图函数,从而提高代码的执行效率。当函数被多次调用时,TensorFlow会对其进行优化,减少不必要的开销。
import tensorflow as tf
@tf.function
def add(a, b):
return a + b
x = tf.constant(1)
y = tf.constant(2)
result = add(x, y)
print(result)
需要注意的是,使用
@tf.function
装饰器时,函数的输入和输出必须是TensorFlow张量,并且函数内部的代码需要遵循一定的规则。例如,不能在函数内部使用Python的控制流语句(如
if
、
for
),除非它们被转换为TensorFlow的操作。
7.2
tf.GradientTape
tf.GradientTape
是TF 2中用于自动求导的重要工具。它可以记录在其上下文管理器中执行的所有操作,并计算这些操作相对于某些变量的梯度。
import tensorflow as tf
x = tf.Variable(3.0)
with tf.GradientTape() as tape:
y = x * x
dy_dx = tape.gradient(y, x)
print(dy_dx)
在这个示例中,
tf.GradientTape
记录了
y = x * x
的计算过程,并计算了
y
相对于
x
的梯度。
8. TF 2代码实践
以下是一个完整的TF 2代码示例,展示了如何使用TF 2构建一个简单的神经网络模型,对MNIST数据集进行分类:
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 数据预处理
x_train, x_test = x_train / 255.0, x_test / 255.0
# 构建模型
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(x_train, y_train, epochs=5)
# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_acc}")
这个代码示例展示了TF 2的基本使用流程,包括数据加载、模型构建、编译、训练和评估。
9. TF 2的未来展望
随着人工智能技术的不断发展,TF 2也在不断演进。未来,TF 2可能会在以下几个方面取得进一步的发展:
- 更强大的分布式训练支持 :随着数据量和模型规模的不断增大,分布式训练变得越来越重要。TF 2可能会提供更高效、更易用的分布式训练工具。
- 与其他框架的集成 :为了满足不同用户的需求,TF 2可能会与其他流行的机器学习框架进行更紧密的集成,如PyTorch、Scikit-learn等。
- 更多的应用场景支持 :除了现有的图像识别、语音识别等应用场景,TF 2可能会在更多领域得到应用,如自动驾驶、医疗保健等。
总结
本文全面介绍了Keras和TensorFlow 2的相关知识,包括Keras的提前停止技术、评估指标、模型保存和恢复,以及TF 2的特点、架构、代码示例和未来展望。通过学习这些内容,读者可以更好地掌握Keras和TF 2的使用,为构建和训练高效的机器学习模型打下坚实的基础。
以下是TF 2代码开发的mermaid流程图:
graph LR
A[需求分析] --> B[数据准备]
B --> C[模型选择与设计]
C --> D[模型编译]
D --> E[模型训练]
E --> F{是否达到预期效果}
F -- 是 --> G[模型评估]
F -- 否 --> C
G --> H[模型部署]
H --> I[持续优化]
这个流程图展示了使用TF 2进行机器学习项目开发的完整流程,从需求分析到模型部署和持续优化。
超级会员免费看

被折叠的 条评论
为什么被折叠?



