在「機器學(xué)習(xí)入坑指南(九):TensorFlow 實戰(zhàn)——手寫數(shù)字識別(MNIST 數(shù)據(jù)集)」一文中,我們實現(xiàn)了一個模型,完整的代碼如下(原文有詳細(xì)解析):
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,這里應(yīng)該指定 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')
然后就會不幸地引發(fā) NotImplementedError

image
為了解決這個問題折騰了半天,后來在 Stack Overflow 上提問,大神告訴我是因為我沒有給第一層設(shè)置 input_shape 參數(shù),導(dǎo)致模型沒有明確的定義,而 Keras 并沒有實現(xiàn)保存未定義的模型的方法,從而引發(fā)了這個錯誤。
于是,把添加第一層的代碼改為
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) #因為輸入的是 28x28 的圖像(矩陣)
再次保存模型,就不會報錯啦!
歡迎訪問 Evan 的博客