Keras - LeakyReLU 保存模型时没有属性名称错误

Posted

技术标签:

【中文标题】Keras - LeakyReLU 保存模型时没有属性名称错误【英文标题】:Keras - LeakyReLU has no attribute name error when saving model 【发布时间】:2019-08-07 04:44:54 【问题描述】:

我在我的模型中使用了 LeakyReLU 激活。我可以训练它。但是当我训练保存模型时,

discriminator_model.save(os.path.join(output_folder_path, 'discriminator_model_0.h5'.format(iteration_no)))

我收到以下错误

AttributeError: 'LeakyReLU' object has no attribute '__name__'

我正在使用带有 tensorflow-gpu 1.12.0 后端的 keras-gpu 2.2.4。这是我的模型:

discriminator_model = Sequential()
discriminator_model.add(Conv2D(64, 5, strides=2, input_shape=(28, 28, 1), padding='same', activation=LeakyReLU(alpha=0.2)))
discriminator_model.add(Dropout(0.4))
discriminator_model.add(Conv2D(128, 5, strides=2, padding='same'))
discriminator_model.add(LeakyReLU(alpha=0.2))
discriminator_model.add(Dropout(0.4))
discriminator_model.add(Conv2D(256, 5, strides=2, padding='same'))
discriminator_model.add(LeakyReLU(alpha=0.2))
discriminator_model.add(Dropout(0.4))
discriminator_model.add(Conv2D(512, 5, strides=2, padding='same'))
discriminator_model.add(LeakyReLU(alpha=0.2))
discriminator_model.add(Dropout(0.4))
discriminator_model.add(Flatten())
discriminator_model.add(Dense(1))
discriminator_model.add(Activation('sigmoid'))
discriminator_model.summary()

最初,我使用的是

discriminator_model.add(Conv2D(128, 5, strides=2, padding='same', activation=LeakyReLU(alpha=0.2)))

但有人建议 here 和 here 添加 LeakyReLU 作为单独的激活层。即使尝试了也没有运气。

完整的堆栈跟踪:

Traceback (most recent call last):
  File "/opt/PyCharm/pycharm-community-2018.3.3/helpers/pydev/pydevd.py", line 1741, in <module>
    main()
  File "/opt/PyCharm/pycharm-community-2018.3.3/helpers/pydev/pydevd.py", line 1735, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "/opt/PyCharm/pycharm-community-2018.3.3/helpers/pydev/pydevd.py", line 1135, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/opt/PyCharm/pycharm-community-2018.3.3/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "..../Workspace/src/v01/MnistTrainer.py", line 100, in <module>
    main()
  File "..../Workspace/src/v01/MnistTrainer.py", line 92, in main
    mnist_trainer.train(train_steps=100, log_interval=1, save_interval=1)
  File "..../Workspace/src/v01/MnistTrainer.py", line 56, in train
    self.save_models(output_folder_path, i + 1)
  File "..../Workspace/src/v01/MnistTrainer.py", line 69, in save_models
    os.path.join(output_folder_path, 'discriminator_model_0.h5'.format(iteration_no)))
  File "..../.conda/envs/e0_270_ml_3.6/lib/python3.6/site-packages/keras/engine/network.py", line 1090, in save
    save_model(self, filepath, overwrite, include_optimizer)
  File "..../.conda/envs/e0_270_ml_3.6/lib/python3.6/site-packages/keras/engine/saving.py", line 382, in save_model
    _serialize_model(model, f, include_optimizer)
  File "..../.conda/envs/e0_270_ml_3.6/lib/python3.6/site-packages/keras/engine/saving.py", line 83, in _serialize_model
    model_config['config'] = model.get_config()
  File "..../.conda/envs/e0_270_ml_3.6/lib/python3.6/site-packages/keras/engine/sequential.py", line 278, in get_config
    'config': layer.get_config()
  File "..../.conda/envs/e0_270_ml_3.6/lib/python3.6/site-packages/keras/layers/convolutional.py", line 493, in get_config
    config = super(Conv2D, self).get_config()
  File "..../.conda/envs/e0_270_ml_3.6/lib/python3.6/site-packages/keras/layers/convolutional.py", line 226, in get_config
    'activation': activations.serialize(self.activation),
  File "..../.conda/envs/e0_270_ml_3.6/lib/python3.6/site-packages/keras/activations.py", line 176, in serialize
    return activation.__name__
AttributeError: 'LeakyReLU' object has no attribute '__name__'

【问题讨论】:

可以添加导入吗?你在混合 keras 和 tf.keras 吗?重现问题的自包含示例将是最好的 【参考方案1】:

编辑部分(感谢@NagabhushanSN 提及剩余问题)

有一行代码我们还有 discriminator_model.add(Conv2D(64, 5, strides=2, input_shape=(28, 28, 1), padding='same', activation=LeakyReLU(alpha=0.2))) ,它是代码的第二行。

如果我们修改那行,最终更正的代码应该是这样的:

discriminator_model = Sequential()
discriminator_model.add(Conv2D(64, 5, strides=2, input_shape=(28, 28, 1), padding='same'))
discriminator_model.add(LeakyReLU(alpha=0.2))
discriminator_model.add(Dropout(0.4))
discriminator_model.add(Conv2D(128, 5, strides=2, padding='same'))
discriminator_model.add(LeakyReLU(alpha=0.2))
discriminator_model.add(Dropout(0.4))
discriminator_model.add(Conv2D(256, 5, strides=2, padding='same'))
discriminator_model.add(LeakyReLU(alpha=0.2))
discriminator_model.add(Dropout(0.4))
discriminator_model.add(Conv2D(512, 5, strides=2, padding='same'))
discriminator_model.add(LeakyReLU(alpha=0.2))
discriminator_model.add(Dropout(0.4))
discriminator_model.add(Flatten())
discriminator_model.add(Dense(1))
discriminator_model.add(Activation('sigmoid'))
discriminator_model.summary()

这个应该在最新版本的 tensroflow 上运行良好,我在 1.8.0 上测试过,它运行良好。 但是,如果使用 tesnorflow1.1.0 等旧版本检查您的代码,我们会得到相同的错误。

对于这种情况,我建议将 tensorflow 更新到更高版本

要检查 python 正在使用的当前 tensorflow 版本,请执行 here。 要更新 tensorflow,this post 似乎足以说明如何操作。

【讨论】:

我正在使用 tensorflow 1.12.0 $ python -c 'import tensorflow as tf; print(tf.__version__)' 1.12.0 好的。谢谢你。我会检查 TF 1.12 比 1.8 更新,那里没有升级。 @NagabhushanSN 哦!你说得对,我没注意。我刚刚更正了本地机器上的代码。谢谢你让我知道,让我编辑答案 请注意,错误出现在 keras 方面,如果您更改了 tensorflow 的版本并修复了某些问题,这意味着您可能正在混合 tf.keras 和 keras,这是您不应该做的。 【参考方案2】:
leakyrelu_alpha = 0.2    

gen5 = Conv2D(filters=256, kernel_size=3, strides=1, padding='same')(gen5)
gen5 = LeakyReLU(alpha=leakyrelu_alpha)(gen5)#Activation('relu')'or #LeakyReLU(alpha=0.3)

使用它,它会解决你的问题

【讨论】:

嗨,请正确格式化您的代码。而且,您的答案与接受的答案有何不同?您的回答是否为现有解决方案添加了任何额外内容?您还需要解释需要进行哪些更改以及为什么需要进行更改。

以上是关于Keras - LeakyReLU 保存模型时没有属性名称错误的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 Python 中使用 Keras LeakyReLU?

尝试使用 Keras 上的回调保存我的模型时,Sequential' 对象没有属性 '_ckpt_saved_epoch' 错误

在 Keras 模型中保存元数据/信息

在keras中保存模型的非类型错误

Keras保存最好的模型

Keras - 没有停止和恢复训练的好方法?