首页 > 解决方案 > 建议在使用 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)
  1. 我不确定这些信息,我真的需要在服务之前手动删除 dropout 层吗?
  2. 如果是,我该如何从我训练有素的模型中无损地移除上述层。这是我的模型摘要/架构:
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
_________________________________________________________________

标签: pythontensorflowkeras

解决方案


是的,这确实是真的。你不应该在推理过程中使用 Dropout 层。Dropout 是一种正则化器,粗略地说,它使神经网络更难学习任务,从而提供更好的泛化误差。

幸运的是,在使用 Keras 时,如果您选择 model.predict() 默认不使用 dropout 层。

对于 tensorflow 服务,您只需从模型定义中删除 dropout 层并在当前加载时加载。由于 dropout 层没有与之关联的权重,因此一切都会正常工作


推荐阅读