Python 3.x 如何正确保存keras模型以便能够使用hub.Module()加载?
我正在尝试在一个新的图像集上重新训练inception v3 当我试图保存模型时,我收到一个错误 我试过:Python 3.x 如何正确保存keras模型以便能够使用hub.Module()加载?,python-3.x,tf.keras,tensorflow-hub,Python 3.x,Tf.keras,Tensorflow Hub,我正在尝试在一个新的图像集上重新训练inception v3 当我试图保存模型时,我收到一个错误 我试过: tf.keras.models.save_model(model, filename) 及 及 所有这些都给了我一个类似的错误,模块没有'名称'/strong>' 我已附上与问题相关的代码 from __future__ import absolute_import from __future__ import division from __future__ import pr
tf.keras.models.save_model(model, filename)
及
及
所有这些都给了我一个类似的错误,模块没有'名称'/strong>'
我已附上与问题相关的代码
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import argparse
import os
import sys
import numpy as np
import tensorflow as tf
import tensorflow_hub as hub
import matplotlib.pyplot as plt
FLAGS = None
这将保存一个“.h5”模型文件,但我收到一个命名错误:
Traceback (most recent call last):
File "/home/raphy/projects/vmi/tf_cpu/retrain.py", line 305, in <module>
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
File "/home/raphy/.local/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 125, in run
_sys.exit(main(argv))
File "/home/raphy/projects/vmi/tf_cpu/retrain.py", line 205, in main
model.save(file)
File "/home/raphy/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/sequential.py", line 319, in save
save_model(self, filepath, overwrite, include_optimizer)
File "/home/raphy/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/saving.py", line 105, in save_model
'config': model.get_config()
File "/home/raphy/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/sequential.py", line 326, in get_config
'config': layer.get_config()
File "/home/raphy/.local/lib/python3.6/site-packages/tensorflow/python/keras/layers/core.py", line 756, in get_config
function = self.function.__name__
AttributeError: 'Module' object has no attribute '__name__'
回溯(最近一次呼叫最后一次):
文件“/home/graphic/projects/vmi/tf_cpu/retain.py”,第305行,在
tf.app.run(main=main,argv=[sys.argv[0]]]+未解析)
文件“/home/graphic/.local/lib/python3.6/site packages/tensorflow/python/platform/app.py”,第125行,运行中
_系统出口(主(argv))
文件“/home/graphic/projects/vmi/tf_cpu/retain.py”,第205行,主目录
model.save(文件)
文件“/home/graphic/.local/lib/python3.6/site packages/tensorflow/python/keras/engine/sequential.py”,第319行,保存
保存模型(self、filepath、overwrite、include\u优化器)
文件“/home/graphic/.local/lib/python3.6/site packages/tensorflow/python/keras/engine/saving.py”,第105行,在save_模型中
“config”:model.get_config()
文件“/home/graphic/.local/lib/python3.6/site packages/tensorflow/python/keras/engine/sequential.py”,第326行,在get_config中
“config”:layer.get_config()
文件“/home/graphic/.local/lib/python3.6/site packages/tensorflow/python/keras/layers/core.py”,第756行,在get_config中
函数=self.function.\u\u名称__
AttributeError:“模块”对象没有属性“\u_name\u_”
我想以tf_hub模型的格式保存模型。如中所述
如果您对托管自己的模型库感兴趣
可通过您的HTTP分发版tensorflow_hub库加载
服务应遵循以下协议
换句话说,您不能使用TF Hub加载任何模型,但只能加载中存在的模块
如果要加载保存的模型,可以使用tf.Saved\u Model.Load
但如果您想使用TF Hub进行此操作,请参阅
此外,请提及以下说明,以防链接无法正常工作:
托管您自己的模型:
TensorFlow Hub提供了一个开放式的存储库,其中存储了大量经过培训的模型。tensorflow\u hub
库可以从该存储库和其他基于HTTP的机器学习模型存储库加载模型。特别是,该协议允许使用标识模型的URL来记录模型和端点来获取模型
如果您有兴趣托管自己的模型存储库,这些模型可以通过tensorflow\u hub
库加载,那么您的HTTP分发服务应该遵循以下协议
协议:
当URL(如https://example.com/model
用于识别要加载或实例化的模型,模型解析器将在附加查询参数后尝试从URL下载压缩tarball?tf hub format=compressed
查询参数将被解释为客户机感兴趣的模型格式的逗号分隔列表。目前只定义了“压缩”格式
压缩的格式表示客户机需要一个带有模型内容的tar.gz
存档。存档的根目录是模型目录的根目录,应该包含一个SavedModel,如本例所示:
# Create a compressed model from a SavedModel directory.
$ tar -cz -f model.tar.gz --owner=0 --group=0 -C /tmp/export-model/ .
# Inspect files inside a compressed model
$ tar -tf model.tar.gz
./
./variables/
./variables/variables.data-00000-of-00001
./variables/variables.index
./assets/
./saved_model.pb
用于TF1中不推荐使用的API的tarball还将包含一个./tfhub\u module.pb文件。TF2 SavedModels的hub.load()API会忽略此类文件
tensorflow_hub库要求对模型URL进行版本控制,并且给定版本的模型内容是不可变的,因此可以无限期地缓存它。如中所述
如果您对托管自己的模型库感兴趣
可通过您的HTTP分发版tensorflow_hub库加载
服务应遵循以下协议
换句话说,您不能使用TF Hub加载任何模型,但只能加载中存在的模块
如果要加载保存的模型,可以使用tf.Saved\u Model.Load
但如果您想使用TF Hub进行此操作,请参阅
此外,请提及以下说明,以防链接无法正常工作:
托管您自己的模型:
TensorFlow Hub提供了一个开放式的存储库,其中存储了大量经过培训的模型。tensorflow\u hub
库可以从该存储库和其他基于HTTP的机器学习模型存储库加载模型。特别是,该协议允许使用标识模型的URL来记录模型和端点来获取模型
如果您有兴趣托管自己的模型存储库,这些模型可以通过tensorflow\u hub
库加载,那么您的HTTP分发服务应该遵循以下协议
协议:
当URL(如https://example.com/model
用于识别要加载或实例化的模型,模型解析器将在附加查询参数后尝试从URL下载压缩tarball?tf hub format=compressed
查询参数将被解释为客户机感兴趣的模型格式的逗号分隔列表。目前只定义了“压缩”格式
压缩的格式表示客户机需要一个带有模型内容的tar.gz
存档。存档的根目录是模型目录的根目录,应该包含一个SavedModel,如本例所示:
# Create a compressed model from a SavedModel directory.
$ tar -cz -f model.tar.gz --owner=0 --group=0 -C /tmp/export-model/ .
# Inspect files inside a compressed model
$ tar -tf model.tar.gz
./
./variables/
./variables/variables.data-00000-of-00001
./variables/variables.index
./assets/
./saved_model.pb
用于TF1中不推荐使用的API的tarball还将包含一个./tfhub\u module.pb文件。TF2 SavedModels的hub.load()API会忽略此类文件
张量
def get_and_gen_images(module):
"""
get images from image directory or url
:param module: module (to get required image size info
:return: batched image data
"""
data_name = os.path.splitext(os.path.basename(FLAGS.image_dir_or_url))[0]
print("data: ", data_name)
# download images to cache if not already
if FLAGS.image_dir_or_url.startswith('https://'):
data_root = tf.keras.utils.get_file(data_name,
FLAGS.image_dir_or_url,
untar=True,
cache_dir=os.getcwd())
else: # specify directory with images
data_root = tf.keras.utils.get_file(data_name,
FLAGS.image_dir_or_url)
# get image size for specific module
image_size = hub.get_expected_image_size(module)
# TODO: this is where to add noise, rotations, shifts, etc.
image_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1. / 255, validation_split=0.2)
# create image stream
train_image_data = image_generator.flow_from_directory(str(data_root),
target_size=image_size,
batch_size=FLAGS.batch_size,
subset='training')
validation_image_data = image_generator.flow_from_directory(str(data_root),
target_size=image_size,
batch_size=FLAGS.batch_size,
subset='validation')
return train_image_data, validation_image_data
# load module (will download from url or directory_
module = hub.Module(FLAGS.tfhub_module)
# generate image stream
train_image_data, validation_image_data = get_and_gen_images(module)
model = create_model(module, train_image_data)
model.summary()
file = FLAGS.saved_model_dir + "/modelname.h5"
model.save(file)
Traceback (most recent call last):
File "/home/raphy/projects/vmi/tf_cpu/retrain.py", line 305, in <module>
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
File "/home/raphy/.local/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 125, in run
_sys.exit(main(argv))
File "/home/raphy/projects/vmi/tf_cpu/retrain.py", line 205, in main
model.save(file)
File "/home/raphy/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/sequential.py", line 319, in save
save_model(self, filepath, overwrite, include_optimizer)
File "/home/raphy/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/saving.py", line 105, in save_model
'config': model.get_config()
File "/home/raphy/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/sequential.py", line 326, in get_config
'config': layer.get_config()
File "/home/raphy/.local/lib/python3.6/site-packages/tensorflow/python/keras/layers/core.py", line 756, in get_config
function = self.function.__name__
AttributeError: 'Module' object has no attribute '__name__'
# Create a compressed model from a SavedModel directory.
$ tar -cz -f model.tar.gz --owner=0 --group=0 -C /tmp/export-model/ .
# Inspect files inside a compressed model
$ tar -tf model.tar.gz
./
./variables/
./variables/variables.data-00000-of-00001
./variables/variables.index
./assets/
./saved_model.pb