我已经在StackOverflow上搜索并阅读了文档,但不知为何我的训练模型仍然无法加载!我已经检查了以下链接以及更多,所以请不要立即标记为重复。谢谢
- 如何使用Keras保存最终模型?
- https://www.tensorflow.org/guide/keras/save_and_serialize
- https://www.tensorflow.org/tutorials/distribute/save_and_load
- https://www.tensorflow.org/guide/keras/functional
- 如何从Keras中的HDF5文件加载模型?
这是我的模型:
def get_model(train=True): set_seed(33) pre_process = Lambda(preprocess_input) vgg = VGG16(weights = 'imagenet', include_top = True, input_shape = SHAPE) vgg = Model(vgg.input, vgg.layers[-3].output) vgg.trainable = False inp = Input(SHAPE) vgg_16_process = pre_process(GaussianNoise(0.1)(inp)) vgg_out = vgg(vgg_16_process) noise = Lambda(tf.zeros_like)(vgg_out) noise = GaussianNoise(0.1)(noise) if train: x = Lambda(lambda z: tf.concat(z, axis=0))([vgg_out,noise]) x = Activation('relu')(x) else: x = vgg_out x = Dense(512, activation='relu')(x) x = Dense(128, activation='relu')(x) out = Dense(2, activation='softmax')(x) model = Model(inp, out) model.compile(Adam(learning_rate=1e-4), loss='binary_crossentropy') return model
之后,我有一些如下所示的测试和训练生成器,数据集是经典的狗与猫数据集,我试图实现单类分类任务。
train_datagen = ImageDataGenerator()test_datagen = ImageDataGenerator()train_generator = train_datagen.flow_from_directory( base_path + 'training_set/training_set/', target_size = (SHAPE[0], SHAPE[1]), batch_size = batch_size, class_mode = 'categorical', shuffle = True, seed = 33, classes = ['cats'] )test_generator = test_datagen.flow_from_directory( base_path + 'test_set/test_set/', target_size = (SHAPE[0], SHAPE[1]), batch_size = batch_size, class_mode = 'categorical', shuffle = True, seed = 33, classes = ['dogs','cats'])
然后我最终编译模型
model = get_model()model.fit(wrap_generator(train_generator), steps_per_epoch=train_generator.samples/train_generator.batch_size, epochs=1)
然后我按如下方式保存模型
model.save('my_custom_model')
无论是使用这种格式保存还是’my_custom_model.h5’保存,都可以完美无误地保存。如果我只是使用save,则会创建一个包含’assets, variables, .pb文件’的文件夹,这在StackOverflow的帖子中提到过是预期的。
** 然后问题出现了 **
from keras.models import load_modelloaded_model = load_model('my_custom_model.h5')#or loaded_model = tf.keras.models.load_model('my_custom_model.h5')#or loaded_model = load_model('my_custom_model') # as from folder
所有这些都抛出相同的错误
TypeError: ‘module’ object is not callable
我知道我犯了一些错误或者模型有点不同,请指导我寻找解决方案的正确方向。
Python: 3.7.2Tensorflow: 2.6.0Keras: 2.6.0
完整的堆栈跟踪
---------------------------------------------------------------------------TypeError Traceback (most recent call last)~\AppData\Roaming\Python\Python37\site-packages\tensorflow\python\ops\array_ops.py in wrapper(*args, **kwargs) 205 try:--> 206 return target(*args, **kwargs) 207 except (TypeError, ValueError):TypeError: 'str' object is not callableDuring handling of the above exception, another exception occurred:TypeError Traceback (most recent call last)<ipython-input-10-cd6655ece7c5> in <module> 7 # loaded_model = tf.keras.models.load_model("my_custom_model2") 8 ----> 9 loaded_model = tf.keras.models.load_model('model_notebook.h5') 10 # print(loaded_model) 11 # print("------------")~\AppData\Roaming\Python\Python37\site-packages\keras\saving\save.py in load_model(filepath, custom_objects, compile, options) 199 (isinstance(filepath, h5py.File) or h5py.is_hdf5(filepath))): 200 return hdf5_format.load_model_from_hdf5(filepath, custom_objects,--> 201 compile) 202 203 filepath = path_to_string(filepath)~\AppData\Roaming\Python\Python37\site-packages\keras\saving\hdf5_format.py in load_model_from_hdf5(filepath, custom_objects, compile) 179 model_config = json_utils.decode(model_config) 180 model = model_config_lib.model_from_config(model_config,--> 181 custom_objects=custom_objects) 182 183 # set weights~\AppData\Roaming\Python\Python37\site-packages\keras\saving\model_config.py in model_from_config(config, custom_objects) 50 '`Sequential.from_config(config)`?') 51 from keras.layers import deserialize # pylint: disable=g-import-not-at-top---> 52 return deserialize(config, custom_objects=custom_objects) 53 54 ~\AppData\Roaming\Python\Python37\site-packages\keras\layers\serialization.py in deserialize(config, custom_objects) 210 module_objects=LOCAL.ALL_OBJECTS, 211 custom_objects=custom_objects,--> 212 printable_module_name='layer')~\AppData\Roaming\Python\Python37\site-packages\keras\utils\generic_utils.py in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name) 676 custom_objects=dict( 677 list(_GLOBAL_CUSTOM_OBJECTS.items()) +--> 678 list(custom_objects.items()))) 679 else: 680 with CustomObjectScope(custom_objects):~\AppData\Roaming\Python\Python37\site-packages\keras\engine\functional.py in from_config(cls, config, custom_objects) 661 with generic_utils.SharedObjectLoadingScope(): 662 input_tensors, output_tensors, created_layers = reconstruct_from_config(--> 663 config, custom_objects) 664 model = cls(inputs=input_tensors, outputs=output_tensors, 665 name=config.get('name'))~\AppData\Roaming\Python\Python37\site-packages\keras\engine\functional.py in reconstruct_from_config(config, custom_objects, created_layers) 1281 if layer in unprocessed_nodes: 1282 for node_data in unprocessed_nodes.pop(layer):-> 1283 process_node(layer, node_data) 1284 1285 input_tensors = []~\AppData\Roaming\Python\Python37\site-packages\keras\engine\functional.py in process_node(layer, node_data) 1229 input_tensors = ( 1230 base_layer_utils.unnest_if_single_tensor(input_tensors))-> 1231 output_tensors = layer(input_tensors, **kwargs) 1232 1233 # Update node index map.~\AppData\Roaming\Python\Python37\site-packages\keras\engine\base_layer.py in __call__(self, *args, **kwargs) 975 if _in_functional_construction_mode(self, inputs, args, kwargs, input_list): 976 return self._functional_construction_call(inputs, args, kwargs,--> 977 input_list) 978 979 # Maintains info about the `Layer.call` stack.~\AppData\Roaming\Python\Python37\site-packages\keras\engine\base_layer.py in _functional_construction_call(self, inputs, args, kwargs, input_list) 1113 # Check input assumptions set after layer building, e.g. input shape. 1114 outputs = self._keras_tensor_symbolic_call(-> 1115 inputs, input_masks, args, kwargs) 1116 1117 if outputs is None:~\AppData\Roaming\Python\Python37\site-packages\keras\engine\base_layer.py in _keras_tensor_symbolic_call(self, inputs, input_masks, args, kwargs) 846 return tf.nest.map_structure(keras_tensor.KerasTensor, output_signature) 847 else:--> 848 return self._infer_output_signature(inputs, args, kwargs, input_masks) 849 850 def _infer_output_signature(self, inputs, args, kwargs, input_masks):~\AppData\Roaming\Python\Python37\site-packages\keras\engine\base_layer.py in _infer_output_signature(self, inputs, args, kwargs, input_masks) 886 self._maybe_build(inputs) 887 inputs = self._maybe_cast_inputs(inputs)--> 888 outputs = call_fn(inputs, *args, **kwargs) 889 890 self._handle_activity_regularization(inputs, outputs)~\AppData\Roaming\Python\Python37\site-packages\keras\layers\core.py in call(self, inputs, mask, training) 901 with tf.GradientTape(watch_accessed_variables=True) as tape,\ 902 tf.variable_creator_scope(_variable_creator):--> 903 result = self.function(inputs, **kwargs) 904 self._check_variables(created_variables, tape.watched_variables()) 905 return result~\AppData\Roaming\Python\Python37\site-packages\tensorflow\python\ops\array_ops.py in wrapper(*args, **kwargs) 208 # Note: convert_to_eager_tensor currently raises a ValueError, not a 209 # TypeError, when given unexpected types. So we need to catch both.--> 210 result = dispatch(wrapper, args, kwargs) 211 if result is not OpDispatcher.NOT_SUPPORTED: 212 return resultTypeError: 'module' object is not callable
回答:
数据集是经典的狗与猫数据集,我试图实现单类分类任务。