Keras加载模型后精度低

时间:2020-10-26 17:11:33

标签: tensorflow keras

我看到一个非常奇怪的情况。训练卷积网络后,我在验证数据上获得了约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()

2 个答案:

答案 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)

在注释掉这些行之后,我的网络就像一个魅力。 对我有帮助,希望对你有帮助。