【问题标题】:Unable to load_model due to 'unknown activation_function: LeakyReLU'由于“未知的激活函数:LeakyReLU”而无法加载模型
【发布时间】:2021-04-16 20:35:00
【问题描述】:

我已经构建、安装并保存了以下模型:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras import preprocessing
from tensorflow.keras.models import Sequential
import config
from tensorflow.keras import applications  

model = Sequential()  
model.add(layers.Flatten(input_shape=input_shape.shape[1:]))  
model.add(layers.Dense(100, activation=keras.layers.LeakyReLU(alpha=0.3)))  
model.add(layers.Dropout(0.5))  
model.add(layers.Dense(50, activation=keras.layers.LeakyReLU(alpha=0.3)))  
model.add(layers.Dropout(0.3)) 
model.add(layers.Dense(num_classes, activation='softmax'))

我正在使用 load_model 函数进行评估,到目前为止我还没有遇到任何问题,但我现在收到以下错误:

ValueError: Unknown activation function: LeakyReLU

我应该对架构进行任何语法更改,还是这里有更深层次的问题?任何建议都将不胜感激,因为我已经尝试设置一些自定义对象,如下所述:https://github.com/BBQuercus/deepBlink/issues/107

编辑: 我在调用 load_model 的文件中的导入如下:

import config
import numpy as np
from tensorflow.keras.preprocessing.image import img_to_array, load_img 
from models.create_image_model import make_vgg
import argparse
from tensorflow.keras.models import load_model
import time
from tensorflow import keras
from tensorflow.keras import layers

【问题讨论】:

  • 您应该将所有相关的导入添加到您的问题中。
  • @desertnaut 我尝试在没有keras.layerskeras.layers 的情况下添加,结果相同
  • 据我所知,您已经导入了所有模块。但是你能不能尝试再添加一个模块from keras.layers import LeakyReLU 并通过model.add(layers.Dense(100, activation=LeakyReLU(alpha=0.3)))添加模型 更新code 类似地更新所有模型
  • @JayPatel 你好,我会试试这个并回复你。谢谢。只是为了获取更多信息,我在一个单独的文件中构建我的模型,从我调用 load_model 的位置。
  • @desertnaut 我将我的两个文件的导入语句都放在了编辑中;我将模型创建的导入语句放在相关的代码块中。

标签: python tensorflow keras neural-network relu


【解决方案1】:

在保存和加载具有此类“非标准”激活的模型时似乎存在一些问题,正如 this SO thread 中所暗示的那样;最安全的方法似乎是用 LeakyReLU 作为层而不是激活来重写你的模型:

model = Sequential()  
model.add(layers.Flatten(input_shape=input_shape.shape[1:]))  
model.add(layers.Dense(100)) # no activation here
model.add(layers.LeakyReLU(alpha=0.3)) # activation layer here instead 
model.add(layers.Dropout(0.5))  
model.add(layers.Dense(50)) # no activation here
model.add(layers.LeakyReLU(alpha=0.3))  # activation layer here instead
model.add(layers.Dropout(0.3)) 
model.add(layers.Dense(num_classes, activation='softmax'))

这完全等同于您自己的模型,并且更符合 Keras 的设计选择——无论好坏,它都将 LeakyReLU 作为一个层,而不是作为标准的激活函数。

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 2023-03-30
    • 2019-09-10
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2013-01-13
    相关资源
    最近更新 更多