我把keras模型定义如下
第一个
我能够编译这个模型,没有任何问题
>>> model.compile(optimizer=tf.keras.optimizers.Adam(lr=lr),
loss='categorical_crossentropy',
metrics=['accuracy'])
但是,当我查询此模型的摘要时,我看到此错误
>>> model = ConvModel(nfs, input_shape=(32, 32, 3), output_shape=num_classes)
>>> model.summary()
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-220-5f15418b3570> in <module>()
----> 1 model.summary()
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/network.py in summary(self, line_length, positions, print_fn)
1575 """
1576 if not self.built:
-> 1577 raise ValueError('This model has not yet been built. '
1578 'Build the model first by calling `build()` or calling '
1579 '`fit()` with some data, or specify '
ValueError: This model has not yet been built. Build the model first by calling `build()` or calling `fit()` with some data, or specify an `input_shape` argument in the first layer(s) for automatic build.
我为模型的第一层提供了input_shape
,为什么会抛出这个错误?
8条答案
按热度按时间taor4pac1#
该错误说明了应执行的操作:
尚未生成此模型。请首先通过调用
build()
生成模型oprakyz72#
keras子类模型与其它keras模型(序贯模型和函数模型)有很大的区别。
顺序模型和功能模型是表示层的DAG的数据结构。简单地说,功能模型或顺序模型是层的静态图,通过像LEGO一样将一个层堆叠在另一个层的顶部而构建。因此,当您向第一层提供input_shape时,这些(功能模型和顺序模型)模型可以推断所有其他层的形状并构建模型。然后,您可以使用model.summary()打印输入/输出形状。
另一方面,子类模型是通过本体来定义的(一个调用方法)。对于子类模型,这里没有图层的图形。我们无法知道图层之间是如何连接的(因为它是在调用的主体中定义的,而不是作为一个显式的数据结构),所以我们不能推断输入/输出形状。输入/输出形状是未知的,直到它第一次用适当的数据进行测试。在编译()方法,我们将执行一个延迟编译并等待一个合适的数据。为了让它推断中间层的形状,我们需要运行一个合适的数据,然后使用model.summary()。如果不运行一个数据模型,它会抛出一个错误,正如你所注意到的。请检查GitHub gist以获得完整的代码。
以下是来自Tensorflow网站的示例。
谢谢你!
ktecyv1j3#
另一种方法是添加属性
input_shape()
,如下所示:ss2ws0br4#
np8igboo5#
确保你正确地创建了你的模型。一个小的打字错误,比如下面的代码,也可能导致问题:
而正确的代码应该是:
a64a0gku6#
如果您的Tensorflow,Keras版本为
2.5.0
,则只需在导入Keras包时添加Tensorflow不是这个:
就像这样:
vngu2lb87#
Tensorflow Keras的版本问题可能是导致此问题的原因。
我在为回归的LSTM模型定型时遇到了同样的问题。
错误:
ValueError:尚未生成此模型。请首先通过调用
build()
或通过对一批数据调用模型来生成模型。更早:
更正:
lqfhib0f8#
我也面临着同样的错误,所以我删除了
model.summary()
。然后问题就解决了。因为它出现了,如果模型的摘要是在模型建立之前定义的。这里是LINK的说明,它声明