【问题标题】:Tensor type error when federated learning联邦学习时的张量类型错误
【发布时间】:2019-10-21 10:48:59
【问题描述】:

我尝试对我的数据使用 tensorflow 联合学习工具。我有两个从 csv 文件中获得的数据集(dataset 和 dataset2),其中前 15 列是特征,最后一列是标签。我将我的 pandas 数据框转换为 tensorflow 数据集。但是,在迭代器中,有一个奇怪的类型错误。我是 tensrflow 的新手并发送代码:任何帮助将不胜感激。提前致谢。

from __future__ import absolute_import, division, print_function
from sklearn.preprocessing import MinMaxScaler
from keras.models import Model

import collections
import numpy as np
import tensorflow as tf
import tensorflow_federated as tff
from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense
from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense
import pandas as pd


X_train= pd.read_csv('./daily_frames_HR.csv')



values = X_train.values

values = values.astype('float32')
# normalize features
scaler = MinMaxScaler(feature_range=(0, 1))
scaled = scaler.fit_transform(values)
# frame as supervised learning

train = values[:, :]
# split into input and outputs
X, y = train[:, :-2], train[:, -1]


def create_compiled_keras_model():
  model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(
      12, activation=tf.nn.softmax, kernel_initializer='zeros', input_dim=15)])

  return model

def model_fn():
  keras_model = create_compiled_keras_model()

  keras_model.compile(loss='binary_crossentropy', optimizer='sgd', metrics= 
   ['SparseCategoricalAccuracy'])
  X_train = pd.read_csv('./daily_frames_HR.csv')

  values = X_train.values

  values = values.astype('float32')
  # normalize features
  scaler = MinMaxScaler(feature_range=(0, 1))
  scaled = scaler.fit_transform(values)
  # frame as supervised learning

  train = values[:, :]
  # split into input and outputs
  X, y = train[:, :-2], train[:, -1]

  sample_batch = collections.OrderedDict([('x', X), ('y', y)])
  return tff.learning.from_compiled_keras_model(keras_model, sample_batch)


  iterative_process = tff.learning.build_federated_averaging_process(model_fn)

  state = iterative_process.initialize()

  X2_train= pd.read_csv('./lab_frames_HR.csv')
  values2 = X2_train.values

  values2 = values2.astype('float32')
  # normalize features
  scaler = MinMaxScaler(feature_range=(0, 1))
  scaled = scaler.fit_transform(values2)
  # frame as supervised learning

  train2 = values2[:, :]
  # split into input and outputs
  X2, y2 = train2[:, :-2], train2[:, -1]

  X2=pd.DataFrame(X2)
  y2=pd.DataFrame(y2)

  X=pd.DataFrame(X)
  y=pd.DataFrame(y)


dataset = tf.data.Dataset.from_tensor_slices((X2.values, y2.values))

dataset2= tf.data.Dataset.from_tensor_slices((X.values, y.values))


list = [dataset, dataset2]

state, metrics = iterative_process.next(state, list)
print('round  1, metrics={}'.format(metrics))

错误信息如下:

Traceback(最近一次调用最后一次): 文件“/home/affectech/Desktop/Fed_son/Fed_son.py”,第 117 行,在 状态,指标 = iterative_process.next(状态,列表) 调用中的文件“/home/affectech/Desktop/Fed_son/venv/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/utils/function_utils.py”,第 666 行 arg = pack_args(self._type_signature.parameter, args, kwargs, context) 文件“/home/affectech/Desktop/Fed_son/venv/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/utils/function_utils.py”,第 424 行,在 pack_args 语境) pack_args_into_anonymous_tuple 中的文件“/home/affectech/Desktop/Fed_son/venv/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/utils/function_utils.py”,第 346 行 result_elements.append((name, context.ingest(arg_value, elem_type))) 文件“/home/affectech/Desktop/Fed_son/venv/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/reference_executor.py”,第 629 行,在摄取中 返回 to_representation_for_type(arg, type_spec, _handle_callable) 文件“/home/affectech/Desktop/Fed_son/venv/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/reference_executor.py”,第 241 行,在 to_representation_for_type 对于 v 的价值 文件“/home/affectech/Desktop/Fed_son/venv/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/reference_executor.py”,第 241 行,在 对于 v 的价值 文件“/home/affectech/Desktop/Fed_son/venv/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/reference_executor.py”,第 200 行,在 to_representation_for_type 对于 v 的价值 文件“/home/affectech/Desktop/Fed_son/venv/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/reference_executor.py”,第 200 行,在 对于 v 的价值 文件“/home/affectech/Desktop/Fed_son/venv/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/reference_executor.py”,第 192 行,在 to_representation_for_type callable_handler) 文件“/home/affectech/Desktop/Fed_son/venv/lib/python3.6/site-packages/tensorflow_federated/python/core/impl/reference_executor.py”,第 165 行,位于 to_representation_for_type '类型规范 {}.'.format(inferred_type_spec, type_spec)) TypeError:值表示的张量类型float32[15]与类型规范float32[?,15]不匹配。

进程以退出代码 1 结束

【问题讨论】:

    标签: python pandas dataframe tensorflow tensorflow-federated


    【解决方案1】:

    看起来对 iterative_process.next(state, list) 的调用期望数据集列表 (list) 是 批处理 数据集列表。如果您不希望每个批次有多个示例,批次大小甚至可以是 1

    batch_size = 1
    list = [dataset.batch(batch_size), dataset2.batch(batch_size)]
    

    使用print(iterative_process.next.type_signature)tf.data.experimental.get_structure(dataset) 可以打印不同对象的类型。

    【讨论】:

      【解决方案2】:

      我看到的一个问题是

      X, y = train[:, :-2], train[:, -1]
      

      您在这里丢失了最后一个功能列,应该是

      X, y = train[:, :-1], train[:, -1]
      

      让这个脚本混乱的是函数体中trainXy的重新定义。该程序永远不会遇到您发布的错误,因为X2 在使用时未定义。作为一般规则,我建议不要重用变量名,这会使程序更容易调试。

      然后,当您抱怨某物的形状时,请在错误发生之前将其(或其中的一部分)打印出来,这将有助于诊断问题所在。

      【讨论】:

      • 感谢您的回答。但是对于 iterative_process.next 函数,我不知道形状期望。此外,当我检查变量时,没有任何形状为 float32[?,15]。您认为这会如何发生?
      猜你喜欢
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多