【问题标题】:How to replace Activation layer of existing model in Keras/Tensorflow?如何在 Keras/Tensorflow 中替换现有模型的激活层?
【发布时间】:2021-02-26 19:29:05
【问题描述】:

我有一个使用 Swish (SiLU) 激活的预训练模型:

from tensorflow.keras.applications import EfficientNetB0

e_net = EfficientNetB0(weights='imagenet', include_top=False)

我想用 LeakyReLU 替换它的所有激活。对于 ReLU 或 Sigmoid 等基本函数,可以像这样轻松替换:

from tensorflow.python.keras.layers import Activation
from tensorflow.keras import activations

for layer in e_net.layers:
    if isinstance(layer, Activation):
        layer.activation = activations.get('relu')

但是这个模块中没有 LeakyRelu 函数。相反,它被实现为单独的层,我不知道如何替换它。直接修改无效(即使在重新编译模型或从文件保存/加载后):

from tensorflow.keras.layers import LeakyReLU

for i, layer in enumerate(e_net.layers):
    if isinstance(layer, Activation):
        name = layer.name
        model.layers[i] = LeakyReLU(name=name) # does not work

【问题讨论】:

    标签: python tensorflow keras deep-learning


    【解决方案1】:

    如果您必须从代码 sn-p 替换所有激活,那么您在正确的路径上。 您的代码 model.layers[i] = LeakyReLU(name=name) 存在问题。使用名称作为参数将不起作用。 你可以试试下面的代码:

    import tensorflow as tf
    from tensorflow.keras.layers import LeakyReLU
    l_relu = LeakyReLU(alpha=0.3)
    
    for layer in e_net.layers:
        if (hasattr(layer,'activation'))==True:
              layer.activation = l_relu
    

    干杯,希望对你有帮助!

    【讨论】:

    • 成功了,谢谢 :) LeakyReLU(name=name) 也有效,它只是复制替换的激活层名称。
    • 哦,太好了,如果您能接受答案,那就太好了! :)
    猜你喜欢
    • 2021-05-20
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多