保存模型时,Keras-LeakyReLU出现“attribute name”错误

7

我在我的模型中使用了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)))

但是建议在编程中添加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?一个自包含的能够重现问题的示例会是最好的。 - Dr. Snoopy
2个回答

4

编辑部分(感谢@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()

这个代码片段应该可以在最新版本的tensorflow上正常工作,我在1.8.0上测试了一下,它可以正常运行。如果您使用旧版本的tesnorflow1.1.0检查代码,则会出现相同的错误。

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

  • 要检查Python当前正在使用的tensorflow版本,请像此处所述。
  • 要升级tensorflow,请参考这篇文章中描述的步骤操作即可。

我正在使用tensorflow 1.12.0 $ python -c 'import tensorflow as tf; print(tf.__version__)' 1.12.0 - Nagabhushan S N
@NagabhushanSN,我刚删除了之前的评论,并放上这条新的:我的环境在1.8.0下能正常运行。如果你的环境不起作用,一个建议是降级到1.8.0版本看看是否能解决你的问题。我强烈推荐创建一个虚拟环境,在那里尝试您的TensorFlow 1.8! - alift
@alift 感谢您的时间。实际上,我犯了一个小错误。在第一层 discriminator_model.add(Conv2D(64, 5, strides=2, input_shape=(28, 28, 1), padding='same', activation=LeakyReLU(alpha=0.2))) 中,激活函数 LeakyReLU 只是在这里指定,而不是作为单独的层。我将其移动到了单独的层中。它起作用了。 您可以更新您的答案。我会接受它。 - Nagabhushan S N
1
@NagabhushanSN 噢!你是对的,我没有注意到它。我已经在我的本地机器上纠正了代码。感谢你让我知道,让我编辑答案。 - alift
1
请注意,错误出现在keras方面。如果更改tensorflow的版本并且修复了某些内容,则意味着您可能正在混合使用tf.keras和keras,这是不应该做的。 - Dr. Snoopy
显示剩余3条评论

-1
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)

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


1
你好,请规范格式化你的代码。另外,你的答案与被接受的答案有何不同?你的答案是否为现有解决方案增加了额外的内容?你还需要解释更改的内容以及为什么需要进行更改。 - Nagabhushan S N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接