首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建联邦学习数据

创建联邦学习数据
EN

Stack Overflow用户
提问于 2022-03-31 13:09:50
回答 1查看 194关注 0票数 1

我正在尝试创建一个联邦学习数据集,我想稍后使用它来训练一组模型(不是针对Fed-avg)。我正在尝试以下方法(此代码可在TFF的官方教程中找到):

代码语言:javascript
复制
emnist_train, emnist_test = tff.simulation.datasets.emnist.load_data()

然后定义一些用于预处理的助手:

代码语言:javascript
复制
    def preprocess(dataset):

  def batch_format_fn(element):
    """Flatten a batch `pixels` and return the features as an `OrderedDict`."""
    return collections.OrderedDict(
        x=tf.reshape(element['pixels'], [-1, 784]),
        y=tf.reshape(element['label'], [-1, 1]))

  return dataset.repeat(NUM_EPOCHS).shuffle(SHUFFLE_BUFFER, seed=1).batch(
      BATCH_SIZE).map(batch_format_fn).prefetch(PREFETCH_BUFFER)


def make_federated_data(client_data, client_ids):
  return [
      preprocess(client_data.create_tf_dataset_for_client(x))
      for x in client_ids
  ]

下一步是创建联邦数据,如下所示:

代码语言:javascript
复制
sample_clients = emnist_train.client_ids[0:NUM_CLIENTS]

federated_train_data = make_federated_data(emnist_train, sample_clients)

federated_train_data是一个项目列表,每个项目都是OrderedDict的集合。每个OrderedDict都有一组X(像素),Y(标签)。我需要提取X,Y,并将它们提供给Keras模型,如下所示:

代码语言:javascript
复制
one_client_data = tfds.as_numpy(federated_train_data[0])
pd = pd.DataFrame(one_client_data)
X = pd['x']
Y = pd['y']
def create_keras_model():
  return tf.keras.models.Sequential([
      tf.keras.layers.InputLayer(input_shape=(784,)),
      tf.keras.layers.Dense(10, kernel_initializer='zeros'),
      tf.keras.layers.Softmax(),
  ])

model = create_keras_model()
model.compile(loss='sparse_categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# Fit data to model
history = model.fit(X, Y,
            batch_size=32,
            epochs=5,
            verbose=1)

但问题是我搞错了

代码语言:javascript
复制
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).

任何想法!

EN

回答 1

Stack Overflow用户

发布于 2022-04-08 16:21:28

首先,这是一个小问题,因为您正在用一个dataframe覆盖您的熊猫进口:

代码语言:javascript
复制
pd = pd.DataFrame(one_client_data)

所以,让我们将其改为df:

代码语言:javascript
复制
df = pd.DataFrame(one_client_data)
X = df['x']
Y = df['y']

其次,这给你X和Y作为一个pd.Series,而不是一个numpy数组。要将这些输入到numpy数组中,请执行以下操作。这将清除您的值错误。在此之后,您可能会对数据的形状产生一些不匹配模型形状的问题,但这是另一个问题。

代码语言:javascript
复制
X = np.array(X.tolist())
Y = np.array(Y.tolist())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71693100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档