#python #tensorflow #skflow
#python #тензорный поток #skflow
Вопрос:
У меня есть базовый input_fn
, который можно использовать с оценками тензорного потока ниже. Он работает безупречно без установки 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
Ответ №1:
Я решил вышеупомянутую проблему, создав функцию, специфичную для того, что ожидается в an input_fn
; он принимает плотный столбец и создает датчик разреженности, не зная формы. Функция стала возможной с помощью tf.range
и 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
)
Надеюсь, это кому-то поможет!