TFF:评估联邦学习模型,损失值大幅增加

TFF: evaluating the federated learning model and got a large increase of loss value

我正在尝试根据此 tutorial 评估联邦学习模型。如下面的代码

test_data = test.create_tf_dataset_from_all_clients().map(reshape_data).batch(2)
test_data = test_data.map(lambda x: (x['x'], x['y']))

def evaluate(server_state):
  keras_model = create_keras_model()
  keras_model.compile(
      loss=tf.keras.losses.SparseCategoricalCrossentropy(),
      metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]  
  )
  keras_model.set_weights(server_state)
  keras_model.evaluate(test_data)

server_state = federated_algorithm.initialize()
evaluate(server_state)

>>> 271/271 [==============================] - 1s 2ms/step - loss: 23.7232 - sparse_categorical_accuracy: 0.3173

之后,我对其进行多轮训练,然后进行评估

server_state = federated_algorithm.initialize()
for round in range(20):
  server_state = federated_algorithm.next(server_state, train_data)

evaluate(server_state)

>>> 271/271 [==============================] - 1s 2ms/step - loss: 5193926.5000 - sparse_categorical_accuracy: 0.4576

我看到准确率提高了,但是损失值很大。为什么会这样,我该如何解决? 另外,如何查看每一轮的训练结果?

回答你问题的第二部分:你可以在 for 循环中调用 evaluate 来查看每一轮后的结果。

for round in range(20):
    server_state = federated_algorithm.next(server_state, train_data)
    evaluate(server_state)

要每 2 轮查看一次结果,您可以使用类似的方法:

for round in range(20):
    server_state = federated_algorithm.next(server_state, train_data)
    if (round% 2) == 0:
        evaluate(server_state)

我希望这能帮助您跟踪不断增加的损失问题。

如果模型预测正确 类 但置信度较低,则可能会发生这种情况。例如,对于 label0,如果基本事实为 1 而您预测为 0.45,则准确度测量会将其计为 FN。但如果你的模型预测为 0.51,这将被计为 TP,但损失值不会有太大变化。同样,如果 label1 为 0 而您预测为 0.1,则损失会很低,但如果模型预测为 0.4,则损失会很高而不会影响准确性。

您可以检查每个时期的平均预测趋势如何。这可能会指出您的问题。