tf.estimator 的 tensorflow 提要列表功能(多热)

Posted

技术标签:

【中文标题】tf.estimator 的 tensorflow 提要列表功能(多热)【英文标题】:tensorflow feed list feature (multi-hot) to tf.estimator 【发布时间】:2019-03-27 01:57:29 【问题描述】:

一些特征列的数据类型是list。它们的长度可以不同。我想将此列编码为多热分类特征并将其提供给tf.estimator。我尝试了以下但错误Unable to get element as bytes 显示。我认为这是深度学习中的一种常见做法,尤其是推荐系统,例如深和宽模型。我发现了一个相关问题here,但它没有显示如何向估算器提供数据。

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)

以下错误:

INFO:tensorflow:使用默认配置。信息:张量流:使用配置: '_model_dir':'testalg','_tf_random_seed':无, '_save_summary_steps':100,'_save_checkpoints_steps':无, '_save_checkpoints_secs':600,'_session_config':无, “_keep_checkpoint_max”:5,“_keep_checkpoint_every_n_hours”:10000, '_log_step_count_steps':100,'_train_distribute':无,'_device_fn': 无,'_service':无,'_cluster_spec': ,'_task_type':'工人','_task_id':0, '_global_id_in_cluster':0,'_master':'','_evaluation_master':'', '_is_chief':真,'_num_ps_replicas':0,'_num_worker_replicas':1 信息:张量流:调用 model_fn。信息:张量流:完成调用 模型_fn。信息:张量流:创建 CheckpointSaverHook。 INFO:tensorflow:Graph 已完成。信息:张量流:运行 local_init_op。信息:张量流:完成运行 local_init_op。 INFO:tensorflow:Error 报告给 Coordinator: ,无法 以字节形式获取元素。 INFO:tensorflow:将检查点保存为 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 中尝试: -> 1322 return fn(*args) 1323 除了errors.OpError as e:

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py 在 _run_fn(feed_dict、fetch_list、target_list、options、run_metadata) 第1306章 -> 1307 个选项,feed_dict,fetch_list,target_list,run_metadata)1308

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py 在 _call_tf_sessionrun(self, options, feed_dict, fetch_list, target_list,run_metadata)1408 self._session,选项, feed_dict, fetch_list, target_list, -> 1409 run_metadata) 1410 其他:

InternalError: 无法以字节形式获取元素。

在处理上述异常的过程中,又发生了一个异常:

InternalError Traceback(最近一次调用最后一次) 在 () 44 45 ---> 46 model.train(input_fn=training_input_fn)

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/estimator/estimator.py 在火车(自我,input_fn,钩子,步骤,max_steps,saving_listeners) 364 第365章 --> 366 loss = self._train_model(input_fn, 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 其他: -> 1119 返回 self._train_model_default(input_fn, hooks, Saving_listeners) 1120 1121 def _train_model_default(self, input_fn, hooks, Saving_listeners):

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/estimator/estimator.py 在 _train_model_default(self, input_fn, hooks, Saving_listeners) 第1133章 工人钩子,1134 钩子,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/tensorflow/python/estimator/estimator.py 在 _train_with_estimator_spec(self, estimator_spec, worker_hooks, 钩子,global_step_tensor,saving_listeners)1334损失=无 第1335章 -> 1336 _, loss = mon_sess.run([estimator_spec.train_op, estimator_spec.loss]) 1337 回波损耗 1338

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/training/monitored_session.py 在退出(自我、异常类型、异常值、回溯) 687 如果 [errors.OutOfRangeError, StopIteration] 中的 exception_type : 第688章 --> 689 self._close_internal(exception_type) 690 # exit 应该返回 True 以抑制异常。 691 返回异常类型为无

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/training/monitored_session.py 在 _close_internal(self, exception_type) 724 如果 self._sess 为无: 725 raise RuntimeError('会话已经关闭。') --> 726 self._sess.close() 最后727: 第728章

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/training/monitored_session.py 在关闭(自己) 第972章 973尝试: --> 974 self._sess.close() 975 除了_PREEMPTION_ERRORS: 976通过

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/training/monitored_session.py 在关闭(自我)1116 self._coord.join(1117 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/tensorflow/python/training/coordinator.py 在加入(自我,线程,stop_grace_period_secs,ignore_live_threads) 第387章 第388章 --> 389 6.reraise(*self._exc_info_to_raise) 390 elif 落后者: 391 如果忽略_live_threads:

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/six.py 再加注(tp, value, tb) 第683章 684 如果 value.traceback 不是 tb: --> 685 提高价值。with_traceback(tb) 686 升值 第687章

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/estimator/inputs/queues/feeding_queue_runner.py 在 _run(self, sess, enqueue_op, feed_fn, coord) 92 尝试: 93 feed_dict = None 如果 feed_fn 是 None 否则 feed_fn() ---> 94 sess.run(enqueue_op, feed_dict=feed_dict) 95 除了(errors.OutOfRangeError,errors.CancelledError): 96 # 此异常表示队列已关闭。

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py 在运行中(self,fetches,feed_dict,options,run_metadata) 898尝试: 第899章 --> 900 run_metadata_ptr) 901 如果运行元数据: 902 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py 在 _run(self、handle、fetches、feed_dict、options、run_metadata) 1133 如果 final_fetches 或 final_targets 或(句柄和 feed_dict_tensor): 1134 结果 = 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/tensorflow/python/client/session.py 在 _do_run(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)1314 如果句柄为无:1315 返回 self._do_call(_run_fn, feeds, fetches, 目标, 选项, -> 1316 run_metadata) 1317 else: 1318 return self._do_call(_prun_fn, handle, feeds, fetches)

/home/yinan.li1/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py 在 _do_call(self, fn, *args) 1333 中,除了 KeyError: 1334 经过 -> 1335 raise type(e)(node_def, op, message) 1336 1337 def _extend_graph(self):

InternalError: 无法以字节形式获取元素。

【问题讨论】:

也许这个能给你一些启发***.com/questions/47028898/… 【参考方案1】:

我认为您的问题之一是 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
)

【讨论】:

以上是关于tf.estimator 的 tensorflow 提要列表功能(多热)的主要内容,如果未能解决你的问题,请参考以下文章

tf.estimator.Estimator类的用法

import tensorflow 报错: tf.estimator package not installed.

TensorFlow tf.estimator package not installed

如何将张量板可视化集成到 tf.Estimator?

如何在SummarySaverHook和Estimator中使用tensorflow.metrics.x?

如何在Tensorflow中组合feature_columns,model_to_estimator和dataset API