如何将Kaggle上的TensorFlow 1 BigGAN模型转换为TensorFlow Lite格式?
问题分析与解决方案
核心问题
- TypeError 原因:Hub层对应的BigGAN签名需要接收命名参数(
truncation、y、z),而非将所有输入打包成单个列表传入,导致函数调用参数不匹配。 - model.build() 冗余:使用Keras
Input层时,模型已自动根据输入层定义构建结构,无需手动调用model.build()。
修正后的代码
import tensorflow as tf import tensorflow_hub as hub from tensorflow.keras import Input, Model # 定义输入层,明确指定float32 dtype(匹配BigGAN预期) input_truncation = Input(shape=(), name='truncation', dtype=tf.float32) input_y = Input(shape=(1000,), name='y', dtype=tf.float32) input_z = Input(shape=(128,), name='z', dtype=tf.float32) # 加载BigGAN Hub模型 hub_layer = hub.KerasLayer( "https://www.kaggle.com/models/deepmind/biggan/TensorFlow1/128/2", trainable=False, signature="default", signature_outputs_as_dict=False # 模型输出为单个张量,无需字典格式 ) # 以命名参数方式传入输入,匹配签名要求 output = hub_layer(truncation=input_truncation, y=input_y, z=input_z) # 构建Keras模型 model = Model(inputs=[input_truncation, input_y, input_z], outputs=output) # 查看模型结构 model.summary() # 保存为SavedModel(Hub层序列化更可靠) model.save("biggan-128_savedmodel") # 转换为TensorFlow Lite格式 converter = tf.lite.TFLiteConverter.from_saved_model("biggan-128_savedmodel") converter.experimental_enable_resource_variables = True # 兼容TF1模型资源变量 tflite_model = converter.convert() # 保存TFLite模型 with open("biggan-128.tflite", "wb") as f: f.write(tflite_model)
关键修正点
- 参数传递方式:将输入以命名参数形式传入Hub层,而非列表,解决签名函数参数不匹配问题。
- 移除冗余操作:删除
model.build()调用,依赖Input层自动构建模型结构。 - SavedModel序列化:先保存为SavedModel再转换为TFLite,确保Hub层正确序列化,避免直接转换Keras模型的潜在问题。
- dtype匹配:明确指定输入层为
float32,与BigGAN模型的输入类型一致。
内容的提问来源于stack exchange,提问作者Shinobu HUYUGIRI
相关产品推荐
相关产品推荐

