Функция списка потоков tenorflow (multi-hot) для tf.estimator - PullRequest
0 голосов
/ 23 октября 2018

Некоторые типы данных столбцов объектов list.И их длина может быть разной.Я хочу закодировать этот столбец как горячую категориальную функцию и передать ее в tf.estimator.Я попробовал следующее, но ошибка Unable to get element as bytes показала.Я думаю, что это обычная практика в глубоком обучении, особенно в системах рекомендаций, например, в модели Deep & Wide.Я нашел соответствующий вопрос здесь , но он не показывает, как подать в оценщик.

import pandas as pd
import tensorflow as tf

OUTDIR = "./data"

data = {"x": [["a", "c"], ["a", "b"], ["b", "c"]], "y": ["x", "y", "z"]}
df = pd.DataFrame(data)

Y = df["y"]
X = df.drop("y", axis=1)

indicator_features = [
    tf.feature_column.indicator_column(
        categorical_column=tf.feature_column.categorical_column_with_vocabulary_list(
            key="x", vocabulary_list=["a", "b", "c"]
        )
    )
]

model = tf.estimator.LinearClassifier(
    feature_columns=indicator_features, model_dir=OUTDIR
)

training_input_fn = tf.estimator.inputs.pandas_input_fn(
    x=X, y=Y, batch_size=64, shuffle=True, num_epochs=None
)

model.train(input_fn=training_input_fn)

Следующая ошибка:

ИНФОРМАЦИЯ: tenorflow: Использование конфигурации по умолчанию.ИНФОРМАЦИЯ: tenorsflow: Использование config: {'_model_dir': 'testalg', '_tf_random_seed': нет, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '__cheke__con__set__set_set_set_set_set_set_set_set_setless5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': нет, '_device_fn': нет, '_service': нет, '_cluster_spec':, '_task_' ':' _task_ ':' _task_ ':, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO: tenorflow: вызов model_fn.ИНФОРМАЦИЯ: tenorflow: Закончен вызов model_fn.ИНФОРМАЦИЯ: tenorflow: создать CheckpointSaverHook.ИНФОРМАЦИЯ: tenorflow: График был завершен.ИНФОРМАЦИЯ: tenorflow: выполняется local_init_op.ИНФОРМАЦИЯ: tenorsflow: Закончено выполнение local_init_op.ИНФОРМАЦИЯ: tenorsflow: ошибка, переданная координатору:, Невозможно получить элемент в байтах.ИНФОРМАЦИЯ: tenorflow: сохранение контрольных точек для 0 в testalg / model.ckpt.------------------------------------------------------- InternalError Traceback (последний вызов был последним) /home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py в _do_call (self, fn, * args) 1321 try: -> 1322 return fn (* args) 1323 за исключением ошибок. Ошибка: e:

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages / tenorflow / python /client / session.py в _run_fn (feed_dict, fetch_list, target_list, options, run_metadata) 1306 возвращает self._call_tf_sessionrun (-> 1307 опций, feed_dict, fetch_list, target_list, run_metadata) 1308

/ home / yinan./anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py в _call_tf_sessionrun (self, параметры, feed_dict, fetch_list, target_list, run_metadata) 1408 self._session, параметры, feed_dict, fetch_list, target_list-> 1409 run_metadata) 1410 else:

InternalError: Невозможно получить элемент в байтах.

Во время обработки вышеупомянутого исключения произошло другое исключение:

InternalError Traceback (последний последний вызов) в () 44 45 ---> 46 model.train (input_fn = training_input_fn)

/ home / yinan.li1 / anaconda3 / lib / python3.5, hooks, Saving_Listeners) 367 logging.info ('Потеря для последнего шага:% s.', потеря) 368 вернуть себя

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages/tensorflow/python/estimator/estimator.py в _train_model (self, input_fn, hooks, Saving_Listeners) 1117
вернуть self._train_model_distributed (input_fn, hooks, Saving_Listeners) 1118 иначе:, save_listeners) 1120 1121 def _train_model_default (self, input_fn, hooks, save_listeners):

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages / tenorflow / python / estimatили / estimator.py в _train_model_default (self, input_fn, hooks, save_listeners)
1133 возвращает self._train_with_estimator_spec (estimator_spec, worker_hooks, 1134
hooks, global_step_tensor, -> 1135 Saving_Listeners) 1136 1137 Def _train_model_distributed (self, input_fn, hooks, Saving_Listeners):

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages / tenorflowflow /python / estimator / estimator.py в _train_with_estimator_spec (self, estimator_spec, worker_hooks, hooks, global_step_tensor, Saving_Listeners), estimator_spec.loss]) 1337 возвращаемая потеря 1338

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages / tenorflow / python / training / monitored_session.py в exit (self, instance_type, exception_value, traceback) 687 если тип_исключения в [errors.OutOfRangeError, StopIteration]: 688 тип_исключения = Нет -> 689 self._close_internal (тип_исключения) 690 # выход должен возвращать значение True дляисключить исключение691 возвращать тип_исключения - Нет

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages / tenorflow / python / training / monitored_session.py в _close_internal (self, exception_type) 724, если self._sess is None: 725 повысить RuntimeError ('Сессия уже закрыта.') -> 726 self._sess.close () 727 окончательно: 728 self._sess = None

/ home / yinan.li1 / anaconda3/lib/python3.6/site-packages/tensorflow/python/training/monitored_session.py в close (self) 972, если self._sess: 973, попробовать: -> 974 self._sess.close () 975, за исключением _PREEMPTION_ERRORS: 976pass

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages / tenorflow / python / training / monitored_session.py в тесном (self) 1116 self._coord.join (1117 * 1045)* stop_grace_period_secs = self._stop_grace_period_secs, -> 1118 ignore_live_threads = True) 1119 окончательно: 1120 попробовать:

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages / tenorflow / python / training/coordinator.py в соединении (self, потоки, stop_grace_period_secs, ignore_live_threads) 387 self._registered_threads = set () 388 если self._exc_info_to_raise: -> 389 six.reraise (* self._exc_info_to_raise) 390 elif отставших: 391 если ignore_live_threads:

/ home / yinan.li1anaconda3 / lib / python3.6 / site-packages / six.py в ререйзе (tp, value, tb) 683 значение = tp () 684, если значение. traceback не равно tb: -> 685 повышениеvalue.with_traceback (tb) 686 повышает значение 687

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages / tenorflow / python / estimator / input / queues / feed_queue_runner.py в _run(self, sess, enqueue_op, feed_fn ,ordin) 92 try: 93 feed_dict = Нет, если feed_fn равен None, иначе feed_fn () ---> 94 sess.run (enqueue_op, feed_dict = feed_dict) 95 за исключением (errors.OutOfRangeError, ошибок.CancelledError): 96 # Это исключение означает, что очередь была закрыта.

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages / tenorflow / python / client / session.py в запуске(self, fetches, feed_dict, options, run_metadata) 898 try: 899 result = self._run (Нет, выборки, feed_dict, options_ptr, -> 900 run_metadata_ptr) 901, если run_metadata: 902 proto_data = tf_session.TF_GetBuffer (run_metadata_ptr)

/ home / yinan.li1 / anaconda3 / lib / python3,6 сайта / lib / python3.6/python/client/session.py в _run (self, handle, fetches, feed_dict, options, run_metadata)
1133, если final_fetches или final_targets или (handle и feed_dict_tensor): 1134 results = self._do_run (handle,final_targets, final_fetches, -> 1135 feed_dict_tensor, options, run_metadata) 1136 else: 1137 results = []

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages / tenorflow / python /client / session.py в _do_run (self, handle, target_list, fetch_list, feed_dict, options, run_metadata) 1314, если handle равен None: 1315 вернуть self._do_call (_run_fn, feeds, выборки, цели, параметры, -> 1316 run_metadata) 1317остальное: 1318 возвращает self._do_call (_prun_fn, дескриптор, фиды, выборки)

/ home / yinan.li1 / anaconda3 / lib / python3.6 / site-packages / tenorflow / python / client / session.pyin _do_call (self, fn, * args) 1333, кроме KeyError: 1334 pass -> 1335, тип повышения (e) (node_def, op, message) 1336 1337 def _extend_graph (self):

InternalError: невозможно получитьэлемент в байтах.

1 Ответ

0 голосов
/ 15 марта 2019

Я думаю, что одной из проблем в вашем случае является то, что тип столбца в pandas на самом деле является объектом, а не строкой.Если вы конвертируете это в отдельные строковые столбцы, вы избавитесь от этой ошибки.Помните, что The basic TensorFlow tf.string dtype allows you to build tensors of byte strings. и, поскольку вы храните объект в этом столбце, а не строку, вы получаете ошибку.

Приведенный ниже код преодолеет ошибку, которую вы получили выше, но не решит вашу проблему полностью,Переменная длина списков должна быть обработана заполнением или списком или чем-то подобным, поскольку снова indicator_column может иметь проблемы с отсутствующими значениями.

X2= pd.DataFrame(X['x'].values.tolist(), columns=['x1','x2'])

feat1 = tf.feature_column.categorical_column_with_vocabulary_list(
            key="x1", vocabulary_list=["a", "b", "c"]
        )
feat2 = tf.feature_column.categorical_column_with_vocabulary_list(
            key="x2", vocabulary_list=["a", "b", "c"]
        )
indicator_features = [
    tf.feature_column.indicator_column(
        categorical_column=feat1
    ),tf.feature_column.indicator_column(
        categorical_column=feat2
    )
]

training_input_fn = tf.estimator.inputs.pandas_input_fn(
    x=X2, y=Y, batch_size=64, shuffle=True, num_epochs=None
)
...