2

I have run this example and I got the following error when I try to save the model.

import tensorflow as tf
import h5py
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])

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

model.fit(x_train, y_train, epochs=2)
val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss, val_acc)

model.save('model.h5')

new_model = tf.keras.models.load_model('model.h5')

I get this error:

Traceback (most recent call last):
File "/home/zneic/PycharmProjects/test/venv/test.py", line 23, in <module>
model.save('model.h5')
File "/home/zneic/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/network.py", line 1359, in save
'Currently `save` requires model to be a graph network. Consider '
NotImplementedError: Currently `save` requires model to be a graph network. Consider using `save_weights`, in order to save the weights of the model.
Robert
  • 7,394
  • 40
  • 45
  • 64
Andrei Nico
  • 31
  • 1
  • 2
  • You should define the input_shape of the first layer – Dr. Snoopy Nov 08 '18 at 22:02
  • Possible duplicate of [Tensorflow——keras model.save() raise NotImplementedError](https://stackoverflow.com/questions/52553593/tensorflow-keras-model-save-raise-notimplementederror) – David Weber Jan 02 '19 at 07:27
  • This is a duplicate of https://stackoverflow.com/questions/52553593/tensorflow-keras-model-save-raise-notimplementederror. Seems the documentation does not specify that the input shape must be specified or the model is "undefined". – David Weber Jan 02 '19 at 07:32

2 Answers2

1

Your weights don't seem to be saved or loaded back into the session. Can you try saving the graph and the weights separately and loading them separately?

model_json = model.to_json()
with open("model.json", "w") as json_file:
    json_file.write(model_json)

model.save_weights("model.h5")

Then you can load them:

def loadModel(jsonStr, weightStr):
    json_file = open(jsonStr, 'r')
    loaded_nnet = json_file.read()
    json_file.close()

    serve_model = tf.keras.models.model_from_json(loaded_nnet)
    serve_model.load_weights(weightStr)

    serve_model.compile(optimizer=tf.train.AdamOptimizer(),
                        loss='categorical_crossentropy',
                        metrics=['accuracy'])
    return serve_model

model = loadModel('model.json', 'model.h5')
mlenthusiast
  • 1,094
  • 1
  • 12
  • 34
0

I have the same problem, and I solved it. I don't konw why, but it works. You can modify as this:

model = tf.keras.Sequential([
  layers.Flatten(input_shape=(28, 28)),
  layers.Dense(512, activation=tf.nn.relu, input_shape=(784,)),
  layers.Dropout(0.2),
  layers.Dense(10, activation=tf.nn.softmax)
])
liu-seldon
  • 26
  • 3
  • each mnist digit picture has 28*28 pixels, so I guess the model must have explicit input_shape if you want to use save function. – liu-seldon Jan 18 '19 at 14:26