我看到一个非常奇怪的情况。训练卷积网络后,我在验证数据上获得了约95%的准确性。我保存模型。稍后,我还原模型并在相同的验证数据集上运行验证。这次我几乎没有获得10%的准确性。我已经读过documentation,但似乎无济于事。我在做错什么吗?
def build_model_mnist(image_width, image_height, image_depth):
model = keras.Sequential()
model.add(keras.layers.Conv2D(5, (3, 3), activation='relu', input_shape=(image_width, image_height, image_depth)))
model.add(keras.layers.MaxPooling2D((2, 2)))
model.add(keras.layers.Conv2D(10, (3, 3), activation='relu'))
model.add(keras.layers.MaxPooling2D((2, 2)))
model.add(keras.layers.Conv2D(10, (3, 3), activation='relu'))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(64, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
def train_mnist():
model = build_model_mnist(image_width=train_images.shape[1],
image_height=train_images.shape[2],
image_depth=train_images.shape[3])
# Start training
h = model.fit(train_images, train_labels, batch_size=500, epochs=5)
model.save("minist")
# Evaluate the model
test_loss, test_acc = model.evaluate(test_images, test_labels)
print("Accuracy:", test_acc)
train_mnist()
以上将显示95%的准确性。但是下面的代码显示了10%的准确性。
def evaluate_mnist():
# Load the model
model = keras.models.load_model("minist")
# Evaluate the model
test_loss, test_acc = model.evaluate(test_images, test_labels)
print("Accuracy:", test_acc)
evaluate_mnist()
如果仅保存和恢复权重,则一切正常。在下面的代码中,我们仅保存权重。稍后,我们使用代码重新创建模型体系结构并恢复权重。这种方法产生正确的准确性。
def train_mnist():
#Create the network model
model = build_model_mnist(image_width=train_images.shape[1],
image_height=train_images.shape[2],
image_depth=train_images.shape[3])
# Start training
h = model.fit(train_images, train_labels, batch_size=500, epochs=5)
# Evaluate the model
test_loss, test_acc = model.evaluate(test_images, test_labels)
print("Accuracy:", test_acc)
model.save_weights("minist-weights")
train_mnist()
def evaluate_mnist():
# Re-create the model architecture
model = build_model_mnist(image_width=train_images.shape[1],
image_height=train_images.shape[2],
image_depth=train_images.shape[3])
model.load_weights("minist-weights")
# Evaluate the model
test_loss, test_acc = model.evaluate(test_images, test_labels)
print("Accuracy:", test_acc)
evaluate_mnist()
答案 0 :(得分:0)
在tf 2.3.0中,我遇到了类似的问题。
此issue解释了使用sparse_categorical_crossentropy时通用术语“准确性”度量标准的问题。在重新加载模型时,它会关联错误的精度指标。 解决方案是显式地告诉keras使用正确的度量标准,而不是让它推断出正确的度量标准(即其中的错误),即使用metrics ='sparse_categorical_accuracy'进行编译。
在训练阶段,我最初使用metrics ='accuracy'作为度量标准,发现只有在重新加载后重新编译模型,它才能恢复预期的性能。
答案 1 :(得分:0)
虽然对我来说,我也因为这个错误卡住了,但是看了我的代码2到3遍后,发现程序在走(model = keras.Sequential())
之前声明的模型,结果是保存 (model = keras.models.load_model("minist"))
后将其与模型混淆。为了解决这个问题,在用权重保存模型后,我删除了以下几行:
model = keras.Sequential(), and all the model.add() lines
model.fit(train_images, train_labels, batch_size=500, epochs=5)
在注释掉这些行之后,我的网络就像一个魅力。 对我有帮助,希望对你有帮助。