python - Keras - LeakyReLU 保存模型时没有属性名称错误
问题描述
我在我的模型中使用了 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__'
解决方案
编辑部分(感谢@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 更新到更高版本
推荐阅读
- java - JPA 3 表连接映射
- python - Python opencv飞机凝结尾迹检测
- mysql - MySQL 查询以查找每个组的 *best* 行,其中 *best* 是一个复杂的指标
- python - 当我尝试在 Django 中使用 DeleteView 时,“str”对象不可调用
- python - 根据熊猫中列的值的过滤器选择列
- javascript - 支持 div 打开时避免滚动主要内容 - 仅限移动设备
- angular - Angular CLI 6 未知选项:'--singleRun'
- jquery - 从表中读取值并单击按钮时下拉列表
- php - 加入mysql查询。仅使用 desc 顺序限制第二张桌子上的 1
- javascript - 从循环生成多个图像