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')
那我该如何保存代码中定义的模型?
答案 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,否则在保存和加载模型时会出现错误。
让我们考虑一个示例,如果您使用最小数据集:
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')