python - 保存 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})
解决方案
您是否在模型中定义get_config
了返回初始化参数的方法?你能再看看他们的教程来比较你的模型配置吗?
推荐阅读
- javascript - 是否 Webelement.Object。
提供原始结果还是克隆? - javascript - 数据库的 UWP 安全文件位置
- sql - 我想将年份替换为所有 2000,但未能替换年份
- c++ - 有没有办法避免调用构造函数和析构函数来完美转发到函数?
- javascript - 如何检查一个字符串是否在另一个字符串内(但不在边缘)?
- oracle - 设置变量值
- wordpress - Woocommerce 添加产品
- ssas-tabular - SSAS 2017 - 计算度量中的 IF 语句,条件来自暗表
- typescript - 如何在 pwa 中导入 Twilio 以进行 OTP 验证?
- angular - 如何动态地将一个组件附加到另一个组件?