54、深入了解 TensorFlow 2 中的 Keras:从基础到实战应用

深入了解 TensorFlow 2 中的 Keras:从基础到实战应用

在机器学习和深度学习领域,Keras 是一个强大且易于使用的高级神经网络 API,而 TensorFlow 2 中的 Keras 更是得到了性能优化。本文将详细介绍 TensorFlow 2 中 Keras 的各个命名空间、如何创建 Keras 模型,以及通过多个具体示例展示其在不同场景下的应用。

1. TensorFlow 2 中 Keras 的命名空间

TensorFlow 2 为 Keras 提供了多个命名空间,包含了丰富的激活函数、数据集、实验性类以及实用工具等。

1.1 tf.keras.activations 命名空间

机器学习和深度学习模型需要激活函数,Keras 模型的激活函数位于 tf.keras.activations 命名空间,常见的激活函数如下:
- tf.keras.activations.relu
- tf.keras.activations.selu
- tf.keras.activations.linear
- tf.keras.activations.elu
- tf.keras.activations.sigmoid
- tf.keras.activations.softmax
- tf.keras.activations.softplus
- tf.keras.activations.tanh

ReLU/SELU/ELU 函数密切相关,常用于人工神经网络(ANNs)和卷积神经网络(CNNs)。在 relu() 函数流行之前, sigmoid() tanh() 函数在 ANNs 和 CNNs 中使用较多,不过它们在门控循环单元(GRUs)和长短期记忆网络(LSTMs)的各种门中仍然很重要。 softmax() 函数通常用于最右侧隐藏层和输出层组成的层对中。

1.2 tf.keras.datasets 命名空间

TF 2 在 tf.keras.datasets 命名空间中提供了一组内置数据集,部分数据集如下:
- tf.keras.datasets.boston_housing
- tf.keras.datasets.cifar10
- tf.keras.datasets.cifar100
- tf.keras.datasets.fashion_mnist
- tf.keras.datasets.imdb
- tf.keras.datasets.mnist
- tf.keras.datasets.reuters

这些数据集常用于小数据集模型训练。 mnist 数据集和 fashion_mnist 数据集在训练 CNNs 时很受欢迎,而 boston_housing 数据集则常用于线性回归。虽然泰坦尼克号数据集也常用于线性回归,但目前它不是 tf.keras.datasets 命名空间中的默认数据集。

1.3 tf.keras.experimental 命名空间

TF 1.x 中的 contrib 命名空间在 TF 2 中已被弃用,其替代者是 tf.keras.experimental 命名空间,包含以下类:
- tf.keras.experimental.CosineDecay
- tf.keras.experimental.CosineDecayRestarts
- tf.keras.experimental.LinearCosineDecay
- tf.keras.experimental.NoisyLinearCosineDecay
- tf.keras.experimental.PeepholeLSTMCell

对于初学者来说,可能不会使用上述列表中的类。虽然 PeepholeLSTMCell 类是 LSTM 类的一种变体,但该类的使用场景有限。

1.4 其他 tf.keras 命名空间

TF 2 还提供了其他包含有用类的命名空间:
- tf.keras.callbacks (用于提前停止训练)
- tf.keras.optimizers (如 Adam 等优化器)
- tf.keras.regularizers (L1 和 L2 正则化器)
- tf.keras.utils (如 to_categorical 函数)

tf.keras.callbacks 命名空间中的类可用于“提前停止”训练,如果连续两次迭代中损失函数的减少不足,则可以终止训练过程。 tf.keras.optimizers 命名空间包含各种可与损失函数配合使用的优化器,其中包括流行的 Adam 优化器。 tf.keras.regularizers 命名空间包含两个流行的正则化器:L1 正则化器(在机器学习中也称为 LASSO)和 L2 正则化器(在机器学习中也称为 Ridge 正则化器)。L1 用于平均绝对误差(MAE),L2 用于均方误差(MSE),它们作为“惩罚”项添加到所选成本函数中,以减少机器学习模型中特征的“影响”。LASSO 可以将值驱动为零,从而从模型中消除特征,这与机器学习中的特征选择有关。 tf.keras.utils 命名空间包含各种函数,包括用于将类向量转换为二进制类的 to_categorical() 函数。

对于 TF 2 和机器学习的初学者来说,上述命名空间中的类可能足以完成大多数任务。

2. TF 2 Keras 与“独立”Keras

原始的 Keras 实际上是一个规范,有各种“后端”框架,如 TensorFlow、Theano 和 CNTK。目前,独立的 Keras 不支持 TF 2,而 tf.keras 中的 Keras 实现已针对性能进行了优化。独立的 Keras 将永久存在于 keras.io 包中,相关详细信息可在 Keras 网站(keras.io)上查看。

3. 创建 Keras 模型

创建、训练和测试 Keras 模型的高级步骤如下:
1. 确定模型架构 :包括隐藏层的数量、各种激活函数等。这一步需要确定多个超参数的值,如隐藏层的数量、每个隐藏层的神经元数量、边的权重初始值、成本函数、优化器、学习率、丢弃率和激活函数等。
2. 调用 compile() 方法 :编译模型,指定优化器、损失函数和评估指标。
3. 调用 fit() 方法 :使用训练数据训练模型。
4. 调用 evaluate() 方法 :评估训练好的模型。
5. 调用 predict() 方法 :进行预测。

以下是一个简单的 Keras 模型示例:

import tensorflow as tf
model = tf.keras.models.Sequential([
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
pred = model.predict(x)

下面是一个完整的示例代码 tf2_basic_keras.py

import tensorflow as tf
# NOTE: we need the train data and test data
model = tf.keras.models.Sequential([
  tf.keras.layers.Dense(1, activation=tf.nn.relu),
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
4. Keras 在不同场景下的应用示例
4.1 Keras 与线性回归

以下是一个使用 Keras 解决线性回归问题的示例,根据给定的意大利面重量预测其价格。

pasta.csv 文件内容如下:

weight,price
5,30
10,45
15,70
20,80
25,105
30,120
35,130
40,140
50,150

keras_pasta.py 代码如下:

import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# price of pasta per kilogram
df = pd.read_csv("pasta.csv")
weight = df['weight']
price  = df['price']
model = tf.keras.models.Sequential([
   tf.keras.layers.Dense(units=1,input_shape=[1])
])
# MSE loss function and Adam optimizer
model.compile(loss='mean_squared_error',
              optimizer=tf.keras.optimizers.Adam(0.1))
# train the model
history = model.fit(weight, price, epochs=100, verbose=False)
# graph the # of epochs versus the loss
plt.xlabel('Number of Epochs')
plt.ylabel("Loss Values")
plt.plot(history.history['loss'])
plt.show()
print("Cost for 11kg:",model.predict([11.0]))
print("Cost for 45kg:",model.predict([45.0]))

运行上述代码,将显示训练过程中损失函数随迭代次数的变化图,并输出 11kg 和 45kg 意大利面的预测价格。

4.2 Keras、MLPs 与 MNIST

以下是一个使用 Keras 创建多层感知器(MLP)神经网络并使用 MNIST 数据集进行训练的示例。

keras_mlp_mnist.py 代码如下:

import tensorflow as tf
import numpy as np
# instantiate mnist and load data:
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# one-hot encoding for all labels to create 1x10
# vectors that are compared with the final layer:
y_train = tf.keras.utils.to_categorical(y_train)
y_test  = tf.keras.utils.to_categorical(y_test)
image_size = x_train.shape[1]
input_size = image_size * image_size
# resize and normalize the 28x28 images:
x_train = np.reshape(x_train, [-1, input_size])
x_train = x_train.astype('float32') / 255
x_test  = np.reshape(x_test, [-1, input_size])
x_test  = x_test.astype('float32') / 255
# initialize some hyper-parameters:
batch_size = 128
hidden_units = 128
dropout_ratea = 0.20
# define a Keras-based model:
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(hidden_units, input_dim=input_size))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.Dropout(dropout_rate))
model.add(tf.keras.layers.Dense(hidden_units))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.Dense(10))
model.add(tf.keras.layers.Activation('softmax'))
model.summary()
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
# train the network on the training data:
model.fit(x_train, y_train, epochs=10, batch_size=batch_size)
# calculate and then display the accuracy:
loss, acc = model.evaluate(x_test, y_test, batch_size=batch_size)
print("\nTest accuracy: %.1f%%" % (100.0 * acc))

运行上述代码,将显示模型的结构信息、训练过程中的损失和准确率,以及测试集上的准确率。

4.3 Keras、CNNs 与 cifar10

以下是一个使用 Keras 训练卷积神经网络(CNN)并使用 cifar10 数据集的示例。

keras_cnn_cifar10.py 代码如下:

import tensorflow as tf
batch_size = 32
num_classes = 10
epochs = 100
num_predictions = 20
cifar10 = tf.keras.datasets.cifar10
# The data, split between train and test sets:
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# Convert class vectors to binary class matrices
y_train = tf.keras.utils.to_categorical(y_train, num_classes)
y_test = tf.keras.utils.to_categorical(y_test, num_classes)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(32, (3, 3), padding='same',
                 input_shape=x_train.shape[1:]))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.Conv2D(32, (3, 3)))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(tf.keras.layers.Dropout(0.25))
# you can also duplicate the preceding code block here
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(512))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(num_classes))
model.add(tf.keras.layers.Activation('softmax'))
# use RMSprop optimizer to train the model
model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          validation_data=(x_test, y_test),
          shuffle=True)
# evaluate and display results from test data
scores = model.evaluate(x_test, y_test, verbose=1)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])

运行上述代码,将显示训练集和测试集的信息、模型的训练过程,以及测试集上的损失和准确率。

4.4 在 Keras 中调整图像大小

以下是一个在 Keras 中调整图像大小的示例。

keras_resize_image.py 代码如下:

import tensorflow as tf
import numpy as np
import imageio
import matplotlib.pyplot as plt
# use any image that has 3 channels
inp = tf.keras.layers.Input(shape=(None, None, 3))
out = tf.keras.layers.Lambda(lambda image: tf.image.resize(image, (128, 128)))(inp)
model = tf.keras.Model(inputs=inp, outputs=out)
model.summary()
# read the contents of a PNG or JPG
X = imageio.imread('sample3.png')
out = model.predict(X[np.newaxis, ...])
fig, axes = plt.subplots(nrows=1, ncols=2)
axes[0].imshow(X)
axes[1].imshow(np.int8(out[0,...]))
plt.show()

运行上述代码,将显示原始图像和调整大小后的图像。

通过以上介绍和示例,你可以深入了解 TensorFlow 2 中 Keras 的使用方法,从基础的命名空间到具体的模型创建和应用,希望这些内容能帮助你在机器学习和深度学习领域取得更好的成果。

深入了解 TensorFlow 2 中的 Keras:从基础到实战应用

5. 各示例操作步骤总结

为了更清晰地展示各个示例的操作流程,下面以表格形式总结每个示例的操作步骤:
| 示例名称 | 操作步骤 |
| — | — |
| Keras 与线性回归 | 1. 准备 pasta.csv 文件,包含重量和价格数据。
2. 编写 keras_pasta.py 代码,读取数据。
3. 定义 Keras 顺序模型,包含一个全连接层。
4. 编译模型,指定均方误差损失函数和 Adam 优化器。
5. 使用训练数据训练模型。
6. 绘制训练过程中损失函数随迭代次数的变化图。
7. 进行预测并输出结果。 |
| Keras、MLPs 与 MNIST | 1. 导入必要的库。
2. 加载 MNIST 数据集。
3. 对标签进行 one-hot 编码。
4. 调整图像大小并归一化。
5. 初始化超参数。
6. 定义 Keras 顺序模型,包含多个全连接层和激活函数。
7. 编译模型,指定分类交叉熵损失函数和 Adam 优化器。
8. 使用训练数据训练模型。
9. 评估模型并输出测试集准确率。 |
| Keras、CNNs 与 cifar10 | 1. 导入必要的库。
2. 加载 cifar10 数据集。
3. 打印训练集和测试集信息。
4. 将类向量转换为二进制类矩阵。
5. 定义 Keras 顺序模型,包含卷积层、激活函数、池化层和全连接层。
6. 编译模型,指定分类交叉熵损失函数和 RMSprop 优化器。
7. 对数据进行类型转换和归一化。
8. 使用训练数据训练模型。
9. 评估模型并输出测试集损失和准确率。 |
| 在 Keras 中调整图像大小 | 1. 导入必要的库。
2. 定义输入层,可处理彩色图像。
3. 定义输出层,将输入图像调整为指定大小。
4. 创建 Keras 模型,指定输入和输出。
5. 读取图像文件。
6. 使用模型进行预测。
7. 显示原始图像和调整大小后的图像。 |

6. 关键技术点分析
6.1 激活函数

激活函数在神经网络中起着至关重要的作用,不同的激活函数适用于不同的场景。在前面的示例中,我们使用了多种激活函数,如 ReLU、Softmax 等。
- ReLU(Rectified Linear Unit) :在多个示例中都有使用,如 tf.keras.layers.Dense(512, activation=tf.nn.relu) 。ReLU 函数的优点是计算简单,能够有效缓解梯度消失问题,使网络训练更加高效。其公式为 $f(x) = max(0, x)$。
- Softmax :常用于输出层,将输出转换为概率分布。例如在 keras_mlp_mnist.py keras_cnn_cifar10.py 中,最后一层使用了 Softmax 激活函数。其公式为 $\sigma(z) j = \frac{e^{z_j}}{\sum {k=1}^{K} e^{z_k}}$,其中 $z$ 是输入向量,$K$ 是类别数。

6.2 优化器

优化器用于更新模型的参数,以最小化损失函数。常见的优化器有 Adam、RMSprop 等。
- Adam(Adaptive Moment Estimation) :结合了 AdaGrad 和 RMSProp 的优点,能够自适应地调整每个参数的学习率。在多个示例中都使用了 Adam 优化器,如 model.compile(optimizer='adam', ...)
- RMSprop :在 keras_cnn_cifar10.py 中使用,它通过对梯度的平方进行指数加权平均来调整学习率,有助于处理梯度的波动。

6.3 正则化器

正则化器用于防止模型过拟合,通过在损失函数中添加惩罚项来限制模型的复杂度。常见的正则化器有 L1 和 L2 正则化器。
- L1 正则化器(LASSO) :可以将某些特征的权重驱动为零,从而实现特征选择。在机器学习中,它常用于减少模型的特征数量。
- L2 正则化器(Ridge) :通过对权重的平方和进行惩罚,使权重的值不会过大,从而防止模型过拟合。

7. 总结与展望

通过本文的介绍,我们深入了解了 TensorFlow 2 中 Keras 的各个命名空间、创建 Keras 模型的步骤以及多个实战示例。这些示例涵盖了线性回归、多层感知器、卷积神经网络和图像调整等多个领域,展示了 Keras 在不同场景下的强大功能。

对于初学者来说,掌握这些基础知识和操作步骤是迈向机器学习和深度学习领域的重要一步。在实际应用中,可以根据具体问题选择合适的模型架构、激活函数、优化器和正则化器,以提高模型的性能。

未来,随着深度学习技术的不断发展,Keras 也将不断更新和完善,提供更多的功能和工具。我们可以期待在更多的领域看到 Keras 的应用,如自然语言处理、计算机视觉、强化学习等。同时,也可以进一步探索如何结合其他深度学习框架和技术,以实现更复杂和高效的模型。

下面是创建 Keras 模型的流程 mermaid 流程图:

graph LR
    A[确定模型架构] --> B[调用 compile() 方法]
    B --> C[调用 fit() 方法训练模型]
    C --> D[调用 evaluate() 方法评估模型]
    D --> E[调用 predict() 方法进行预测]

通过这个流程图,我们可以更直观地看到创建、训练和测试 Keras 模型的整体流程。希望本文能帮助你更好地理解和使用 TensorFlow 2 中的 Keras,在机器学习和深度学习的道路上取得更好的成果。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值