深度学习---高层框架keras

一、Keras 简介与环境配置

Keras 是一个开源的深度学习框架,专为快速搭建和实验深度学习模型而设计。它是一个高层神经网络 API,用 Python 语言编写,强调易用性、模块化和可扩展性,允许开发者通过简单的代码快速实现各种深度学习模型(如 CNN、RNN、Transformer 等),尤其适合新手入门和快速验证算法原型

1. 框架定位
  • 高层神经网络 API:基于 Python,运行于 TensorFlow、Theano 等后端(当前默认后端为 TensorFlow)。
  • 设计理念:简单易用(快速原型开发)、模块化(层与模型可复用)、扩展性强(支持自定义组件)。
2. 安装与验证
# 安装(基于 TensorFlow 后端)
pip install tensorflow  # 包含 Keras
# 验证
import tensorflow as tf
print(tf.keras.__version__)  # 查看版本
3. 核心优势
  • 易用性:极简的模型搭建流程(如 model.add())。
  • 灵活性:支持 Sequential、Functional、Subclassing 三种模型风格。
  • 生态整合:无缝集成 TensorFlow 生态(如 Dataset、Estimator)。

二、核心概念:张量、层与模型

1. 张量(Tensor)
  • 数据载体:Keras 中所有操作基于张量(多维数组),支持形状自动推断。
  • 常见类型
    • 标量(0D):shape=( )
    • 向量(1D):shape=(None,)(batch_size,)
    • 矩阵(2D):shape=(batch_size, features)
    • 图像(3D/4D):(batch, height, width, channels)(RGB 为 3 通道)
    • 序列(3D):(batch, timesteps, features)
2. 层(Layer)
  • 功能单元:神经网络的基本组件,负责对张量的变换。
  • 核心属性
    • input_shape:输入张量形状(不包含 batch 维度)。
    • output_shape:输出张量形状。
    • weights:层的可训练参数(如权重矩阵、偏置项)。
  • 分类
    • 核心层Dense(全连接层)、Activation(激活函数层)、Dropout(随机失活层)、Flatten(展平层)。
    • 卷积层Conv2D(二维卷积)、MaxPooling2D(最大池化)、Conv1D(一维卷积,用于序列数据)。
    • 循环层LSTMGRU(处理序列数据,如文本、时间序列)。
    • 预处理层TextVectorization(文本向量化)、Normalization(数值归一化)、Resizing(图像尺寸调整)。
    • 注意力层AttentionMultiHeadAttention(Transformer 架构核心)。
    • 高级层Embedding(词嵌入层,用于 NLP)、Concatenate(张量拼接)、Add(张量相加)。
3. 模型(Model)
  • 定义:层的有序组合,分为 Sequential 模型(线性堆叠)和 Functional 模型(灵活拓扑结构)。
  • 关键方法
    • compile():配置训练参数(优化器、损失函数、评估指标)。
    • fit():执行训练过程(输入数据、epochs、批次大小等)。
    • evaluate():评估模型在测试集上的性能。
    • predict():对新数据进行预测。

三、模型构建方式

1. Sequential 模型(适用于简单线性结构)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Conv2D

model = Sequential([
    Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    MaxPooling2D((2, 2)),
    Flatten(),
    Dense(10, activation='softmax')  # 分类输出层
])
model.summary()  # 打印模型结构
2. Functional API(适用于复杂拓扑,如多输入/输出)
from tensorflow.keras.layers import Input, Dense, Concatenate
from tensorflow.keras.models import Model

# 定义输入
input_a = Input(shape=(10,))
input_b = Input(shape=(20,))

# 定义分支
branch_a = Dense(64, activation='relu')(input_a)
branch_b = Dense(64, activation='relu')(input_b)

# 合并输出
merged = Concatenate()([branch_a, branch_b])
output = Dense(1, activation='sigmoid')(merged)

# 构建模型
model = Model(inputs=[input_a, input_b], outputs=output)
model.compile(optimizer='adam', loss='binary_crossentropy')
3. Subclassing 模型(适用于完全自定义逻辑)
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, LSTM

class CustomModel(Model):
    def __init__(self, units):
        super().__init__()
        self.lstm = LSTM(units, return_sequences=True)
        self.dense = Dense(1)
    
    def call(self, inputs):
        x = self.lstm(inputs)  # 输入形状:(batch, timesteps, features)
        return self.dense(x[:, -1, :])  # 取最后一个时间步输出

model = CustomModel(64)
model.compile(optimizer='rmsprop', loss='mse')

四、训练配置:损失、优化器与评估指标

1. 损失函数(Loss Functions)
  • 分类任务
    • sparse_categorical_crossentropy:标签为整数(未独热编码)。
    • categorical_crossentropy:标签为独热编码(需配合 softmax 激活)。
    • binary_crossentropy:二分类任务(配合 sigmoid 激活)。
  • 回归任务
    • mean_squared_error(MSE):均方误差。
    • mean_absolute_error(MAE):平均绝对误差。
  • 自定义损失
    def custom_loss(y_true, y_pred):
        return tf.reduce_mean(tf.square(y_true - y_pred))  # 均方损失
    model.compile(loss=custom_loss, optimizer='adam')
    
2. 优化器(Optimizers)
  • 常用优化器
    • Adam:自适应学习率(默认参数:lr=0.001beta_1=0.9beta_2=0.999)。
    • SGD:随机梯度下降(可搭配 MomentumNesterov 加速)。
    • RMSprop:均方根传播(适合循环神经网络)。
  • 配置示例
    from tensorflow.keras.optimizers import Adam
    optimizer = Adam(learning_rate=0.0001, decay=1e-6)
    model.compile(optimizer=optimizer, loss='mse')
    
3. 评估指标(Metrics)
  • 分类指标accuracyprecisionrecallAUC
  • 回归指标maemsermse(需自定义,如 tf.sqrt(mse))。
  • 多指标配置
    model.compile(
        optimizer='adam',
        loss='categorical_crossentropy',
        metrics=['accuracy', tf.keras.metrics.Precision()]
    )
    

五、模型训练与回调函数

1. 训练流程
# 假设 X_train, y_train 为训练数据,X_test, y_test 为测试数据
history = model.fit(
    X_train, y_train,
    epochs=10,
    batch_size=32,
    validation_split=0.2,  # 自动划分 20% 数据为验证集
    shuffle=True
)

# 评估
loss, accuracy = model.evaluate(X_test, y_test, verbose=0)
print(f"Test accuracy: {accuracy}")
2. 回调函数(Callbacks)
  • 常用回调
    • ModelCheckpoint:保存最优模型(如 save_best_only=True)。
    • EarlyStopping:监控验证指标,提前终止训练(如 patience=3)。
    • TensorBoard:可视化训练过程(需安装 tensorboard 插件)。
    • LearningRateScheduler:动态调整学习率。
  • 示例:组合使用回调
    from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
    
    checkpoint = ModelCheckpoint(
        'best_model.h5', 
        monitor='val_loss', 
        save_best_only=True, 
        mode='min'
    )
    
    early_stop = EarlyStopping(
        monitor='val_accuracy', 
        patience=5, 
        restore_best_weights=True
    )
    
    model.fit(X_train, y_train, callbacks=[checkpoint, early_stop])
    

六、数据预处理与增强

1. 预处理层(内置支持)
  • 文本处理TextVectorization 层(将文本转为 token 序列或嵌入索引)。
    from tensorflow.keras.layers import TextVectorization
    
    text_vectorizer = TextVectorization(
        max_tokens=10000,  # 保留前 10000 个高频词
        output_mode='int'  # 输出整数索引
    )
    text_vectorizer.adapt(text_dataset)  # 在数据集上适配
    
  • 数值归一化Normalization 层(标准化输入数据)。
    from tensorflow.keras.layers import Normalization
    
    normalizer = Normalization(axis=-1)  # 对最后一维归一化
    normalizer.adapt(X_train)  # 计算均值和方差
    
2. 图像数据增强(ImageDataGenerator)
from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
    rotation_range=20,       # 随机旋转角度
    width_shift_range=0.2,   # 水平平移范围
    height_shift_range=0.2,  # 垂直平移范围
    shear_range=0.2,         # 错切变换
    zoom_range=0.2,          # 随机缩放
    horizontal_flip=True     # 水平翻转
)

# 生成增强数据(配合 flow_from_directory 加载图像)
train_generator = datagen.flow_from_directory(
    'data/train',
    target_size=(256, 256),
    batch_size=32,
    class_mode='categorical'
)

七、高级主题

1. 自定义层(Custom Layer)
from tensorflow.keras.layers import Layer
import tensorflow as tf

class MyDense(Layer):
    def __init__(self, units, activation=None):
        super().__init__()
        self.units = units
        self.activation = tf.keras.activations.get(activation)
    
    def build(self, input_shape):
        self.w = self.add_weight(
            shape=(input_shape[-1], self.units),
            initializer='glorot_uniform',
            trainable=True
        )
        self.b = self.add_weight(
            shape=(self.units,),
            initializer='zeros',
            trainable=True
        )
        super().build(input_shape)  # 标记层已构建
    
    def call(self, inputs):
        return self.activation(tf.matmul(inputs, self.w) + self.b)

# 使用自定义层
model = Sequential([MyDense(64, activation='relu'), Dense(10)])
2. 迁移学习(Transfer Learning)
  • 步骤
    1. 加载预训练模型(如 ResNet50),冻结底层卷积层。
    2. 添加新的分类层,训练新层参数。
    3. 可选:解冻部分底层,微调整个模型。
  • 代码示例
    from tensorflow.keras.applications import ResNet50
    from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
    
    # 加载预训练模型(不包含顶层)
    base_model = ResNet50(
        weights='imagenet',
        include_top=False,
        input_shape=(224, 224, 3)
    )
    base_model.trainable = False  # 冻结底层
    
    # 构建新模型
    inputs = tf.keras.Input(shape=(224, 224, 3))
    x = base_model(inputs, training=False)  # 推理模式(不更新冻结层)
    x = GlobalAveragePooling2D()(x)
    outputs = Dense(10, activation='softmax')(x)
    model = Model(inputs, outputs)
    model.compile(optimizer='adam', loss='categorical_crossentropy')
    
3. 分布式训练(Multi-GPU)
import tensorflow as tf

# 配置镜像策略(多 GPU 同步训练)
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
    model = Sequential([Dense(64, activation='relu'), Dense(10)])
    model.compile(optimizer='adam', loss='mse')

# 训练(自动将数据分发到各 GPU)
model.fit(X_train, y_train, batch_size=64 * strategy.num_replicas_in_sync)

八、模型保存与部署

1. 保存格式
  • HDF5 格式(.h5):保存模型结构、权重和训练配置。
    model.save('model.h5')
    loaded_model = tf.keras.models.load_model('model.h5')
    
  • SavedModel 格式(推荐):TensorFlow 原生格式,支持生产环境部署。
    model.save('saved_model', save_format='tf')
    
2. 导出为推理模型
  • 移除训练相关组件(如 dropout),指定输入形状:
    # 定义推理模型(固定输入形状)
    inference_model = tf.keras.Model(
        inputs=model.input,
        outputs=model.output,
        name="inference_model"
    )
    inference_model.save('inference_model', save_format='tf')
    

九、常见问题与最佳实践

1. 过拟合处理
  • 策略
    • 添加 Dropout 层(如 Dropout(0.2))。
    • 使用权重正则化(l1/l2 正则化):
      from tensorflow.keras.layers import Dense
      from tensorflow.keras import regularizers
      
      Dense(64, activation='relu', kernel_regularizer=regularizers.l2(0.01))
      
    • 增大训练数据或使用数据增强。
2. 学习率调优
  • 使用 LearningRateScheduler 动态调整:
    def lr_schedule(epoch):
        return 1e-3 * 0.95 ** epoch
    
    model.compile(optimizer=Adam(learning_rate=lr_schedule), loss='mse')
    
3. 多输出模型
  • 为每个输出指定独立损失和权重:
    model.compile(
        optimizer='adam',
        loss={'out1': 'mse', 'out2': 'binary_crossentropy'},
        loss_weights={'out1': 1.0, 'out2': 0.5}
    )
    

十、生态与扩展

1. 与 TensorFlow 深度集成
  • 使用 tf.data.Dataset 加载数据(高效预处理):
    dataset = tf.data.Dataset.from_tensor_slices((X_train, y_train))
    dataset = dataset.shuffle(1024).batch(32).prefetch(tf.data.AUTOTUNE)
    model.fit(dataset, epochs=10)
    
2. 超参数调优(Keras Tuner)
from kerastuner import RandomSearch

def build_model(hp):
    model = Sequential()
    model.add(Dense(hp.Int('units', min=32, max=256, step=32), activation='relu'))
    model.add(Dense(10, activation='softmax'))
    model.compile(optimizer=Adam(hp.Choice('lr', [1e-3, 1e-4])), loss='categorical_crossentropy')
    return model

tuner = RandomSearch(build_model, objective='val_accuracy', max_trials=5)
tuner.search(X_train, y_train, epochs=10, validation_split=0.2)
best_model = tuner.get_best_models()[0]

总结

Keras 通过抽象底层细节,提供了从数据预处理到模型部署的全流程支持,尤其适合快速验证算法思路和原型开发。掌握其核心逻辑(层的组合、损失与优化器配置、回调机制)后,结合 TensorFlow 生态可进一步扩展至复杂场景(如分布式训练、自定义算子)。建议通过实战项目(如图像分类、NLP 情感分析)加深理解,并关注官方文档(Keras Documentation)获取最新特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值