keras 尚未建立此模型model.summary()上发生错误

fnx2tebb  于 2022-11-13  发布在  其他
关注(0)|答案(8)|浏览(284)

我把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,为什么会抛出这个错误?

taor4pac

taor4pac1#

该错误说明了应执行的操作:
尚未生成此模型。请首先通过调用build()生成模型

model.build(input_shape) # `input_shape` is the shape of the input data
                         # e.g. input_shape = (None, 32, 32, 3)
model.summary()
oprakyz7

oprakyz72#

keras子类模型与其它keras模型(序贯模型和函数模型)有很大的区别。
顺序模型和功能模型是表示层的DAG的数据结构。简单地说,功能模型或顺序模型是层的静态图,通过像LEGO一样将一个层堆叠在另一个层的顶部而构建。因此,当您向第一层提供input_shape时,这些(功能模型和顺序模型)模型可以推断所有其他层的形状并构建模型。然后,您可以使用model.summary()打印输入/输出形状。
另一方面,子类模型是通过本体来定义的(一个调用方法)。对于子类模型,这里没有图层的图形。我们无法知道图层之间是如何连接的(因为它是在调用的主体中定义的,而不是作为一个显式的数据结构),所以我们不能推断输入/输出形状。输入/输出形状是未知的,直到它第一次用适当的数据进行测试。在编译()方法,我们将执行一个延迟编译并等待一个合适的数据。为了让它推断中间层的形状,我们需要运行一个合适的数据,然后使用model.summary()。如果不运行一个数据模型,它会抛出一个错误,正如你所注意到的。请检查GitHub gist以获得完整的代码。
以下是来自Tensorflow网站的示例。

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

class ThreeLayerMLP(keras.Model):

  def __init__(self, name=None):
    super(ThreeLayerMLP, self).__init__(name=name)
    self.dense_1 = layers.Dense(64, activation='relu', name='dense_1')
    self.dense_2 = layers.Dense(64, activation='relu', name='dense_2')
    self.pred_layer = layers.Dense(10, name='predictions')

  def call(self, inputs):
    x = self.dense_1(inputs)
    x = self.dense_2(x)
    return self.pred_layer(x)

def get_model():
  return ThreeLayerMLP(name='3_layer_mlp')

model = get_model()

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') / 255
x_test = x_test.reshape(10000, 784).astype('float32') / 255

model.compile(loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              optimizer=keras.optimizers.RMSprop())

model.summary() # This will throw an error as follows
# 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.

# Need to run with real data to infer shape of different layers
history = model.fit(x_train, y_train,
                    batch_size=64,
                    epochs=1)

model.summary()

谢谢你!

ktecyv1j

ktecyv1j3#

另一种方法是添加属性input_shape(),如下所示:

model = Sequential()
model.add(Bidirectional(LSTM(n_hidden,return_sequences=False, dropout=0.25, 
recurrent_dropout=0.1),input_shape=(n_steps,dim_input)))
ss2ws0br

ss2ws0br4#

# X is a train dataset with features excluding a target variable

input_shape = X.shape  
model.build(input_shape) 
model.summary()
np8igboo

np8igboo5#

确保你正确地创建了你的模型。一个小的打字错误,比如下面的代码,也可能导致问题:

model = Model(some-input, some-output, "model-name")

而正确的代码应该是:

model = Model(some-input, some-output, name="model-name")
a64a0gku

a64a0gku6#

如果您的Tensorflow,Keras版本为2.5.0,则只需在导入Keras包时添加Tensorflow
不是这个:

from tensorflow import keras
from keras.models import Sequential
import tensorflow as tf

就像这样:

from tensorflow import keras
from tensorflow.keras.models import Sequential
import tensorflow as tf
vngu2lb8

vngu2lb87#

Tensorflow Keras的版本问题可能是导致此问题的原因。

我在为回归的LSTM模型定型时遇到了同样的问题。
错误:
ValueError:尚未生成此模型。请首先通过调用build()或通过对一批数据调用模型来生成模型。
更早:

from tensorflow.keras.models import Sequential

from tensorflow.python.keras.models import Sequential

更正:

from keras.models import Sequential
lqfhib0f

lqfhib0f8#

我也面临着同样的错误,所以我删除了model.summary()。然后问题就解决了。因为它出现了,如果模型的摘要是在模型建立之前定义的。
这里是LINK的说明,它声明

Raises:
    ValueError: if `summary()` is called before the model is built.**

相关问题