python - 建议在使用 tensorflow/keras 部署之前移除 dropout 吗?
问题描述
我有一个训练有素的 keras 模型,我计划使用 tensorflow 服务,它在其架构中多次使用 dropout 层,但我很久以前在某处读到 dropout 层没有被冻结,实际上使模型输出不同的结果“控制台中的结果”如果仍然包含在服务模型中......这个模型是我通常加载的模型列表中的 1,如下所示:
from keras.models import load_model
modelList = []
for filee in os.listdir("/kaggle/input/models/"):
tempMod = load_model("/kaggle/input/models/" + str(filee) )
tempMod.trainable = False
modelList.append(tempMod)
print("/kaggle/input/models/" + str(filee) )
print(modelList)
- 我不确定这些信息,我真的需要在服务之前手动删除 dropout 层吗?
- 如果是,我该如何从我训练有素的模型中无损地移除上述层。这是我的模型摘要/架构:
Model: "model_24" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_32 (InputLayer) (None, 128, 157, 1) 0 _________________________________________________________________ conv2d_103 (Conv2D) (None, 126, 154, 32) 416 _________________________________________________________________ max_pooling2d_87 (MaxPooling (None, 63, 77, 32) 0 _________________________________________________________________ dropout_87 (Dropout) (None, 63, 77, 32) 0 _________________________________________________________________ conv2d_104 (Conv2D) (None, 61, 75, 64) 18496 _________________________________________________________________ max_pooling2d_88 (MaxPooling (None, 20, 25, 64) 0 _________________________________________________________________ dropout_88 (Dropout) (None, 20, 25, 64) 0 _________________________________________________________________ conv2d_105 (Conv2D) (None, 18, 23, 512) 295424 _________________________________________________________________ max_pooling2d_89 (MaxPooling (None, 6, 7, 512) 0 _________________________________________________________________ dropout_89 (Dropout) (None, 6, 7, 512) 0 _________________________________________________________________ conv2d_106 (Conv2D) (None, 4, 5, 1024) 4719616 _________________________________________________________________ max_pooling2d_90 (MaxPooling (None, 2, 2, 1024) 0 _________________________________________________________________ dropout_90 (Dropout) (None, 2, 2, 1024) 0 _________________________________________________________________ flatten_24 (Flatten) (None, 4096) 0 _________________________________________________________________ dense_47 (Dense) (None, 128) 524416 _________________________________________________________________ dropout_92 (Dropout) (None, 128) 0 _________________________________________________________________ dense_48 (Dense) (None, 50) 6450 ================================================================= Total params: 11,129,636 Trainable params: 5,564,818 Non-trainable params: 5,564,818 _________________________________________________________________
解决方案
是的,这确实是真的。你不应该在推理过程中使用 Dropout 层。Dropout 是一种正则化器,粗略地说,它使神经网络更难学习任务,从而提供更好的泛化误差。
幸运的是,在使用 Keras 时,如果您选择 model.predict() 默认不使用 dropout 层。
对于 tensorflow 服务,您只需从模型定义中删除 dropout 层并在当前加载时加载。由于 dropout 层没有与之关联的权重,因此一切都会正常工作
推荐阅读
- php - 如何链接到页面的特定部分 HTML PHP
- c# - 当后端代码中的简单键值变量工作相同时,为什么要使用 redis 作为缓存层?
- google-apps-script - Google Slides Apps 脚本检索页面中的形状
- python-3.x - 在 KNeighborsClassifier 中使用自定义指标时,我不断收到“TypeError:只有整数标量数组可以转换为标量索引”
- java - JavaFX - 在使用选项卡时将 GUI 拆分为单独的类
- jquery - 通过函数调整电子窗口大小
- scheme - 匹配方案中的括号
- android - 当我使用 adb 显示 /sys/kernel/debug/tracing/available_filter_functions 时没有这样的设备
- python - 初始化以迭代抽象pyomo模型中的集合?
- angular-cli - 运行 ng serve -o 时出现错误