Tensorflow——keras model.save()引发NotImplementedError

时间:2018-09-28 10:41:23

标签: python keras

JSON

当我尝试保存模型时

import tensorflow as tf 

mnist = tf.keras.datasets.mnist 

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

x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
model.add(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=3)

我收到一个NotImplementedError:

model.save('epic_num_reader.model')

那我该如何保存代码中定义的模型?

5 个答案:

答案 0 :(得分:10)

您在第一层的定义中忘记了input_shape参数,这使模型变得不确定,并且尚未实现保存未定义模型,这会引发错误。

model.add(tf.keras.layers.Flatten(input_shape = (my, input, shape)))

只需将input_shape添加到第一层,它就可以正常工作。

答案 1 :(得分:1)

对于那些仍未解决问题(如Matias建议的那样)的人,可以考虑使用tf.keras.models.save_model()load_model()。就我而言,它奏效了。

答案 2 :(得分:1)

错误原因:

我遇到了相同的错误,并尝试了上述答案,但出现错误。但是我找到了解决这个问题的方法,我将在下面分享:

检查是否在定义模型的输入层时通过了input_shape,否则在保存和加载模型时会出现错误。

如何定义input_shape?

让我们考虑一个示例,如果您使用最小数据集:

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

它由大小为28 x 28分辨率的手写数字0-9的图像组成。 为此,我们可以将输入形状定义为(28,28),而无需提及批量大小,如下所示:

model.add(tf.keras.layers.Flatten(input_shape=(28,28)))

通过这种方式,您可以通过查看输入训练数据集来提供输入形状。

保存您训练有素的模型:

现在,在训练和测试模型之后,我们可以保存我们的模型。以下代码为我工作,重新加载模型后,精度也没有改变:

通过使用save_model()

import tensorflow as tf    
tf.keras.models.save_model(
    model,
    "your_trained_model.model",
    overwrite=True,
    include_optimizer=True
) 

使用.save()

your_trained_model.save('your_trained_model.model')

del model  # deletes the existing model

现在加载我们保存的模型:

model2 = tf.keras.models.load_model("your_trained_model.model")

有关更多详细信息,请参见以下链接:Keras input explanation: input_shape, units, batch_size, dim, etc

答案 3 :(得分:0)

tf.keras.models.save_model

在此处工作(tensorflow 1.12.0)(即使未指定input_shape时)

答案 4 :(得分:0)

<!-- Success, please check -->

import tensorflow as tf
import matplotlib.pyplot as plt

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
plt.imshow(x_train[0], cmap=plt.cm.binary)
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)

plt.imshow(x_train[0], cmap=plt.cm.binary)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=x_train[0].shape))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(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=3)

val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss)
print(val_acc)
model.save('epic_num_reader.model')