【问题标题】:NotImplementedError: Layer ModuleWrapper has arguments in `__init__` and therefore must override `get_config`NotImplementedError:Layer ModuleWrapper 在 `__init__` 中有参数,因此必须覆盖 `get_config`
【发布时间】:2021-10-09 22:24:25
【问题描述】:

我正在尝试将我的自动编码器模型(用于分类)保存到磁盘,但执行时出现以下错误:model.save(model_name)

NotImplementedError:Layer ModuleWrapper 在__init__ 中有参数,因此必须覆盖get_config。

这是我的代码的一部分:

import numpy as np
import tensorflow as tf  # TF 2.5.0
from tensorflow import keras
from tensorflow.keras.models import Sequential
from keras.layers import Dense
from tensorflow.keras import layers
from tensorflow.keras import regularizers
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
import pandas as pd
import sklearn
from sklearn.model_selection import train_test_split
from callbacks import all_callbacks
import os, time

print(train_data.shape, train_labels.shape, test_data.shape, test_labels.shape )
# Shape -> (3680, 1024, 1) (3680, 10) (920, 1024, 1) (920, 10)

act_func = 'relu'
out_func = 'softmax'
k_inic = 'glorot_uniform'

def create_model():
    model = Sequential()
    model.add(Dense(512,activation=act_func, kernel_initializer=k_inic))
    model.add(Dense(100,activation=act_func, kernel_initializer=k_inic))  
    model.add(Dense(10, activation=out_func, kernel_initializer=k_inic))

    opt = keras.optimizers.Adam()        
    model.compile(loss='mse', optimizer=opt, metrics=["accuracy"])
    model.build(input_shape=(None, 1024))
    return model    

history = model.fit(train_data, train_labels, epochs = EPOCHS, batch_size = BATCH_SIZE, validation_split=VALIDATION_SPLIT, verbose = 0)
model = create_model()
res = model.evaluate(test_data, test_labels, batch_size = BATCH_SIZE, verbose = 0)[1]

model_name = "autoencoder_crwu"
model.save(model_name)

模型总结:

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
module_wrapper_24 (ModuleWra (None, 512)               524800    
_________________________________________________________________
module_wrapper_25 (ModuleWra (None, 100)               51300     
_________________________________________________________________
module_wrapper_26 (ModuleWra (None, 10)                1010      
=================================================================
Total params: 577,110
Trainable params: 577,110

模型有效,我得到的最佳精度是 93.8%,但我无法保存(我确实可以保存权重)。

我在这里读到我需要实现 get_config 但不知道如何为我的代码执行此操作,因为其他示例使用了我不理解的类或其他东西。有没有简单的方法来实现它?或任何资源来看看如何?

另外,为什么层被称为ModuleWrapper 而不是 Dense?

谢谢

【问题讨论】:

    标签: python tensorflow machine-learning keras autoencoder


    【解决方案1】:

    ModuleWrapper 层名称是因为您正在混合使用 keras 和 tensorflow 库。只使用其中一个(然后您将获得密集层的密集名称,并且您不需要实现get_config)。

    改变这一行:

    #from keras.layers import Dense             #comment this
    from tensorflow.keras.layers import Dense   #add this
    

    此外,数据集的标注形状会导致错误,因为它们与您定义的模型不兼容,您应该从数据中删除最后一个轴。在model.fit()前添加这两行:

    train_data = tf.squeeze(train_data)
    test_data = tf.squeeze(test_data) 
    

    这些线条的形状从(None,1024,1) 变为(None,1024)。然后,您可以将它们输入到您的模型中而不会出现任何错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-08
      • 2020-02-28
      • 2020-08-16
      • 2015-04-16
      • 2018-12-06
      • 2022-01-24
      • 2011-09-07
      • 2015-05-11
      相关资源
      最近更新 更多