Keras.model.save() 引发 NotImplementedError 如何解决

「机器学习入坑指南(九):TensorFlow 实战——手写数字识别(MNIST 数据集)」一文中,我们实现了一个模型,完整的代码如下(原文有详细解析):

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())  # 把图片展平成 1x784,这里应该指定 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')

然后就会不幸地引发 NotImplementedError

为了解决这个问题折腾了半天,后来在 Stack Overflow 上提问,大神告诉我是因为我没有给第一层设置 input_shape 参数,导致模型没有明确的定义,而 Keras 并没有实现保存未定义的模型的方法,从而引发了这个错误。

于是,把添加第一层的代码改为

model.add(tf.keras.layers.Flatten(input_shape=(28,28))) #因为输入的是 28x28 的图像(矩阵)

再次保存模型,就不会报错啦!

欢迎访问 Evan 的博客

posted @ 2018-09-29 21:24  Evan-Nightly  阅读(725)  评论(0编辑  收藏  举报