【问题标题】:in TFF context : Is the evaluation step depends on training process?在 TFF 上下文中:评估步骤是否取决于训练过程?
【发布时间】:2020-03-19 12:34:56
【问题描述】:

我们都知道,评估步骤对于在测试的基础上评估我们的模型非常重要。我想知道在进行评估之前是否需要经过一轮步骤(培训)?这意味着我的代码可以是这样的吗?像下面这样正确吗??

emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data()
...
def create_keras_model():
  return tf.keras.models.Sequential([
      tf.keras.layers.Input(shape=(784,)),
      tf.keras.layers.Dense(10, kernel_initializer='zeros'),
      tf.keras.layers.Softmax(),
  ])
def model_fn():
  # We _must_ create a new model here, and _not_ capture it from an external
  # scope. TFF will call this within different graph contexts.
  keras_model = create_keras_model()
  return tff.learning.from_keras_model(
      keras_model,
      dummy_batch=sample_batch,
      loss=tf.keras.losses.SparseCategoricalCrossentropy(),
      metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
iterative_process = tff.learning.build_federated_averaging_process(
    model_fn,
    client_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=0.02),
    server_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=1.0))
state = iterative_process.initialize()
evaluation = tff.learning.build_federated_evaluation(model_fn)
train_metrics = evaluation(state.model, federated_train_data)
federated_test_data = make_federated_data(emnist_test, sample_clients)
test_metrics = evaluation(state.model, federated_test_data)

没有经过这一步

for round_num in range(2, 11):
  state, metrics = iterative_process.next(state, federated_train_data)
  print('round {:2d}, metrics={}'.format(round_num, metrics))

这可能并给我正确的结果吗? 谢谢大家

【问题讨论】:

    标签: tensorflow-federated


    【解决方案1】:

    肯定可以在训练前进行一轮评估,但是否正确取决于所需的测量结果。

    上面的代码可能会报告非常低的评估准确度,因为模型没有经过任何训练步骤并且被初始化为零权重(肯定不是 EMNIST 数据集的最佳模型参数)。我怀疑这是不希望的。

    将评估移动到循环中可能会提供信息,例如采取本地步骤之前对训练数据进行评估。这有助于避免联邦学习中对训练指标的一些困难解释。代码看起来像:

    for round_num in range(2, 11):
      train_metrics = evaluation(state.model, federated_train_data)  # evaluate here
      state, _ = iterative_process.next(state, federated_train_data)  # ignore train metrics
      print('round {:2d}, metrics={}'.format(round_num, train_metrics))
    
    test_metrics = evaluation(state.model, federated_test_data)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-04
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 2021-12-27
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多