Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow自定义损失类别保存和加载_Python_Tensorflow_Loss Function - Fatal编程技术网

Python Tensorflow自定义损失类别保存和加载

Python Tensorflow自定义损失类别保存和加载,python,tensorflow,loss-function,Python,Tensorflow,Loss Function,我试图保存并加载一个带有自定义损失类的tf模型。这是一个简单的神经网络模型,具有自定义损失函数(类)。以下是代码(代码来自Aurélien Géron的《ML 2手册》第12章): 但是当我尝试使用keras.models.load\u model和custom\u objects字典加载模型时,它给出了一个错误: model = keras.models.load_model( "my_model_1.h5", custom_objects={ 'HuberL

我试图保存并加载一个带有自定义损失类的tf模型。这是一个简单的神经网络模型,具有自定义损失函数(类)。以下是代码(代码来自Aurélien Géron的《ML 2手册》第12章):

但是当我尝试使用
keras.models.load\u model
custom\u objects
字典加载模型时,它给出了一个错误:

model = keras.models.load_model(
    "my_model_1.h5", 
    custom_objects={
        'HuberLoss': HuberLoss
    })
输出:

    ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-a00475905a88> in <module>
      2     "my_model_1.h5",
      3     custom_objects={
----> 4         'HuberLoss': HuberLoss
      5     })

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\saving\save.py in load_model(filepath, custom_objects, compile)
    144   if (h5py is not None and (
    145       isinstance(filepath, h5py.File) or h5py.is_hdf5(filepath))):
--> 146     return hdf5_format.load_model_from_hdf5(filepath, custom_objects, compile)
    147 
    148   if isinstance(filepath, six.string_types):

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\saving\hdf5_format.py in load_model_from_hdf5(filepath, custom_objects, compile)
    182       # Compile model.
    183       model.compile(**saving_utils.compile_args_from_training_config(
--> 184           training_config, custom_objects))
    185 
    186       # Set optimizer weights.

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\saving\saving_utils.py in compile_args_from_training_config(training_config, custom_objects)
    232   loss_config = training_config['loss']  # Deserialize loss class.
    233   if isinstance(loss_config, dict) and 'class_name' in loss_config:
--> 234     loss_config = losses.get(loss_config)
    235   loss = nest.map_structure(
    236       lambda obj: custom_objects.get(obj, obj), loss_config)

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\losses.py in get(identifier)
   1184     return deserialize(identifier)
   1185   if isinstance(identifier, dict):
-> 1186     return deserialize(identifier)
   1187   elif callable(identifier):
   1188     return identifier

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\losses.py in deserialize(name, custom_objects)
   1173       module_objects=globals(),
   1174       custom_objects=custom_objects,
-> 1175       printable_module_name='loss function')
   1176 
   1177 

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\utils\generic_utils.py in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name)
    290     config = identifier
    291     (cls, cls_config) = class_and_config_for_serialized_keras_object(
--> 292         config, module_objects, custom_objects, printable_module_name)
    293 
    294     if hasattr(cls, 'from_config'):

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\utils\generic_utils.py in class_and_config_for_serialized_keras_object(config, module_objects, custom_objects, printable_module_name)
    248     cls = module_objects.get(class_name)
    249     if cls is None:
--> 250       raise ValueError('Unknown ' + printable_module_name + ': ' + class_name)
    251 
    252   cls_config = config['config']

ValueError: Unknown loss function: HuberLoss
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在里面
2“my_model_1.h5”,
3个自定义对象={
---->4“HuberLoss”:HuberLoss
5     })
加载模型中的~\.conda\envs\HandsOnML2\lib\site packages\tensorflow\u core\python\keras\saving\save.py(文件路径、自定义对象、编译)
144如果(h5py)不是无和(
145 iInstance(文件路径,h5py.File)或h5py.is_hdf5(文件路径)):
-->146返回hdf5格式。从hdf5加载模型(文件路径、自定义对象、编译)
147
148如果isinstance(文件路径,六种字符串类型):
从hdf5加载模型中的~\.conda\envs\HandsOnML2\lib\site packages\tensorflow\u core\python\keras\saving\hdf5\u format.py(文件路径,自定义对象,编译)
182#编译模型。
183 model.compile(**从\u training\u config保存\u utils.compile\u args\u(
-->184培训(配置、自定义对象)
185
186#设置优化器权重。
~\.conda\envs\HandsOnML2\lib\site packages\tensorflow\u core\python\keras\saving\saving\saving\u utils.py从\u training\u config(training\u config,自定义\u对象)编译\u args\u
232损失配置=培训配置['loss']#反序列化损失类。
233如果存在(丢失配置,dict)和丢失配置中的“类名称”:
-->234 loss\u config=loss.get(loss\u config)
235损失=nest.map_结构(
236 lambda obj:custom_objects.get(obj,obj),loss_config)
get中的~\.conda\envs\HandsOnML2\lib\site packages\tensorflow\u core\python\keras\loss.py(标识符)
1184返回反序列化(标识符)
1185如果存在(标识符,dict):
->1186返回反序列化(标识符)
1187 elif可调用(标识符):
1188返回标识符
反序列化中的~\.conda\envs\HandsOnML2\lib\site packages\tensorflow\u core\python\keras\loss.py(名称、自定义对象)
1173模块_对象=全局(),
1174自定义_对象=自定义_对象,
->1175可打印\u模块\u name='loss function')
1176
1177
反序列化keras对象中的~\.conda\envs\HandsOnML2\lib\site packages\tensorflow\u core\python\keras\utils\generic\u utils.py(标识符、模块对象、自定义对象、可打印模块名称)
290配置=标识符
291(cls,cls_config)=类_和_配置_,用于序列化的_keras_对象(
-->292配置、模块对象、自定义对象、可打印模块名称)
293
294如果hasattr(cls,“来自配置”):
类和配置中的~\.conda\envs\HandsOnML2\lib\site packages\tensorflow\u core\python\keras\utils\generic\u utils.py,用于序列化的\u keras\u对象(配置、模块\u对象、自定义\u对象、可打印的\u模块\u名称)
248 cls=模块对象.get(类名称)
249如果cls为无:
-->250 raise VALUERROR('未知'+可打印模块名称+':'+类名称)
251
252 cls_config=config['config']
ValueError:未知损失函数:HuberLoss

我怎样才能解决这个问题

看起来和你的问题一样。我不知道您使用的Tensorflow版本,但可能需要更新。我使用的是版本“2.1.0”。也许他们会在下一个版本中修复它
model.save("my_model_1.h5")
model = keras.models.load_model(
    "my_model_1.h5", 
    custom_objects={
        'HuberLoss': HuberLoss
    })
    ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-a00475905a88> in <module>
      2     "my_model_1.h5",
      3     custom_objects={
----> 4         'HuberLoss': HuberLoss
      5     })

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\saving\save.py in load_model(filepath, custom_objects, compile)
    144   if (h5py is not None and (
    145       isinstance(filepath, h5py.File) or h5py.is_hdf5(filepath))):
--> 146     return hdf5_format.load_model_from_hdf5(filepath, custom_objects, compile)
    147 
    148   if isinstance(filepath, six.string_types):

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\saving\hdf5_format.py in load_model_from_hdf5(filepath, custom_objects, compile)
    182       # Compile model.
    183       model.compile(**saving_utils.compile_args_from_training_config(
--> 184           training_config, custom_objects))
    185 
    186       # Set optimizer weights.

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\saving\saving_utils.py in compile_args_from_training_config(training_config, custom_objects)
    232   loss_config = training_config['loss']  # Deserialize loss class.
    233   if isinstance(loss_config, dict) and 'class_name' in loss_config:
--> 234     loss_config = losses.get(loss_config)
    235   loss = nest.map_structure(
    236       lambda obj: custom_objects.get(obj, obj), loss_config)

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\losses.py in get(identifier)
   1184     return deserialize(identifier)
   1185   if isinstance(identifier, dict):
-> 1186     return deserialize(identifier)
   1187   elif callable(identifier):
   1188     return identifier

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\losses.py in deserialize(name, custom_objects)
   1173       module_objects=globals(),
   1174       custom_objects=custom_objects,
-> 1175       printable_module_name='loss function')
   1176 
   1177 

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\utils\generic_utils.py in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name)
    290     config = identifier
    291     (cls, cls_config) = class_and_config_for_serialized_keras_object(
--> 292         config, module_objects, custom_objects, printable_module_name)
    293 
    294     if hasattr(cls, 'from_config'):

~\.conda\envs\HandsOnML2\lib\site-packages\tensorflow_core\python\keras\utils\generic_utils.py in class_and_config_for_serialized_keras_object(config, module_objects, custom_objects, printable_module_name)
    248     cls = module_objects.get(class_name)
    249     if cls is None:
--> 250       raise ValueError('Unknown ' + printable_module_name + ': ' + class_name)
    251 
    252   cls_config = config['config']

ValueError: Unknown loss function: HuberLoss