Класс VarLenFeature
Класс VarLenFeature используется при разборе
сериализованных примеров tf.Example для
описания признака, который может содержать
произвольное число значений. В отличие от
FixedLenFeature, где число элементов
фиксировано, VarLenFeature возвращает
разреженный тензор tf.SparseTensor.
Первым параметром передается тип данных
dtype элементов признака. Признак
переменной длины удобен, когда заранее
неизвестно, сколько значений будет в примере.
Синтаксис
tf.io.VarLenFeature(dtype)
Пример
Давайте создадим описание признака переменной
длины с типом float32 и разберем
сериализованный пример:
import tensorflow as tf
feature = tf.io.VarLenFeature(dtype=tf.float32)
print(feature)
Результат выполнения кода:
VarLenFeature(dtype=tf.float32)
Пример
Давайте применим VarLenFeature для
разбора реального примера с признаком,
содержащим несколько значений:
import tensorflow as tf
# build a serialized example with a variable-length feature
example = tf.train.Example(
features=tf.train.Features(
feature={
'values': tf.train.Feature(
float_list=tf.train.FloatList(value=[1.0, 2.0, 3.0, 4.0])
)
}
)
)
serialized = example.SerializeToString()
# parse using VarLenFeature
features = {
'values': tf.io.VarLenFeature(dtype=tf.float32)
}
parsed = tf.io.parse_single_example(serialized, features)
res = parsed['values']
print(res)
Результат выполнения кода:
SparseTensor(indices=tf.Tensor(
[[0]
[1]
[2]
[3]], shape=(4, 1), dtype=int64), values=tf.Tensor([1. 2. 3. 4.], shape=(4,), dtype=float32), dense_shape=tf.Tensor([4], shape=(1,), dtype=int64))
Пример
Давайте преобразуем полученный разреженный
тензор в плотный с помощью метода
to_dense:
import tensorflow as tf
example = tf.train.Example(
features=tf.train.Features(
feature={
'values': tf.train.Feature(
float_list=tf.train.FloatList(value=[1.0, 2.0, 3.0])
)
}
)
)
serialized = example.SerializeToString()
features = {
'values': tf.io.VarLenFeature(dtype=tf.float32)
}
parsed = tf.io.parse_single_example(serialized, features)
res = tf.sparse.to_dense(parsed['values'])
print(res)
Результат выполнения кода:
tf.Tensor([1. 2. 3.], shape=(3,), dtype=float32)
Пример
Давайте разберем сразу пакет примеров
с помощью функции parse_example
и признака переменной длины:
import tensorflow as tf
def make_example(values):
return tf.train.Example(
features=tf.train.Features(
feature={
'values': tf.train.Feature(
float_list=tf.train.FloatList(value=values)
)
}
)
).SerializeToString()
serialized = [
make_example([1.0, 2.0]),
make_example([3.0, 4.0, 5.0])
]
features = {
'values': tf.io.VarLenFeature(dtype=tf.float32)
}
parsed = tf.io.parse_example(serialized, features)
print(parsed['values'])
Результат выполнения кода:
SparseTensor(indices=tf.Tensor(
[[0 0]
[0 1]
[1 0]
[1 1]
[1 2]], shape=(5, 2), dtype=int64), values=tf.Tensor([1. 2. 3. 4. 5.], shape=(5,), dtype=float32), dense_shape=tf.Tensor([2 3], shape=(2,), dtype=int64))
Смотрите также
-
класс
FixedLenFeature,
который описывает признак фиксированной длины -
функцию
parse_single_example,
которая разбирает один сериализованный пример -
функцию
parse_example,
которая разбирает пакет сериализованных примеров -
класс
FixedLenSequenceFeature,
который описывает последовательность фиксированной длины