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,则损失会很高而不会影响准确性。
您可以检查每个时期的平均预测趋势如何。这可能会指出您的问题。
我正在尝试根据此 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,则损失会很高而不会影响准确性。
您可以检查每个时期的平均预测趋势如何。这可能会指出您的问题。