TensorFlow 高级 API - Keras

Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK 或 Theano 作为后端运行。Keras 的设计理念是用户友好、模块化和易扩展。

Keras 的主要特点

  1. 简单易用:提供直观一致的接口,适合快速原型设计
  2. 模块化:神经网络层、损失函数、优化器等都是可插拔的模块
  3. 易扩展:可以轻松添加新模块来表达新的研究想法
  4. 支持多后端:可以无缝运行在 TensorFlow, CNTK 或 Theano 上

Keras 核心概念

1. 模型 (Model)

Keras 的核心数据结构是模型,模型是组织神经网络层的方式。Keras 提供了两种主要的模型:

  • Sequential 模型:层的线性堆叠
  • Functional API:构建复杂模型的有向无环图

2. 层 (Layer)

层是 Keras 的基本构建块,每个层接收输入数据,进行某种计算后输出结果。Keras 提供了多种预定义层:

  • 核心层:Dense, Activation, Dropout 等
  • 卷积层:Conv2D, MaxPooling2D 等
  • 循环层:LSTM, GRU 等
  • 其他:Embedding, BatchNormalization 等

3. 激活函数 (Activation Function)

激活函数决定神经元的输出,常用的有:

  • ReLU (Rectified Linear Unit)
  • Sigmoid
  • Tanh
  • Softmax (多分类问题)

Keras 基本工作流程

1. 定义模型

实例

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential([
    Dense(64, activation='relu', input_shape=(784,)),
    Dense(64, activation='relu'),
    Dense(10, activation='softmax')
])

2. 编译模型

实例

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

3. 训练模型

实例

model.fit(x_train, y_train,
          epochs=5,
          batch_size=32)

4. 评估模型

实例

loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)

5. 进行预测

实例

classes = model.predict(x_test, batch_size=128)

Keras 常用层详解

1. Dense 全连接层

实例

Dense(units,
      activation=None,
      use_bias=True,
      kernel_initializer='glorot_uniform',
      bias_initializer='zeros')
  • units:正整数,输出空间的维度
  • activation:激活函数
  • use_bias:是否使用偏置向量
  • kernel_initializer:权重矩阵的初始化器
  • bias_initializer:偏置向量的初始化器

2. Conv2D 二维卷积层

实例

Conv2D(filters,
       kernel_size,
       strides=(1, 1),
       padding='valid',
       activation=None)
  • filters:卷积核的数目
  • kernel_size:卷积核的尺寸
  • strides:卷积步长
  • padding:填充方式 ('valid' 或 'same')

3. LSTM 长短期记忆网络层

实例

LSTM(units,
     activation='tanh',
     recurrent_activation='hard_sigmoid',
     return_sequences=False)
  • units:正整数,输出空间的维度
  • activation:激活函数
  • recurrent_activation:循环步的激活函数
  • return_sequences:是否返回完整序列

Keras 模型保存与加载

1. 保存整个模型

实例

model.save('my_model.h5')  # 保存架构、权重和训练配置

2. 仅保存架构

实例

json_string = model.to_json()  # 保存为JSON
yaml_string = model.to_yaml()  # 保存为YAML

3. 仅保存权重

实例

model.save_weights('my_model_weights.h5')

4. 加载模型

实例

from tensorflow.keras.models import load_model

model = load_model('my_model.h5')  # 加载完整模型

Keras 回调函数

回调函数是在训练过程中特定时间点被调用的函数,用于:

  • 模型检查点
  • 提前停止
  • 学习率调整
  • 日志记录等

常用回调函数

实例

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping

callbacks = [
    ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True),
    EarlyStopping(monitor='val_loss', patience=3)
]

model.fit(x_train, y_train,
          epochs=10,
          callbacks=callbacks,
          validation_data=(x_val, y_val))

Keras 实践示例:MNIST 手写数字识别

实例

from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.utils import to_categorical

# 加载数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 数据预处理
x_train = x_train.reshape(60000, 28, 28, 1).astype('float32') / 255
x_test = x_test.reshape(10000, 28, 28, 1).astype('float32') / 255
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

# 构建模型
model = Sequential([
    Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),
    Conv2D(64, (3, 3), activation='relu'),
    MaxPooling2D(pool_size=(2, 2)),
    Dropout(0.25),
    Flatten(),
    Dense(128, activation='relu'),
    Dropout(0.5),
    Dense(10, activation='softmax')
])

# 编译模型
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train,
          batch_size=128,
          epochs=12,
          verbose=1,
          validation_data=(x_test, y_test))

# 评估模型
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

Keras 进阶技巧

1. 自定义层

实例

from tensorflow.keras import backend as K
from tensorflow.keras.layers import Layer

class MyLayer(Layer):
    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)
   
    def build(self, input_shape):
        self.kernel = self.add_weight(name='kernel',
                                     shape=(input_shape[1], self.output_dim),
                                     initializer='uniform',
                                     trainable=True)
        super(MyLayer, self).build(input_shape)
   
    def call(self, x):
        return K.dot(x, self.kernel)
   
    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)

2. 自定义损失函数

实例

from tensorflow.keras import backend as K

def custom_loss(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

model.compile(optimizer='adam', loss=custom_loss)

3. 学习率调度

实例

from tensorflow.keras.callbacks import LearningRateScheduler

def scheduler(epoch, lr):
    if epoch < 10:
        return lr
    else:
        return lr * K.exp(-0.1)

callback = LearningRateScheduler(scheduler)
model.fit(x_train, y_train, epochs=15, callbacks=[callback])

Keras 常见问题与解决方案

1. 过拟合问题

  • 增加 Dropout 层
  • 使用 L1/L2 正则化
  • 增加训练数据
  • 使用数据增强

2. 训练速度慢

  • 增加批量大小
  • 使用更简单的模型
  • 尝试不同的优化器
  • 使用 GPU 加速

3. 梯度消失/爆炸

  • 使用 BatchNormalization
  • 使用适当的权重初始化
  • 使用 ReLU 等非饱和激活函数
  • 使用梯度裁剪

总结

Keras 作为 TensorFlow 的高级 API,提供了简单直观的接口来构建和训练深度学习模型。通过本文,你应该已经掌握了:

  1. Keras 的核心概念和基本工作流程
  2. 常用层的使用方法
  3. 模型的保存与加载
  4. 回调函数的使用
  5. 实际项目中的应用示例
  6. 进阶技巧和常见问题解决方案

Keras 的强大之处在于它的灵活性和易用性,使得深度学习模型的开发变得更加高效。随着实践的深入,你将能够构建更加复杂的神经网络模型来解决各种实际问题。