Tensorflow Federated 对象不可订阅
Tensorflow Federated object is not subscriptable
我有这样的 run_one_round 函数:
def run_one_round(server_state, federated_dataset):
"""Orchestration logic for one round of computation.
Args:
server_state: A `ServerState`.
federated_dataset: A federated `tf.data.Dataset` with placement
`tff.CLIENTS`.
Returns:
A tuple of updated `ServerState` and `tf.Tensor` of average loss.
"""
tf.print("run_one_round")
server_message = tff.federated_map(server_message_fn, server_state)
server_message_at_client = tff.federated_broadcast(server_message)
client_outputs = tff.federated_map(
client_update_fn, (federated_dataset, server_message_at_client))
weight_denom = client_outputs.client_weight
from tensorflow_federated.python.core.impl.federated_context import value_impl
value = value_impl.to_value(client_outputs.test, None)
from tensorflow_federated.python.core.impl.types import placements
from tensorflow_federated.python.core.impl.federated_context import value_utils
value = value_utils.ensure_federated_value(value, placements.CLIENTS,
'value to be averaged')
value_comp = value.comp
testing = []
import sparse_ternary_compression
for index in range(len(value_comp[0])):
testing.append(
sparse_ternary_compression.stc_decompression(value_comp[0][index][0], value_comp[0][index][1],
value_comp[0][index][2], value_comp[0][index][3],
value_comp[0][index][4]))
# round_model_delta indica i pesi che vengono usati su server_update. Quindi è quello che va cambiato
round_model_delta = tff.federated_mean(
client_outputs.weights_delta, weight=weight_denom)
server_state = tff.federated_map(server_update_fn, (server_state, round_model_delta))
round_loss_metric = tff.federated_mean(client_outputs.model_output, weight=weight_denom)
return server_state, round_loss_metric, value.comp
但是当我尝试这样做时:
value_comp = value.comp
testing = []
import sparse_ternary_compression
for index in range(len(value_comp[0])):
testing.append(
sparse_ternary_compression.stc_decompression(value_comp[0][index][0], value_comp[0][index][1],
value_comp[0][index][2], value_comp[0][index][3],
value_comp[0][index][4]))
我收到此错误:"
File "/mnt/d/Davide/Uni/TesiMagistrale/ProgettoTesi/simple_fedavg_tff.py", line 137, in run_one_round
for index in range(len(value_comp[0])):
TypeError: 'Call' object is not subscriptable
虽然如果我 return 值 value.comp
然后我在 main 中执行相同的操作它工作正常。
for round_num in range(FLAGS.total_rounds):
print("--------------------------------------------------------")
sampled_clients = np.random.choice(train_data.client_ids, size=FLAGS.train_clients_per_round, replace=False)
sampled_train_data = [train_data.create_tf_dataset_for_client(client) for client in sampled_clients]
代码是一样的,为什么我不能在 run_one_round
函数中使用 for
循环?
server_state, train_metrics, value_comp = iterative_process.next(server_state, sampled_train_data)
testing = []
import sparse_ternary_compression
for index in range(len(value_comp[0])):
testing.append(sparse_ternary_compression.stc_decompression(value_comp[0][index][0], value_comp[0][index][1],
value_comp[0][index][2], value_comp[0][index][3],
value_comp[0][index][4]))
print(testing)
print(f'Round {round_num}')
print(f'\tTraining loss: {train_metrics:.4f}')
if round_num % FLAGS.rounds_per_eval == 0:
server_state.model_weights.assign_weights_to(keras_model)
accuracy = evaluate(keras_model, test_data)
print(f'\tValidation accuracy: {accuracy * 100.0:.2f}%')
tf.print(tf.compat.v2.summary.scalar("Accuracy", accuracy * 100.0, step=round_num))
基本上我只想访问客户端使用 client_update
发送的 test
变量,并在 tff.federated_mean
函数之前对该列表进行一些操作。
问题可能是 run_one_round
是 tff.federated_computation
?
先完成 Building Your Own Federated Learning Algorithm 教程可能会有帮助。
我认为您应该记住的主要事情是,任何 TensorFlow 代码或任何结构操作都应该在 tff.tf_computation
修饰的方法中。然后在 tff.federated_computation
装饰方法的范围内使用 tff.federated_*
运算符连接这些构建块。
我假设您的代码片段中的 stc_decompression
是某种 TensorFlow 逻辑。但是,您传递给它的不是任何 TF 可理解的值,而是计算结果的抽象表示,这些表示主要是 TFF 的内部实现细节。
因此,无论您想用这些方法做什么,都可以在 tff.tf_computation
装饰方法中进行,您可以在其中编写任何 TF 代码。您将通过使用 tff.federated_map
运算符调用该方法来获取您的价值。
我有这样的 run_one_round 函数:
def run_one_round(server_state, federated_dataset):
"""Orchestration logic for one round of computation.
Args:
server_state: A `ServerState`.
federated_dataset: A federated `tf.data.Dataset` with placement
`tff.CLIENTS`.
Returns:
A tuple of updated `ServerState` and `tf.Tensor` of average loss.
"""
tf.print("run_one_round")
server_message = tff.federated_map(server_message_fn, server_state)
server_message_at_client = tff.federated_broadcast(server_message)
client_outputs = tff.federated_map(
client_update_fn, (federated_dataset, server_message_at_client))
weight_denom = client_outputs.client_weight
from tensorflow_federated.python.core.impl.federated_context import value_impl
value = value_impl.to_value(client_outputs.test, None)
from tensorflow_federated.python.core.impl.types import placements
from tensorflow_federated.python.core.impl.federated_context import value_utils
value = value_utils.ensure_federated_value(value, placements.CLIENTS,
'value to be averaged')
value_comp = value.comp
testing = []
import sparse_ternary_compression
for index in range(len(value_comp[0])):
testing.append(
sparse_ternary_compression.stc_decompression(value_comp[0][index][0], value_comp[0][index][1],
value_comp[0][index][2], value_comp[0][index][3],
value_comp[0][index][4]))
# round_model_delta indica i pesi che vengono usati su server_update. Quindi è quello che va cambiato
round_model_delta = tff.federated_mean(
client_outputs.weights_delta, weight=weight_denom)
server_state = tff.federated_map(server_update_fn, (server_state, round_model_delta))
round_loss_metric = tff.federated_mean(client_outputs.model_output, weight=weight_denom)
return server_state, round_loss_metric, value.comp
但是当我尝试这样做时:
value_comp = value.comp
testing = []
import sparse_ternary_compression
for index in range(len(value_comp[0])):
testing.append(
sparse_ternary_compression.stc_decompression(value_comp[0][index][0], value_comp[0][index][1],
value_comp[0][index][2], value_comp[0][index][3],
value_comp[0][index][4]))
我收到此错误:"
File "/mnt/d/Davide/Uni/TesiMagistrale/ProgettoTesi/simple_fedavg_tff.py", line 137, in run_one_round
for index in range(len(value_comp[0])):
TypeError: 'Call' object is not subscriptable
虽然如果我 return 值 value.comp
然后我在 main 中执行相同的操作它工作正常。
for round_num in range(FLAGS.total_rounds):
print("--------------------------------------------------------")
sampled_clients = np.random.choice(train_data.client_ids, size=FLAGS.train_clients_per_round, replace=False)
sampled_train_data = [train_data.create_tf_dataset_for_client(client) for client in sampled_clients]
代码是一样的,为什么我不能在 run_one_round
函数中使用 for
循环?
server_state, train_metrics, value_comp = iterative_process.next(server_state, sampled_train_data)
testing = []
import sparse_ternary_compression
for index in range(len(value_comp[0])):
testing.append(sparse_ternary_compression.stc_decompression(value_comp[0][index][0], value_comp[0][index][1],
value_comp[0][index][2], value_comp[0][index][3],
value_comp[0][index][4]))
print(testing)
print(f'Round {round_num}')
print(f'\tTraining loss: {train_metrics:.4f}')
if round_num % FLAGS.rounds_per_eval == 0:
server_state.model_weights.assign_weights_to(keras_model)
accuracy = evaluate(keras_model, test_data)
print(f'\tValidation accuracy: {accuracy * 100.0:.2f}%')
tf.print(tf.compat.v2.summary.scalar("Accuracy", accuracy * 100.0, step=round_num))
基本上我只想访问客户端使用 client_update
发送的 test
变量,并在 tff.federated_mean
函数之前对该列表进行一些操作。
问题可能是 run_one_round
是 tff.federated_computation
?
先完成 Building Your Own Federated Learning Algorithm 教程可能会有帮助。
我认为您应该记住的主要事情是,任何 TensorFlow 代码或任何结构操作都应该在 tff.tf_computation
修饰的方法中。然后在 tff.federated_computation
装饰方法的范围内使用 tff.federated_*
运算符连接这些构建块。
我假设您的代码片段中的 stc_decompression
是某种 TensorFlow 逻辑。但是,您传递给它的不是任何 TF 可理解的值,而是计算结果的抽象表示,这些表示主要是 TFF 的内部实现细节。
因此,无论您想用这些方法做什么,都可以在 tff.tf_computation
装饰方法中进行,您可以在其中编写任何 TF 代码。您将通过使用 tff.federated_map
运算符调用该方法来获取您的价值。