2025-03-05
编程
00
请注意,本文编写于 54 天前,最后修改于 54 天前,其中某些信息可能已经过时。

目录

安装
基本概念
基本使用示例
1. 简单的顺序模型
构建一个简单的顺序模型
加载 MNIST 数据集并训练模型
2. 使用函数式 API 构建复杂模型
构建一个多输入多输出模型
3. 卷积神经网络 (CNN)
构建一个简单的 CNN 模型
4. 循环神经网络 (RNN)
构建一个简单的 LSTM 模型
5. 自定义损失函数和评估指标
自定义损失函数
自定义评估指标
6. 模型保存和加载
保存模型
加载模型
7. 分布式训练
使用 MirroredStrategy 进行分布式训练

TensorFlowKeras 是两个广泛使用的深度学习框架,它们提供了强大的工具来构建、训练和评估神经网络模型。

Keras 作为 TensorFlow 的高级 API,使得构建复杂的深度学习模型变得更加简单和直观。

安装

首先,你需要安装 TensorFlow 包。可以通过 pip 来安装:

bash
pip install tensorflow

如果你只需要 Keras 而不依赖于 TensorFlow 的底层功能,也可以单独安装 keras

bash
pip install keras

不过,通常推荐直接使用 TensorFlow,因为它已经集成了 Keras 并提供了更多的功能和优化。

基本概念

  • 张量(Tensor):多维数组,是 TensorFlow 中的基本数据结构。
  • 模型(Model):定义了神经网络的结构和行为。
  • 层(Layer):神经网络的基本构建块,如全连接层、卷积层等。
  • 损失函数(Loss Function):衡量模型预测值与真实值之间的差异。
  • 优化器(Optimizer):用于更新模型参数以最小化损失函数。
  • 度量(Metrics):用于评估模型性能的指标,如准确率。

基本使用示例

以下是一些具体的示例,展示了如何使用 TensorFlowKeras 构建和训练神经网络模型。

1. 简单的顺序模型

构建一个简单的顺序模型
python
import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense # 创建一个顺序模型 model = Sequential() # 添加层 model.add(Dense(32, activation='relu', input_shape=(784,))) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 打印模型概要 model.summary()
加载 MNIST 数据集并训练模型
python
# 加载 MNIST 数据集 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 # 将输入数据展平 x_train = x_train.reshape(-1, 784) x_test = x_test.reshape(-1, 784) # 训练模型 model.fit(x_train, y_train, epochs=5) # 评估模型 test_loss, test_acc = model.evaluate(x_test, y_test) print(f'测试集准确率: {test_acc:.2f}')

2. 使用函数式 API 构建复杂模型

构建一个多输入多输出模型
python
from tensorflow.keras.layers import Input, Dense from tensorflow.keras.models import Model # 定义输入 input1 = Input(shape=(784,)) input2 = Input(shape=(784,)) # 定义共享层 shared_dense = Dense(64, activation='relu') # 连接输入到共享层 output1 = shared_dense(input1) output2 = shared_dense(input2) # 定义输出层 output1 = Dense(10, activation='softmax')(output1) output2 = Dense(10, activation='softmax')(output2) # 创建模型 model = Model(inputs=[input1, input2], outputs=[output1, output2]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 打印模型概要 model.summary()

3. 卷积神经网络 (CNN)

构建一个简单的 CNN 模型
python
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten # 创建一个顺序模型 model = Sequential() # 添加卷积层和池化层 model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 展平层 model.add(Flatten()) # 全连接层 model.add(Dense(128, activation='relu')) # 输出层 model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 打印模型概要 model.summary() # 准备数据 (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0 x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0 # 训练模型 model.fit(x_train, y_train, epochs=5) # 评估模型 test_loss, test_acc = model.evaluate(x_test, y_test) print(f'测试集准确率: {test_acc:.2f}')

4. 循环神经网络 (RNN)

构建一个简单的 LSTM 模型
python
from tensorflow.keras.layers import LSTM, Embedding # 创建一个顺序模型 model = Sequential() # 添加嵌入层和 LSTM 层 model.add(Embedding(input_dim=10000, output_dim=64)) model.add(LSTM(64)) # 输出层 model.add(Dense(1, activation='sigmoid')) # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 打印模型概要 model.summary() # 加载 IMDB 数据集 imdb = tf.keras.datasets.imdb (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=10000) # 准备数据 from tensorflow.keras.preprocessing.sequence import pad_sequences x_train = pad_sequences(x_train, maxlen=100) x_test = pad_sequences(x_test, maxlen=100) # 训练模型 model.fit(x_train, y_train, epochs=5) # 评估模型 test_loss, test_acc = model.evaluate(x_test, y_test) print(f'测试集准确率: {test_acc:.2f}')

5. 自定义损失函数和评估指标

你可以通过自定义损失函数和评估指标来满足特定需求。

自定义损失函数
python
import tensorflow.keras.backend as K def custom_loss(y_true, y_pred): return K.mean(K.square(y_true - y_pred)) # 编译模型时使用自定义损失函数 model.compile(optimizer='adam', loss=custom_loss, metrics=['accuracy'])
自定义评估指标
python
from tensorflow.keras.metrics import Metric class CustomAccuracy(Metric): def __init__(self, name='custom_accuracy', **kwargs): super(CustomAccuracy, self).__init__(name=name, **kwargs) self.correct_count = self.add_weight(name='correct_count', initializer='zeros') self.total_count = self.add_weight(name='total_count', initializer='zeros') def update_state(self, y_true, y_pred, sample_weight=None): y_true = tf.cast(y_true, tf.int32) y_pred = tf.cast(tf.argmax(y_pred, axis=-1), tf.int32) values = tf.equal(y_true, y_pred) values = tf.cast(values, self.dtype) if sample_weight is not None: sample_weight = tf.cast(sample_weight, self.dtype) values = tf.multiply(values, sample_weight) self.correct_count.assign_add(tf.reduce_sum(values)) self.total_count.assign_add(tf.cast(tf.size(y_true), self.dtype)) def result(self): return self.correct_count / self.total_count # 编译模型时使用自定义评估指标 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=[CustomAccuracy()])

6. 模型保存和加载

保存模型
python
# 保存整个模型 model.save('my_model.h5') # 仅保存权重 model.save_weights('my_model_weights.h5')
加载模型
python
# 加载整个模型 loaded_model = tf.keras.models.load_model('my_model.h5') # 加载权重 loaded_model.load_weights('my_model_weights.h5')

7. 分布式训练

TensorFlow 支持分布式训练,可以在多个 GPU 或多个机器上并行训练模型。

使用 MirroredStrategy 进行分布式训练
python
# 创建策略 strategy = tf.distribute.MirroredStrategy() with strategy.scope(): # 在策略范围内创建模型 model = Sequential([ Dense(32, activation='relu', input_shape=(784,)), Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5)