目录
7.1 Keras函数式API
1.API简介
2.多输入模型
3.多输出模型
4.层组成的有向无环图
5.共享层权重
6.将模型作为层
7.2 使用回调函数和TensorBoard检查并监控深度学习模型
1.回调函数作用于模型
2.TensorBoard
7.3 发挥模型性能
1.高级架构模式
2.超参数优化
3.模型集成
4.结论
7.1 Keras函数式API
Sequential模型:
Inception模块:
残差连接:
1.API简介
from keras import Input, layers
input_tensor = Input(shape=(32,))
dense = layers.Dense(32, activation='relu')
output_tensor = dense(input_tensor)
对比:
from keras.models import Sequential, Model from keras import layers from keras import Input seq_model = Sequential() seq_model.add(layers.Dense(32, activation='relu', input_shape=(64,))) seq_model.add(layers.Dense(32, activation='relu')) seq_model.add(layers.Dense(10, activation='softmax')) input_tensor = Input(shape=(64,)) x = layers.Dense(32, activation='relu')(input_tensor) x = layers.Dense(32, activation='relu')(x) output_tensor = layers.Dense(10, activation='softmax')(x) model = Model(input_tensor, output_tensor) model.summary()
2.多输入模型
双输入模型
训练方法:可以向模型输入一个由Numpy 数组组成的列表,也可以输入一个将输入名称映射为Numpy 数组的字典。
import numpy as np
num_samples = 1000
max_length = 100
text = np.random.randint(1, text_vocabulary_size,
size=(num_samples, max_length))
question = np.random.randint(1, question_vocabulary_size,
size=(num_samples, max_length))
answers = np.random.randint(answer_vocabulary_size, size=(num_samples))
answers = keras.utils.to_categorical(answers, answer_vocabulary_size)
model.fit([text, question], answers, epochs=10, batch_size=128)
model.fit({'text': text, 'question': question}, answers,
epochs=10, batch_size=128)
3.多输出模型
三输出:
4.层组成的有向无环图
(1)inception模块
(2)残差连接
残差连接是让前面某层的输出作为后面某层的输入,从而在序列网络中有效地创造了一条捷径
可以解决表示瓶颈:在Sequential 模型中,每个连续的表示层都构建于前一层之上,这意味着它能访问前一层激活中包含的信息。如果某一层太小(比如特征维度太低),那么模型将会受限于该层激活中能够塞入多少信息。梯度消失:如果这个反馈信号的传播需要经过很多层,那么信号可能会变得非常微弱,甚至完全丢失,导致网络无法训练。
5.共享层权重
即几个分支全都共享相同的知识并执行相同的运算
6.将模型作为层
from keras import layers
from keras import applications
from keras import Input
xception_base = applications.Xception(weights=None,
include_top=False)
left_input = Input(shape=(250, 250, 3))
right_input = Input(shape=(250, 250, 3))
left_features = xception_base(left_input)
right_input = xception_base(right_input)
merged_features = layers.concatenate(
[left_features, right_input], axis=-1)
7.2 使用回调函数和TensorBoard检查并监控深度学习模型
1.回调函数作用于模型
1.回调函数作用于模型
回调函数(callback)是在调用fit 时传入模型的一个对象,它在训练过程中的不同时间点都会被模型调用。
包括:(1)模型检查点(model checkpointing):在训练过程中的不同时间点保存模型的当前权重。
(2)提前终止(early stopping):如果验证损失不再改善,则中断训练(当然,同时保存在训
练过程中得到的最佳模型)。
(3)在训练过程中动态调节某些参数值:比如优化器的学习率。
(4)在训练过程中记录训练指标和验证指标,或将模型学到的表示可视化(这些表示也在不断更新)
回调函数:
(1)ModelCheckpoint 与EarlyStopping
EarlyStopping 回调函数来中断训练;ModelCheckpoint可以在训练过程中持续不断地保存模型
(2)ReduceLROnPlateau
如果验证损失不再改善,你可以使用这个回调函数来降低学习率
(3)自编写回调函数
2.TensorBoard
在训练过程中以可视化的方式监控指标;将模型架构可视化;将激活和梯度的直方图可视化;以三维的形式研究嵌入
7.3 发挥模型性能
1.高级架构模式
(1)批标准化
BatchNormalization 层通常在卷积层或密集连接层之后使用
(2)深度可分离卷积
对输入的每个通道分别执行空间卷积,然后通过逐点卷积(1×1 卷积)将输出通道混合
2.超参数优化
优化过程:
(1) 选择一组超参数(自动选择)。
(2) 构建相应的模型。
(3) 将模型在训练数据上拟合,并衡量其在验证数据上的最终性能。
(4) 选择要尝试的下一组超参数(自动选择)。
(5) 重复上述过程。
(6) 最后,衡量模型在测试数据上的性能。
3.模型集成
将一系列不同模型的预测结果汇集到一起,从而得到更好的预测结果
4.结论
(1)构建高性能的深度卷积神经网络时,你需要使用残差连接、批标准化和深度可分离卷积。
未来,无论是一维、二维还是三维应用,深度可分离卷积很可能会完全取代普通卷积,因为它的表示效率更高。
(2)构建深度网络需要选择许多超参数和架构,这些选择共同决定了模型的性能。与其将这些选择建立在直觉或随机性之上,不如系统性地搜索超参数空间,以找到最佳选择。目前,这个搜索过程的计算代价还很高,使用的工具也不是很好。但Hyperopt 和Hyperas 这两个库可能会对你有所帮助。进行超参数优化时,一定要小心验证集过拟合!
(3)想要在机器学习竞赛中获胜,或者想要在某项任务上获得最佳结果,只能通过多个模型的集成来实现。利用加权平均(权重已经过优化)进行集成通常已经能取得足够好的效果。请记住,多样性就是力量。将非常相似的模型集成基本上是没有意义的。最好的集成方法是将尽可能不同的一组模型集成(这组模型还需要具有尽可能高的预测能力)



