Ошибка типа тензора при федеративном обучении - PullRequest
0 голосов
/ 21 октября 2019

Я пытался использовать инструмент федеративного обучения tenorflow для своих данных. У меня есть два набора данных (набор данных и набор данных2), полученные из CSV-файлов, где первые 15 столбцов являются объектами, а последний столбец является меткой. Я преобразовал свой кадр данных pandas в набор данных tenorflow. Однако у итератора возникает странная ошибка типа. Я новичок в tenrflow и отправка кода: любая помощь будет оценена. Заранее спасибо.

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, в состоянии, metrics = 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 / tenorflow_federated / python / core / impl / utils / function_utils.py ", строка 424, в контексте pack_args) Файл" /home/affectech/Desktop/Fed_son/venv/lib/python3.6/site-packages/tensorflow_federated/python / core / impl / utils / function_utils.py ", строка 346, в pack_args_into_anonymous_tuple result_elements.append ((имя, context.ingest (arg_value, elem_type))) файл" / home / affectech / Desktop / Fed_son / venv / lib /python3.6 / сайт-пакеты / tensorflow_federated / питон / ядро ​​/ осущ / справочникce_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/corereference_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, для for в значении File "/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 / tenorflow_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 'type spec {}.' (inferred_type_spec, type_spec)) TypeError: Тензорный тип float32 [15] представления значения не соответствует спецификации типа float32 [?, 15].

Процесс завершен с кодом выхода 1

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Похоже, что вызов 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).

0 голосов
/ 21 октября 2019

Одна проблема, которую я вижу, это

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

Вы теряете свой последний столбец функций здесь, скорее всего, он будет

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

Что сбивает с толку этот скрипт, так это переопределение train, X и y в теле функции. Эта программа никогда не должна получать сообщение об ошибке, которую вы публикуете, потому что X2 не определяется временем ее использования. Я бы рекомендовал не использовать имена переменных как общее правило, это облегчит вам отладку программы.

Затем, когда вы получите жалобу на форму чего-либо, распечатайте ее (или ее часть). ), прежде чем произойдет ошибка, это поможет диагностировать, что не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...