very_interesting
very_interesting

Reputation: 355

Keras: "must compile model before using it" despite compile() is used

I want to create and train a CNN model in Keras for classification of banknotes. Creating models works fine with simple tutorials but not with the architecture I adopt from this paper. Keras outputs: RuntimeError('You must compile your model before using it.') after fit_generator() is called.

I use the tensorflow backend if that is of relevance.


Model is defined in model.py:

from keras.layers import ...
model = Sequential() 
model.add(some_layer)

... #according to the paper

model.add(some_layer)
model.add(Dense(#output_classes, activation='softmax') #last layer

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

The model is then used from start_train.py:

from model import model as m

#some ImageGenerator stuff as input

m.fit_generator( #training on train_data
        train_pics,
        steps_per_epoch=#steps,
        epochs=#epochs,
        validation_data=test_pics,

As far as I understood it the process in Keras is as follows:

  1. Define model
  2. Compile model
  3. (If wanted evaluate() & summary() can be used now after the compilation)
  4. Fit model
  5. Evaluate model.

I tested if model.py is accessed before calling fit_generator() and it works properly. I'm out of ideas and wondering what I'm doing wrong especially since the same set-up works fine with a basic model/architecture.

Any help is highly appreciated! :)

Upvotes: 8

Views: 17829

Answers (4)

very_interesting
very_interesting

Reputation: 355

Found my mistake - explanation for future reference.

The error origniates back in compile() where the first if-statement says:

if not self.built:
    # Model is not compilable because
    # it does not know its number of inputs
    # and outputs, nor their shapes and names.
    # We will compile after the first
    # time the model gets called on training data.
return

So I specified input_shape= and input_format=in the first Conv2D layer and everything works fine.

Upvotes: 12

Christo S. Christov
Christo S. Christov

Reputation: 2309

You can run evaluate on a small set and that would fix it.

Upvotes: 0

Aniket Sawale
Aniket Sawale

Reputation: 36

Try This:

from keras.optimizers import Adam
opt = keras.optimizers.Adam(use your own learning rate)
model.compile(optimizer=opt, loss="categorical_crossentropy", metrics=model.compile(optimizer=opt, loss="categorical_crossentropy", metrics=['accuracy']))

Upvotes: -1

Marc Blais
Marc Blais

Reputation: 101

If ever someone ends up with the same error code here is maybe a way to fix it. So I was using a generator and was getting the "Must compile" error even tho everything was fine. I was able to fix it by doing a model.fit(x,y) on a single batch before launching my fit_generator and everything worked fine after that. I don't know if this helps anyone but yeah!

Upvotes: 6

Related Questions