Day 18:Keras深度学习框架入门
📋 目录
- Keras/TensorFlow概述
- 神经网络核心组件
- 模型搭建的两种方式
- 编译与训练
- 回调函数详解
- 过拟合与正则化
第一部分:Keras/TensorFlow概述(1.5小时理论)
1.1 什么是Keras?
Keras 是一个高级神经网络API,最初由François Chollet开发,现在作为TensorFlow的官方高级API。
设计哲学:
- 用户友好:简单一致的API
- 模块化:独立配置的组件
- 可扩展性:易于添加自定义模块
- 多后端支持:TensorFlow, Theano, CNTK
1.2 TensorFlow简介
TensorFlow 是Google开发的端到端机器学习平台。
核心概念:
- Tensor(张量):多维数组
- 计算图:定义计算流程
- 自动微分:自动计算梯度
1.3 Keras vs PyTorch vs Scikit-learn
| 对比项 | Keras/TF | PyTorch | Scikit-learn |
|---|---|---|---|
| 抽象层级 | 高级 | 低级/中级 | 高级 |
| 易用性 | ★★★★★ | ★★★☆☆ | ★★★★★ |
| 灵活性 | ★★★★☆ | ★★★★★ | ★★☆☆☆ |
| 调试难度 | 简单 | 中等 | 简单 |
| 适用场景 | 标准深度学习 | 研究、自定义模型 | 传统ML、小规模DL |
第二部分:神经网络核心组件
2.1 层(Layer)
层是神经网络的基本构建块。
python
# 全连接层
Dense(units=64, activation='relu', input_shape=(input_dim,))
# 激活层
Activation('relu')
# Dropout层
Dropout(rate=0.5)
# 输入层
Input(shape=(input_dim,))
2.2 激活函数
python
# 常用激活函数
activation='relu' # 隐藏层默认选择
activation='sigmoid' # 二分类输出层
activation='softmax' # 多分类输出层
activation='tanh' # 传统选择
activation='linear' # 回归输出层
2.3 损失函数
python
# 二分类
loss='binary_crossentropy'
# 多分类
loss='categorical_crossentropy'
loss='sparse_categorical_crossentropy' # 标签为整数时
# 回归
loss='mse' # 均方误差
loss='mae' # 平均绝对误差
loss='huber' # Huber损失
2.4 优化器
python
# Adam(默认首选)
optimizer='adam'
optimizer=Adam(learning_rate=0.001)
# SGD
optimizer=SGD(learning_rate=0.01, momentum=0.9)
# RMSprop
optimizer=RMSprop(learning_rate=0.001)
2.5 评估指标
python
# 分类任务
metrics=['accuracy']
metrics=['accuracy', 'precision', 'recall']
# 回归任务
metrics=['mae', 'mse']
第三部分:模型搭建的两种方式
3.1 Sequential API(序列式)
适用于简单的前馈网络。
python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
model = Sequential([
Dense(128, activation='relu', input_shape=(input_dim,)),
Dropout(0.3),
Dense(64, activation='relu'),
Dropout(0.3),
Dense(1, activation='sigmoid')
])
3.2 Functional API(函数式)
适用于复杂网络(多输入、多输出、共享层)。
python
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
inputs = Input(shape=(input_dim,))
x = Dense(128, activation='relu')(inputs)
x = Dropout(0.3)(x)
x = Dense(64, activation='relu')(x)
outputs = Dense(1, activation='sigmoid')(x)
model = Model(inputs=inputs, outputs=outputs)
3.3 两种方式对比
| 方面 | Sequential | Functional |
|---|---|---|
| 代码简洁度 | ★★★★★ | ★★★☆☆ |
| 灵活性 | ★★☆☆☆ | ★★★★★ |
| 适用场景 | 简单线性堆叠 | 复杂拓扑结构 |
| 多输入 | 不支持 | 支持 |
| 多输出 | 不支持 | 支持 |
| 共享层 | 不支持 | 支持 |
第四部分:编译与训练
4.1 编译(compile)
配置学习过程。
python
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy']
)
4.2 训练(fit)
python
history = model.fit(
x_train, y_train,
epochs=100,
batch_size=32,
validation_split=0.2, # 从训练集划分验证集
validation_data=(x_val, y_val), # 直接指定验证集
callbacks=[early_stopping], # 回调函数
verbose=1 # 输出详细程度
)
4.3 超参数说明
| 参数 | 说明 | 典型值 |
|---|---|---|
epochs |
完整遍历训练集的次数 | 10-200 |
batch_size |
每次更新使用的样本数 | 16, 32, 64, 128 |
validation_split |
从训练集划分验证集比例 | 0.1-0.2 |
shuffle |
是否打乱数据 | True |
4.4 训练历史(History)
python
# history.history 包含所有指标的每一轮值
loss_history = history.history['loss']
val_loss_history = history.history['val_loss']
accuracy_history = history.history['accuracy']
# 可视化
plt.plot(history.history['loss'], label='训练损失')
plt.plot(history.history['val_loss'], label='验证损失')
第五部分:回调函数(Callbacks)详解
5.1 回调函数概述
回调是在训练过程中特定时刻执行的函数。
python
from tensorflow.keras.callbacks import (
EarlyStopping, ModelCheckpoint, ReduceLROnPlateau,
TensorBoard, CSVLogger
)
5.2 EarlyStopping(早停)
作用:验证集性能不再提升时停止训练。
python
early_stopping = EarlyStopping(
monitor='val_loss', # 监控指标
patience=10, # 连续多少轮不提升则停止
min_delta=1e-4, # 最小变化阈值
restore_best_weights=True # 恢复最佳权重
)
5.3 ModelCheckpoint(模型保存)
作用:保存训练过程中的最佳模型。
python
checkpoint = ModelCheckpoint(
'best_model.h5',
monitor='val_accuracy',
save_best_only=True,
save_weights_only=False,
mode='max' # 'max'表示越大越好,'min'表示越小越好
)
5.4 ReduceLROnPlateau(学习率衰减)
作用:验证集性能停滞时降低学习率。
python
reduce_lr = ReduceLROnPlateau(
monitor='val_loss',
factor=0.5, # 学习率乘以因子
patience=5, # 等待轮数
min_lr=1e-6 # 最小学习率
)
5.5 CSVLogger(日志记录)
python
csv_logger = CSVLogger('training_log.csv', append=True)
5.6 TensorBoard(可视化)
python
tensorboard = TensorBoard(log_dir='./logs')
第六部分:过拟合与正则化
6.1 Dropout层
原理:训练时随机丢弃一定比例的神经元,防止共适应。
python
# 添加Dropout层
model.add(Dropout(rate=0.5)) # 50%的神经元被丢弃
# Dropout率建议
# 输入层: 0.1-0.2
# 隐藏层: 0.3-0.5
# 输出层: 0(不建议)
6.2 L1/L2正则化
python
from tensorflow.keras.regularizers import l1, l2, l1_l2
# L2正则化
Dense(64, activation='relu', kernel_regularizer=l2(0.01))
# L1正则化
Dense(64, activation='relu', kernel_regularizer=l1(0.01))
# L1+L2
Dense(64, activation='relu', kernel_regularizer=l1_l2(l1=0.01, l2=0.01))
6.3 Batch Normalization
作用:层间标准化,稳定训练。
python
from tensorflow.keras.layers import BatchNormalization
model.add(Dense(64))
model.add(BatchNormalization())
model.add(Activation('relu'))