Есть небольшой фрагмент о загрузке разреженных данных, но я понятия не имею, как его использовать.
SparseTensors плохо работают с очередями. Если вы используете SparseTensors, вам необходимо декодировать строковые записи, используя tf.parse_example после пакетной обработки (вместо использования tf.parse_single_example перед пакетной загрузкой).
Я думаю, я действительно не понимаю, как загружаются данные.
Данные, которые я хочу загрузить, находятся в формате SVM Light
Я думаю об этом, чтобы преобразовать обучающий набор в формат файла TFRecords, а затем загрузить эти преобразованные данные с помощью тензорного потока. Дело в том, что я не знаю, как я должен отформатировать свои данные, чтобы тензорный поток анализировал его как разреженные тензоры.
Вот фрагмент, извлеченный из одного из примеров, доступных в GitHub:
def convert_to(images, labels, name):
num_examples = labels.shape[0]
if images.shape[0] != num_examples:
raise ValueError("Images size %d does not match label size %d." %
(images.shape[0], num_examples))
rows = images.shape[1]
cols = images.shape[2]
depth = images.shape[3]
filename = os.path.join(FLAGS.directory, name + '.tfrecords')
print('Writing', filename)
writer = tf.python_io.TFRecordWriter(filename)
for index in range(num_examples):
image_raw = images[index].tostring()
example = tf.train.Example(features=tf.train.Features(feature={
'height': _int64_feature(rows),
'width': _int64_feature(cols),
'depth': _int64_feature(depth),
'label': _int64_feature(int(labels[index])),
'image_raw': _bytes_feature(image_raw)}))
writer.write(example.SerializeToString())
writer.close()
Он кодирует данные изображения как один большой кадр. Разница с моими данными заключается в том, что не каждая функция заполнена. Я мог бы сохранять свои данные таким же образом, но я не уверен, что это способ использования этих функций.
Это не имеет значения, поскольку я буду расшифровывать вещи с другой стороны, но есть ли лучший способ сделать это для разреженных данных?
Что касается чтения, здесь - это один пример, который считывает плотные данные тензора.
У меня получилось, что я должен был поменять tf.parse_single_example
на tf.parse_example
и сделать это после пакетной обработки.
Однако, как я могу сообщить тензорному потоку, что мои данные разрежены? Как связать индексы функций, которые у меня есть с значениями функции в тензоре? Как я могу выполнить пакетную обработку, прежде чем загружать данные?
ИЗМЕНИТЬ 1:
Вот что я пробовал, я получаю ошибку ValueError: Shape () must have rank 1
:
from tqdm import *
def convert_to_tensor_file(path, out_file_name):
feature_set = set()
filename = os.path.join(FLAGS.directory, out_file_name + '.tfrecords')
writer = tf.python_io.TFRecordWriter(filename)
with open(path, 'r') as f:
for line in tqdm(f):
data = line.strip().split(' ')
features = {
"label": _int64_feature(int(data[0]))
}
for feature in data[1:]:
index, value = feature.split(':')
feature_set.add(index)
features[index] = _int64_feature(int(value))
example = tf.train.Example(features=tf.train.Features(feature=features))
writer.write(example.SerializeToString())
writer.close()
return feature_set
feature_set = convert_to_tensor_file(TRAIN, 'train')
def load_tensor_file(name):
filename = os.path.join(FLAGS.directory, name + '.tfrecords')
features = {
'label': tf.FixedLenFeature([], tf.int64),
}
for feature in feature_set:
features[feature] = tf.VarLenFeature(tf.int64)
with tf.name_scope('input'):
filename_queue = tf.train.string_input_producer([filename])
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
features = tf.parse_example(serialized_example, features=features)
load_tensor_file('train')
Спасибо,