解决Keras 2.3.1版本中无法导入HeNormal初始化器的ImportError问题
问题解决思路
这个问题我之前碰到过,核心原因很直白:HeNormal初始化器是在Keras 2.4.0版本中才新增的,而你当前用的是2.3.1版本,自然找不到这个类,所以会抛出ImportError。
下面给你两种可行的解决办法,按需选择就行:
方案一:升级Keras版本
既然你的环境是conda管理的,直接用conda命令把keras-gpu升级到2.4.0及以上版本即可:
conda install -c anaconda keras-gpu=2.4.0
注意:Keras和TensorFlow版本有严格的兼容性对应关系,Keras 2.4.0需要搭配TensorFlow 2.3.x及以上版本。如果升级后出现TensorFlow相关报错,记得同步升级TensorFlow-GPU:
conda install -c anaconda tensorflow-gpu=2.3.0
方案二:不升级,手动替代HeNormal功能
如果你不想升级Keras(比如担心环境依赖冲突),可以用两种方式实现和HeNormal完全一致的效果:
方式1:用内置的VarianceScaling替代
HeNormal本质就是VarianceScaling的一种特定配置,直接用下面的代码代替HeNormal即可:
from keras.initializers import VarianceScaling # 这行代码等价于原生HeNormal he_normal_init = VarianceScaling(scale=2.0, mode='fan_in', distribution='normal', seed=None)
后续在模型层里用he_normal_init作为初始化器就行,效果和原生HeNormal一模一样。
方式2:自定义HeNormal初始化器
如果你想保留HeNormal的类名,也可以自己实现一个:
from keras.initializers import Initializer import numpy as np from keras import backend as K class HeNormal(Initializer): def __init__(self, seed=None): self.seed = seed def __call__(self, shape, dtype=None): # 计算输入神经元数量fan_in fan_in = shape[0] if len(shape) == 1 else np.prod(shape[:-1]) std = np.sqrt(2. / fan_in) return K.random_normal(shape, mean=0., stddev=std, seed=self.seed, dtype=dtype)
定义完这个类后,你就可以像原来一样直接在脚本里使用它,或者把它放在单独的模块里导入调用。
内容的提问来源于stack exchange,提问作者stopper
相关产品推荐
相关产品推荐

