python – 数据集映射表中的Tensorflow功能列已初始化问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 数据集映射表中的Tensorflow功能列已初始化问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6008字,纯文字阅读大概需要9分钟。
内容图文
我遇到了一个问题,试图在传入Dataset map方法的函数中使用Tensorflow的feature_column映射.当尝试使用Dataset.map对数据集的分类字符串特征进行热编码作为输入管道的一部分时,会发生这种情况.我得到的错误信息是:
tensorflow.python.framework.errors_impl.FailedPreconditionError:表已初始化.
以下代码是重新创建问题的基本示例:
import numpy as np
import tensorflow as tf
from tensorflow.contrib.lookup import index_table_from_tensor
# generate tfrecords with two string categorical features and write to file
vlists = dict(season=['Spring', 'Summer', 'Fall', 'Winter'],
day=['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'])
writer = tf.python_io.TFRecordWriter('test.tfr')
for s,d in zip(np.random.choice(vlists['season'],50),
np.random.choice(vlists['day'],50)):
example = tf.train.Example(
features = tf.train.Features(
feature={
'season':tf.train.Feature(
bytes_list=tf.train.BytesList(value=[s.encode()])),
'day':tf.train.Feature(
bytes_list=tf.train.BytesList(value=[d.encode()]))
}
)
)
serialized = example.SerializeToString()
writer.write(serialized)
writer.close()
现在cwd中有一个名为test.tfr的tfrecord文件,有50??条记录,每条记录包含两个字符串功能,’season’和’day’,
然后,以下将创建一个数据集,该数据集将解析tfrecords并创建大小为4的批次
def parse_record(element):
feats = {
'season': tf.FixedLenFeature((), tf.string),
'day': tf.FixedLenFeature((), tf.string)
}
return tf.parse_example(element, feats)
fname = tf.placeholder(tf.string, [])
ds = tf.data.TFRecordDataset(fname)
ds = ds.batch(4).map(parse_record)
此时,如果您创建一个迭代器并多次调用它上面的get_next,它会按预期工作,您会看到每次运行时输出如下:
iterator = ds.make_initializable_iterator()
nxt = iterator.get_next()
sess.run(tf.tables_initializer())
sess.run(iterator.initializer, feed_dict={fname:'test.tfr'})
sess.run(nxt)
# output of run(nxt) would look like
# {'day': array([b'Sat', b'Thu', b'Fri', b'Thu'], dtype=object), 'season': array([b'Winter', b'Winter', b'Fall', b'Summer'], dtype=object)}
但是,如果我想使用feature_columns将这些分类热编码为使用map的数据集转换,那么它会运行一次产生正确的输出,但是在每次后续运行调用(nxt)时,它都会给表已经初始化的错误,例如:
# using the same Dataset ds from above
season_enc = tf.feature_column.categorical_column_with_vocabulary_list(
key='season', vocabulary_list=vlists['season'])
season_col = tf.feature_column.indicator_column(season_enc)
day_enc = tf.feature_column.categorical_column_with_vocabulary_list(
key='day', vocabulary_list=vlists['day'])
day_col = tf.feature_column.indicator_column(day_enc)
cols = [season_col, day_col]
def _encode(element, feat_cols=cols):
return tf.feature_column.input_layer(element, feat_cols)
ds1 = ds.map(_encode)
iterator = ds1.make_initializable_iterator()
nxt = iterator.get_next()
sess.run(tf.tables_initializer())
sess.run(iterator.initializer, feed_dict={fname:'test.tfr'})
sess.run(nxt)
# first run will produce correct one hot encoded output
sess.run(nxt)
# second run will generate
W tensorflow/core/framework/op_kernel.cc:1192] Failed precondition: Table
already initialized.
2018-01-25 19:29:55.802358: W tensorflow/core/framework/op_kernel.cc:1192]
Failed precondition: Table already initialized.
2018-01-25 19:29:55.802612: W tensorflow/core/framework/op_kernel.cc:1192]
Failed precondition: Table already initialized.
tensorflow.python.framework.errors_impl.FailedPreconditionError:表
已初始化.
但是,如果我尝试手动执行一个热编码而没有如下所示的feature_columns,那么只有在map函数之前创建表时它才有效,否则它会在上面给出相同的错误
# using same original Dataset ds
tables = dict(season=index_table_from_tensor(vlists['season']),
day=index_table_from_tensor(vlists['day']))
def to_dummy(element):
s = tables['season'].lookup(element['season'])
d = tables['day'].lookup(element['day'])
return (tf.one_hot(s, depth=len(vlists['season']), axis=-1),
tf.one_hot(d, depth=len(vlists['day']), axis=-1))
ds2 = ds.map(to_dummy)
iterator = ds2.make_initializable_iterator()
nxt = iterator.get_next()
sess.run(tf.tables_initializer())
sess.run(iterator.initializer, feed_dict={fname:'test.tfr'})
sess.run(nxt)
看起来好像它与feature_columns创建的索引查找表的范围或命名空间有关,但我不知道如何弄清楚这里发生了什么,我已经尝试改变feature_column对象定义的位置和时间,但它没有任何区别.
解决方法:
我刚刚来到another recent question,想提出一个潜在的解决方案.由于这个问题已经很晚了,我不确定这里的问题是否已经解决.如果已经有一个很好的解决方案,请纠正我.
我真的不知道这个错误究竟是怎么发生的.但是从canned estimator学习,我意识到可能有另一种方法来完成这项工作,即在解析示例之前迭代数据集.这种方法的一个好处是将要素列映射从映射函数分离到数据集.这可能与it is known that以来的未知错误原因有关:
when using hash_table in “tensorflow.python.ops.gen_lookup_ops” in tf.data.Dataset.map function
because tf.data.Dataset.map do not use the default graph, the hash_table can not be initialized.
我不确定这是否适合您真正想要的,但在您的代码中使用“test.tfr”生成的潜在示例可能是:
import tensorflow as tf
# using the same Dataset ds from above
vlists = dict(season=['Spring', 'Summer', 'Fall', 'Winter'],
day=['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'])
season_enc = tf.feature_column.categorical_column_with_vocabulary_list(
key='season', vocabulary_list=vlists['season'])
season_col = tf.feature_column.indicator_column(season_enc)
day_enc = tf.feature_column.categorical_column_with_vocabulary_list(
key='day', vocabulary_list=vlists['day'])
day_col = tf.feature_column.indicator_column(day_enc)
cols = [season_col, day_col]
def _encode(element, feat_cols=cols):
element = tf.parse_example(element, features=tf.feature_column.make_parse_example_spec(feat_cols))
return tf.feature_column.input_layer(element, feat_cols)
fname = tf.placeholder(tf.string, [])
ds = tf.data.TFRecordDataset(fname)
ds = ds.batch(4)
ds1 = ds#.map(_encode)
iterator = ds1.make_initializable_iterator()
nxt = iterator.get_next()
nxt = _encode(nxt)
with tf.Session() as sess:
sess.run(tf.tables_initializer())
sess.run(iterator.initializer, feed_dict={fname:'test.tfr'})
print(sess.run(nxt))
# first run will produce correct one hot encoded output
print(sess.run(nxt))
内容总结
以上是互联网集市为您收集整理的python – 数据集映射表中的Tensorflow功能列已初始化问题全部内容,希望文章能够帮你解决python – 数据集映射表中的Tensorflow功能列已初始化问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。