3. TensorFlow Keras 高级 API


文档摘要

TensorFlow Keras 高级 API TensorFlow Keras 高级 API 详解与实践 1. Functional API Functional API 允许你创建更加灵活的模型,可以处理多输入、多输出、共享层等复杂结构。它通过将层视为函数来连接输入和输出,从而构建模型。 代码详解: : 定义输入层, 参数指定输入数据的形状。 : 定义一个全连接层(Dense layer),包含 64 个神经元,激活函数为 ReLU。 作为输入传递给该层,层就像一个函数一样被调用。 : 使用输入层和输出层创建 实例。 mermaid 图表: Functional API 的优势: 灵活性: 可以创建任意结构的图模型。 可重用性: 可以将层作为函数来重用。

3. TensorFlow Keras 高级 API

TensorFlow Keras 高级 API 详解与实践

1. Functional API

Functional API 允许你创建更加灵活的模型,可以处理多输入、多输出、共享层等复杂结构。它通过将层视为函数来连接输入和输出,从而构建模型。

import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # 定义输入层 input_layer = keras.Input(shape=(784,)) # 假设输入是 784 维向量 # 定义隐藏层 hidden_layer_1 = layers.Dense(64, activation='relu')(input_layer) hidden_layer_2 = layers.Dense(64, activation='relu')(hidden_layer_1) # 定义输出层 output_layer = layers.Dense(10, activation='softmax')(hidden_layer_2) # 假设 10 个类别 # 创建模型 model = keras.Model(inputs=input_layer, outputs=output_layer) # 打印模型结构 model.summary()

代码详解:

  • keras.Input(shape=(784,)): 定义输入层,shape 参数指定输入数据的形状。

  • layers.Dense(64, activation='relu')(input_layer): 定义一个全连接层(Dense layer),包含 64 个神经元,激活函数为 ReLU。 input_layer 作为输入传递给该层,层就像一个函数一样被调用。

  • keras.Model(inputs=input_layer, outputs=output_layer): 使用输入层和输出层创建 Model 实例。

mermaid 图表:

Functional API 的优势:

  • 灵活性: 可以创建任意结构的图模型。

  • 可重用性: 可以将层作为函数来重用。

  • 多输入/多输出: 可以轻松处理多输入和多输出模型。

2. Sequential API

Sequential API 是构建简单线性模型的便捷方式。它通过将层按顺序堆叠起来来构建模型。

import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # 创建 Sequential 模型 model = keras.Sequential([ layers.Dense(64, activation='relu', input_shape=(784,)), # 指定输入形状 layers.Dense(64, activation='relu'), layers.Dense(10, activation='softmax') ]) # 打印模型结构 model.summary()

代码详解:

  • keras.Sequential([...]): 创建一个 Sequential 模型,将层列表传递给构造函数。

  • input_shape=(784,): 在第一层指定输入形状。

Sequential API 的优势:

  • 简单易用: 非常适合构建简单的线性模型。

  • 代码简洁: 代码量少,易于阅读和维护。

Sequential API 的局限性:

  • 只能构建线性模型: 无法处理复杂的图结构。

  • 灵活性较低: 难以实现共享层或多输入/多输出。

3. Model Subclassing

Model Subclassing 允许你通过继承 tf.keras.Model 类来完全自定义模型。你需要定义 __init__ 方法来初始化层,并定义 call 方法来实现前向传播。

import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # 定义自定义模型 class MyModel(keras.Model): def __init__(self, num_units=64, num_classes=10): super(MyModel, self).__init__() self.dense1 = layers.Dense(num_units, activation='relu') self.dense2 = layers.Dense(num_units, activation='relu') self.output_layer = layers.Dense(num_classes, activation='softmax') def call(self, inputs): x = self.dense1(inputs) x = self.dense2(x) return self.output_layer(x) # 创建模型实例 model = MyModel(num_units=64, num_classes=10) # 构建模型 (在首次调用时) model.build(input_shape=(None, 784)) # 显式指定输入形状 # 打印模型结构 model.summary()

代码详解:

  • class MyModel(keras.Model): 定义一个继承自 keras.Model 的类。

  • __init__(self, num_units=64, num_classes=10): 初始化层,定义模型中使用的各个层。

  • call(self, inputs): 定义前向传播过程,接收输入并返回输出。

  • model.build(input_shape=(None, 784)): 构建模型,input_shape 指定输入形状。 None 表示批次大小可以是任意值。

Model Subclassing 的优势:

  • 完全的灵活性: 可以自定义任何模型结构和行为。

  • 动态图: 可以根据输入动态调整模型结构。

  • 方便调试: 更容易调试和理解模型的内部工作原理。

Model Subclassing 的缺点:

  • 代码量较多: 需要编写更多的代码。

  • 容易出错: 需要更深入地理解 TensorFlow 的工作原理。

  • 序列化困难: 模型序列化可能更复杂。

4. 常用高级 API 功能

除了模型构建 API,Keras 还提供了其他高级 API 功能,例如:

  • 自定义层: 可以通过继承 tf.keras.layers.Layer 类来创建自定义层。

  • 自定义损失函数: 可以使用 tf.keras.losses.Loss 类或直接编写 Python 函数来定义自定义损失函数。

  • 自定义指标: 可以使用 tf.keras.metrics.Metric 类或直接编写 Python 函数来定义自定义指标。

  • 回调函数 (Callbacks): 用于在训练过程中执行特定操作,例如保存模型、提前停止训练、调整学习率等。

代码示例:自定义层

import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # 定义自定义层 class MyDenseLayer(layers.Layer): def __init__(self, units, activation=None, **kwargs): super(MyDenseLayer, self).__init__(**kwargs) self.units = units self.activation = keras.activations.get(activation) # 使用 keras.activations.get 处理字符串激活函数 def build(self, input_shape): self.w = self.add_weight(shape=(input_shape[-1], self.units), initializer='random_normal', trainable=True) self.b = self.add_weight(shape=(self.units,), initializer='zeros', trainable=True) def call(self, inputs): linear_output = tf.matmul(inputs, self.w) + self.b if self.activation is not None: return self.activation(linear_output) return linear_output def get_config(self): config = super(MyDenseLayer, self).get_config() config.update({ 'units': self.units, 'activation': keras.activations.serialize(self.activation) # 序列化激活函数 }) return config # 使用自定义层 model = keras.Sequential([ keras.Input(shape=(784,)), MyDenseLayer(64, activation='relu'), layers.Dense(10, activation='softmax') ]) # 打印模型结构 model.summary()

代码详解:

  • class MyDenseLayer(layers.Layer): 定义一个继承自 layers.Layer 的自定义层。

  • __init__(self, units, activation=None, **kwargs): 初始化层的参数。

  • build(self, input_shape): 创建层的权重。 self.add_weight 用于创建可训练的权重变量。

  • call(self, inputs): 定义层的前向传播过程。

  • get_config(self): 返回层的配置信息,用于序列化和反序列化。

5. 模型训练与评估

无论使用哪种 API 构建模型,都可以使用 model.compile 方法配置优化器、损失函数和指标,然后使用 model.fit 方法训练模型,使用 model.evaluate 方法评估模型。

# 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 准备数据 (使用 MNIST 数据集作为示例) (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() x_train = x_train.reshape(60000, 784).astype('float32') / 255 x_test = x_test.reshape(10000, 784).astype('float32') / 255 y_train = keras.utils.to_categorical(y_train, num_classes=10) y_test = keras.utils.to_categorical(y_test, num_classes=10) # 训练模型 model.fit(x_train, y_train, epochs=2, batch_size=32) # 评估模型 loss, accuracy = model.evaluate(x_test, y_test) print('Test loss:', loss) print('Test accuracy:', accuracy)

总结

TensorFlow Keras 提供了多种高级 API,可以满足不同复杂度的模型构建需求。Functional API 提供了灵活性,Sequential API 易于使用,Model Subclassing 提供了完全的自定义能力。选择合适的 API 取决于模型的复杂性和你的个人偏好。 掌握这些 API,可以更高效地进行深度学习模型的开发和实验。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U