没有传递到第一层的“input_shape”的顺序模型无法重新加载优化器状态

Sequentialmodels without `input_shape` passed to the 1st layer cannot reload optimizer state

警告:tensorflow:没有 input_shape 传递到第一层的顺序模型无法重新加载其优化器状态。因此,您的模型从新初始化的优化器开始。

在尝试加载已保存的模型时,我遇到了来自 tensorflow 的警告

import tensorflow.keras as keras
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)

model.save('epic_num_reader.model')
new_model = tf.keras.models.load_model('epic_num_reader.model')
predictions = new_model.predict(x_test)

如警告所示,您的第一层需要参数 input_shape。在您的情况下,这将是 Flatten.

在 keras 文档中有一个关于顺序 API 的额外部分。有关详细信息,请参阅 here

升级到TF 1.14后有同样的问题,我通过更改第一层的定义修复了这个问题:

model.add(tf.keras.layers.Flatten())

至此

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

其中 28 是要展平的输入图的大小(在我们的例子中是 mnist 像素)

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

对于 tf 1.14 之后的第一层,需要使用输入类型,即特定图像的尺寸。

或者您可能会在检索模型时收到警告,提示您的优化器无法正常工作