TF2.6:ValueError:模型无法保存,因为尚未设置输入形状
Posted
技术标签:
【中文标题】TF2.6:ValueError:模型无法保存,因为尚未设置输入形状【英文标题】:TF2.6: ValueError: Model cannot be saved because the input shapes have not been set 【发布时间】:2021-11-17 13:14:59 【问题描述】:我想在 Google Colab 中使用迁移学习创建自定义模型。
import tensorflow as tf
from tensorflow.keras.layers import Conv2D
from tensorflow.python.keras.applications.xception import Xception
class MyModel(tf.keras.Model):
def __init__(self, input_shape, num_classes=5, dropout_rate=0.5):
super(MyModel, self).__init__()
self.weight_dict =
self.weight_dict['backbone'] = Xception(input_shape=input_shape, weights='imagenet', include_top=False)
self.weight_dict['outputs'] = Conv2D(num_classes, (1, 1), padding="same", activation="softmax")
self.build((None,) + input_shape)
def call(self, inputs, training=False):
self.weight_dict['backbone'].trainable = False
x = self.weight_dict['backbone'](inputs)
x = self.weight_dict['outputs'](x)
return x
model = MyModel(input_shape=(256, 256, 3))
model.save('./saved')
但是,我遇到了这个错误:
ValueError: Model `<__main__.MyModel object at 0x7fc66134bdd0>` cannot be saved because the input shapes have not been set. Usually, input shapes are automatically determined from calling `.fit()` or `.predict()`. To manually set the shapes, call `model.build(input_shape)`.
是的,没有呼叫.fit()
或.predict()
。但是在类的__init__()
方法中有一个对.build
的调用。我该怎么办?
【问题讨论】:
你试过this,this吗? @TFer2 非常感谢!第二个链接为我做了!如果您愿意,请发表您的评论作为答案,我会接受。 很高兴。 【参考方案1】:如果该层尚未构建,compute_output_shape 将在该层上调用构建。这假定该层稍后将与与所提供的输入形状匹配的输入一起使用。
工作代码如下图
import tensorflow as tf
print(tf.__version__)
from tensorflow.keras.layers import Conv2D
from tensorflow.keras.applications.xception import Xception
class MyModel(tf.keras.Model):
def __init__(self, input_shape, num_classes=5, dropout_rate=0.5):
super(MyModel, self).__init__()
self.weight_dict =
self.weight_dict['backbone'] = Xception(input_shape=input_shape, weights='imagenet', include_top=False)
self.weight_dict['outputs'] = Conv2D(num_classes, (1, 1), padding="same", activation="softmax")
self.build((None,) + input_shape)
def call(self, inputs, training=False):
self.weight_dict['backbone'].trainable = False
x = self.weight_dict['backbone'](inputs)
x = self.weight_dict['outputs'](x)
return x
input_shape=(256, 256, 3)
model=MyModel(input_shape)
model.compute_output_shape(input_shape=(None, 256, 256, 3))
model.save('./saved')
输出:
2.6.0
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/xception/xception_weights_tf_dim_ordering_tf_kernels_notop.h5
83689472/83683744 [==============================] - 1s 0us/step
INFO:tensorflow:Assets written to: ./saved/assets
更多信息可以参考here。
【讨论】:
以上是关于TF2.6:ValueError:模型无法保存,因为尚未设置输入形状的主要内容,如果未能解决你的问题,请参考以下文章
valueerror: 生成 csv 文件并在 django 中保存到模型时对已关闭文件的 i/o 操作
在 pycharm 上加载经过训练的 Tensorflow 保存模型时出错。 ValueError:int() 的无效文字,基数为 10:'class_name'
ValueError: 无法解析相关模型 u'app.model'
ValueError: 运行测试时无法解析相关模型 u'app.model'