我有一个基本的input_fn
可以与下面的 Tensorflow 估计器一起使用。无需设置即可完美运行num_epochs
范围;获得的张量具有离散形状。传入num_epochs
与其他任何事物一样None
结果是未知的形状。我的问题在于在使用时构建稀疏张量num_epochs
;在不知道输入张量的形状的情况下,我无法弄清楚如何一般地创建所述张量。
谁能想到解决这个问题的方法吗?我希望能够通过num_epochs=1
能够仅对数据集进行 1 次评估,并传递给predict
产生一组与数据集大小相同的预测,不多也不少。
def input_fn(batch_size):
examples_op = tf.contrib.learn.read_batch_examples(
FILE_NAMES,
batch_size=batch_size,
reader=tf.TextLineReader,
num_epochs=1,
parse_fn=lambda x: tf.decode_csv(x, [tf.constant([''], dtype=tf.string)] * len(HEADERS)))
examples_dict = {}
for i, header in enumerate(HEADERS):
examples_dict[header] = examples_op[:, i]
continuous_cols = {k: tf.string_to_number(examples_dict[k], out_type=tf.float32)
for k in CONTINUOUS_FEATURES}
# Problems lay here while creating sparse categorical tensors
categorical_cols = {
k: tf.SparseTensor(
indices=[[i, 0] for i in range(examples_dict[k].get_shape()[0])],
values=examples_dict[k],
shape=[int(examples_dict[k].get_shape()[0]), 1])
for k in CATEGORICAL_FEATURES}
feature_cols = dict(continuous_cols)
feature_cols.update(categorical_cols)
label = tf.string_to_number(examples_dict[LABEL], out_type=tf.int32)
return feature_cols, label
我通过创建一个特定于预期的函数解决了上述问题input_fn
;它接受一个密集的列并在不知道形状的情况下创建一个稀疏张量。该功能是通过使用实现的tf.range
and tf.shape
。话不多说,这是工作通用的input_fn
独立工作的代码num_epochs
正在设置:
def input_fn(batch_size):
examples_op = tf.contrib.learn.read_batch_examples(
FILE_NAMES,
batch_size=batch_size,
reader=tf.TextLineReader,
num_epochs=1,
parse_fn=lambda x: tf.decode_csv(x, [tf.constant([''], dtype=tf.string)] * len(HEADERS)))
examples_dict = {}
for i, header in enumerate(HEADERS):
examples_dict[header] = examples_op[:, i]
feature_cols = {k: tf.string_to_number(examples_dict[k], out_type=tf.float32)
for k in CONTINUOUS_FEATURES}
feature_cols.update({k: dense_to_sparse(examples_dict[k])
for k in CATEGORICAL_FEATURES})
label = tf.string_to_number(examples_dict[LABEL], out_type=tf.int32)
return feature_cols, label
def dense_to_sparse(dense_tensor):
indices = tf.to_int64(tf.transpose([tf.range(tf.shape(dense_tensor)[0]), tf.zeros_like(dense_tensor, dtype=tf.int32)]))
values = dense_tensor
shape = tf.to_int64([tf.shape(dense_tensor)[0], tf.constant(1)])
return tf.SparseTensor(
indices=indices,
values=values,
shape=shape
)
希望这对某人有帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)