valueError:`input_spec`是collections.abc.mapping(例如,dict),因此它必须包含一个带有键`' x''的条目,代表输入(s)

发布于 2025-01-25 14:43:26 字数 4082 浏览 0 评论 0 原文

我正在测试本教程,其中包含非IID分布的联合学习:,并使用 tff.simulation.datasets.datasets.build_single_single_label_dataset()作为生成数据集合的非IID分布的方式。

但是我在 input_spec 中遇到了有关KERAS值的错误。

代码:

emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data(
    only_digits=False)

emnist_train1 = tff.simulation.datasets.build_single_label_dataset(
  emnist_train.create_tf_dataset_from_all_clients(),
  label_key='label', desired_label=1)

MAX_CLIENT_DATASET_SIZE = 418

CLIENT_EPOCHS_PER_ROUND = 1
CLIENT_BATCH_SIZE = 20
TEST_BATCH_SIZE = 500

def reshape_emnist_element(element):
  return (tf.expand_dims(element['pixels'], axis=-1), element['label'])

def preprocess_train_dataset(dataset):
  return (dataset
          .shuffle(buffer_size=MAX_CLIENT_DATASET_SIZE)
          .repeat(CLIENT_EPOCHS_PER_ROUND)
          .batch(CLIENT_BATCH_SIZE, drop_remainder=False)
          .map(reshape_emnist_element))

emnist_train1 = preprocess_train_dataset(emnist_train1)

import random
NUM_CLIENTS = 100

client_datasets = [
   emnist_train1.take(random.randint(1, CLIENT_BATCH_SIZE))
   for _ in range(NUM_CLIENTS)
]

emnist_train1 = client_datasets

def create_original_fedavg_cnn_model(only_digits=True):
  """The CNN model used in https://arxiv.org/abs/1602.05629."""
  data_format = 'channels_last'

  max_pool = functools.partial(
      tf.keras.layers.MaxPooling2D,
      pool_size=(2, 2),
      padding='same',
      data_format=data_format)
  conv2d = functools.partial(
      tf.keras.layers.Conv2D,
      kernel_size=5,
      padding='same',
      data_format=data_format,
      activation=tf.nn.relu)

  model = tf.keras.models.Sequential([
      tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),
      conv2d(filters=32),
      max_pool(),
      conv2d(filters=64),
      max_pool(),
      tf.keras.layers.Flatten(),
      tf.keras.layers.Dense(512, activation=tf.nn.relu),
      tf.keras.layers.Dense(10 if only_digits else 62),
      tf.keras.layers.Softmax(),
  ])

  return model

input_spec = emnist_train.create_tf_dataset_for_client(
    emnist_train.client_ids[0]).element_spec

def tff_model_fn():
  keras_model = create_original_fedavg_cnn_model()
  return tff.learning.from_keras_model(
      keras_model=keras_model,
      input_spec=input_spec,
      loss=tf.keras.losses.SparseCategoricalCrossentropy(),
      metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

federated_averaging = tff.learning.build_federated_averaging_process(
    model_fn=tff_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))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-11-7661a3b7dc92> in <module>()
      3     model_fn=tff_model_fn,
      4     client_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=0.02),
----> 5     server_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=1.0))

6 frames
/usr/local/lib/python3.7/dist-packages/tensorflow_federated/python/learning/keras_utils.py in from_keras_model(keras_model, loss, input_spec, loss_weights, metrics)
    176           'The `input_spec` is a collections.abc.Mapping (e.g., a dict), so it '
    177           'must contain an entry with key `\'{}\'`, representing the input(s) '
--> 178           'to the Keras model.'.format(model_lib.MODEL_ARG_NAME))
    179     if model_lib.MODEL_LABEL_NAME not in input_spec:
    180       raise ValueError(

value error: input_spec 是一个collections.abc.mapping(例如,dict),因此它必须包含带有键'x'x'的条目,代表输入(S)到Keras模型。

这意味着什么?我该如何解决?

I'm testing this tutorial with non-IID distribution for federated learning: https://www.tensorflow.org/federated/tutorials/tff_for_federated_learning_research_compression, and using tff.simulation.datasets.build_single_label_dataset() as a way to produce a non-IID distribution for the dataset.

But I faced an error regarding keras values in the input_spec.

The code:

emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data(
    only_digits=False)

emnist_train1 = tff.simulation.datasets.build_single_label_dataset(
  emnist_train.create_tf_dataset_from_all_clients(),
  label_key='label', desired_label=1)

MAX_CLIENT_DATASET_SIZE = 418

CLIENT_EPOCHS_PER_ROUND = 1
CLIENT_BATCH_SIZE = 20
TEST_BATCH_SIZE = 500

def reshape_emnist_element(element):
  return (tf.expand_dims(element['pixels'], axis=-1), element['label'])

def preprocess_train_dataset(dataset):
  return (dataset
          .shuffle(buffer_size=MAX_CLIENT_DATASET_SIZE)
          .repeat(CLIENT_EPOCHS_PER_ROUND)
          .batch(CLIENT_BATCH_SIZE, drop_remainder=False)
          .map(reshape_emnist_element))

emnist_train1 = preprocess_train_dataset(emnist_train1)

import random
NUM_CLIENTS = 100

client_datasets = [
   emnist_train1.take(random.randint(1, CLIENT_BATCH_SIZE))
   for _ in range(NUM_CLIENTS)
]

emnist_train1 = client_datasets

def create_original_fedavg_cnn_model(only_digits=True):
  """The CNN model used in https://arxiv.org/abs/1602.05629."""
  data_format = 'channels_last'

  max_pool = functools.partial(
      tf.keras.layers.MaxPooling2D,
      pool_size=(2, 2),
      padding='same',
      data_format=data_format)
  conv2d = functools.partial(
      tf.keras.layers.Conv2D,
      kernel_size=5,
      padding='same',
      data_format=data_format,
      activation=tf.nn.relu)

  model = tf.keras.models.Sequential([
      tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),
      conv2d(filters=32),
      max_pool(),
      conv2d(filters=64),
      max_pool(),
      tf.keras.layers.Flatten(),
      tf.keras.layers.Dense(512, activation=tf.nn.relu),
      tf.keras.layers.Dense(10 if only_digits else 62),
      tf.keras.layers.Softmax(),
  ])

  return model

input_spec = emnist_train.create_tf_dataset_for_client(
    emnist_train.client_ids[0]).element_spec

def tff_model_fn():
  keras_model = create_original_fedavg_cnn_model()
  return tff.learning.from_keras_model(
      keras_model=keras_model,
      input_spec=input_spec,
      loss=tf.keras.losses.SparseCategoricalCrossentropy(),
      metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

federated_averaging = tff.learning.build_federated_averaging_process(
    model_fn=tff_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))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-11-7661a3b7dc92> in <module>()
      3     model_fn=tff_model_fn,
      4     client_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=0.02),
----> 5     server_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=1.0))

6 frames
/usr/local/lib/python3.7/dist-packages/tensorflow_federated/python/learning/keras_utils.py in from_keras_model(keras_model, loss, input_spec, loss_weights, metrics)
    176           'The `input_spec` is a collections.abc.Mapping (e.g., a dict), so it '
    177           'must contain an entry with key `\'{}\'`, representing the input(s) '
--> 178           'to the Keras model.'.format(model_lib.MODEL_ARG_NAME))
    179     if model_lib.MODEL_LABEL_NAME not in input_spec:
    180       raise ValueError(

ValueError: The input_spec is a collections.abc.Mapping (e.g., a dict), so it must contain an entry with key 'x', representing the input(s) to the Keras model.

What does that mean? How can I solve it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文