首页 > 解决方案 > 保存 Keras ML 模型时出错

问题描述

我在保存 ML 模型时遇到错误。我在 SO 上进行了搜索,看起来建议是将函数的参数更改为'=None'. 但是当我尝试这样做时,我得到了一个错误None types are not iterable。有任何想法吗?

# Save the model
model.save('./alexnet_model.hdf5')
# Load the model
alexnet_model = tf.keras.models.load_model('./alexnet_model.hdf5', custom_objects={'AlexNet': AlexNet})

错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-76-504e90d49459> in <module>()
      6 model.save('./alexnet_model.hdf5')
      7 # Load the model
----> 8 alexnet_model = tf.keras.models.load_model('./alexnet_model.hdf5', custom_objects={'AlexNet': AlexNet})
      9 #alexnet_model = tf.keras.models.load_model('./alexnet_model.hdf5')

5 frames
/usr/local/lib/python3.7/dist-packages/keras/engine/sequential.py in from_config(cls, config, custom_objects)
    428       build_input_shape = None
    429       layer_configs = config
--> 430     model = cls(name=name)
    431     for layer_config in layer_configs:
    432       layer = layer_module.deserialize(layer_config,

TypeError: __init__() missing 2 required positional arguments: 'input_shape' and 'num_classes'

这是模型架构的前几行:

# Define the AlexNet model
class AlexNet(Sequential):
   def __init__(self, input_shape, num_classes, **kwargs):
    super().__init__()

尝试使用 get_config 函数更新 AlexNet 架构:

# Define the AlexNet model
class AlexNet(Sequential):
   def __init__(self, input_shape, num_classes, **kwargs):
    super().__init__()

    self.add(Conv2D(96, kernel_size=(11,11), strides= 4,
                    padding= 'valid', activation= 'relu',
                    input_shape= input_shape, kernel_initializer= 'he_normal'))
    self.add(BatchNormalization())
    self.add(MaxPooling2D(pool_size=(3,3), strides= (2,2),
                          padding= 'valid', data_format= None))
    
    
    self.add(Conv2D(256, kernel_size=(5,5), strides= 1,
                    padding= 'same', activation= 'relu',
                    kernel_initializer= 'he_normal'))
    self.add(BatchNormalization())
    self.add(MaxPooling2D(pool_size=(3,3), strides= (2,2),
                          padding= 'valid', data_format= None)) 
    

    self.add(Conv2D(384, kernel_size=(3,3), strides= 1,
                    padding= 'same', activation= 'relu',
                    kernel_initializer= 'he_normal'))
    self.add(BatchNormalization())
    
    self.add(Conv2D(384, kernel_size=(3,3), strides= 1,
                    padding= 'same', activation= 'relu',
                    kernel_initializer= 'he_normal'))
    self.add(BatchNormalization())
    
    self.add(Conv2D(256, kernel_size=(3,3), strides= 1,
                    padding= 'same', activation= 'relu',
                    kernel_initializer= 'he_normal'))
    self.add(BatchNormalization())
    
    self.add(MaxPooling2D(pool_size=(3,3), strides= (2,2),
                          padding= 'valid', data_format= None))
    

    self.add(Flatten())
    
    self.add(Dense(num_classes, activation= 'sigmoid')) #try sigmoid vs. softmax

    self.compile(optimizer= tf.keras.optimizers.Adam(learning_rate=lr_schedule),
                loss='binary_crossentropy',
                metrics=['accuracy'])

   def get_config(self):
     return {'input_shape': (256, 256, 3), 'num_classes': 3}

仍然收到相同的错误:

# Save the model
model.save('./alexnet_model.hdf5')
# Load the model
alexnet_model = tf.keras.models.load_model('./alexnet_model.hdf5', custom_objects={'AlexNet': AlexNet})

标签: pythontensorflowmachine-learningkeras

解决方案


您是否在模型中定义get_config了返回初始化参数的方法?你能再看看他们的教程来比较你的模型配置吗?

https://www.tensorflow.org/guide/keras/save_and_serialize


推荐阅读