, Просьба посмотреть мой обновленный вопрос. Спасибо
у использовать API набора данных Tensorflow для чтения файла списков вариантов длины TFRecords. Вот мой код.
def _int64_feature(value):
# value must be a numpy array.
return tf.train.Feature(int64_list=tf.train.Int64List(value=value))
def main1():
# Write an array to TFrecord.
# a is an array which contains lists of variant length.
a = np.array([[0, 54, 91, 153, 177],
[0, 50, 89, 147, 196],
[0, 38, 79, 157],
[0, 49, 89, 147, 177],
[0, 32, 73, 145]])
writer = tf.python_io.TFRecordWriter('file')
for i in range(a.shape[0]): # i = 0 ~ 4
x_train = a[i]
feature = {'i': _int64_feature(np.array([i])), 'data': _int64_feature(x_train)}
# Create an example protocol buffer
example = tf.train.Example(features=tf.train.Features(feature=feature))
# Serialize to string and write on the file
writer.write(example.SerializeToString())
writer.close()
# Check TFRocord file.
record_iterator = tf.python_io.tf_record_iterator(path='file')
for string_record in record_iterator:
example = tf.train.Example()
example.ParseFromString(string_record)
i = (example.features.feature['i'].int64_list.value)
data = (example.features.feature['data'].int64_list.value)
#data = np.fromstring(data_string, dtype=np.int64)
print(i, data)
# Use Dataset API to read the TFRecord file.
def _parse_function(example_proto):
keys_to_features = {'i' :tf.FixedLenFeature([], tf.int64),
'data':tf.FixedLenFeature([], tf.int64)}
parsed_features = tf.parse_single_example(example_proto, keys_to_features)
return parsed_features['i'], parsed_features['data']
ds = tf.data.TFRecordDataset('file')
iterator = ds.map(_parse_function).make_one_shot_iterator()
i, data = iterator.get_next()
with tf.Session() as sess:
print(i.eval())
print(data.eval())
Проверьте файл TFRecord
[0] [0, 54, 91, 153, 177]
[1] [0, 50, 89, 147, 196]
[2] [0, 38, 79, 157]
[3] [0, 49, 89, 147, 177]
[4] [0, 32, 73, 145]
Но это показало следующую ошибку, когда я пытался использовать Dataset API для чтения файла TFRecord.
tenorflow.python.framework.errors_impl.InvalidArgumentError: Name:, Key: data, Index: 0. Число значений int64! = ожидается. Размер значения: 5, но форма вывода: []
Спасибо.
ОБНОВИТЬ: Я попытался использовать следующий код для чтения TFRecord с помощью API набора данных, но оба они потерпели неудачу.
def _parse_function(example_proto):
keys_to_features = {'i' :tf.FixedLenFeature([], tf.int64),
'data':tf.VarLenFeature(tf.int64)}
parsed_features = tf.parse_single_example(example_proto, keys_to_features)
return parsed_features['i'], parsed_features['data']
ds = tf.data.TFRecordDataset('file')
iterator = ds.map(_parse_function).make_one_shot_iterator()
i, data = iterator.get_next()
with tf.Session() as sess:
print(sess.run([i, data]))
или же
def _parse_function(example_proto):
keys_to_features = {'i' :tf.VarLenFeature(tf.int64),
'data':tf.VarLenFeature(tf.int64)}
parsed_features = tf.parse_single_example(example_proto, keys_to_features)
return parsed_features['i'], parsed_features['data']
ds = tf.data.TFRecordDataset('file')
iterator = ds.map(_parse_function).make_one_shot_iterator()
i, data = iterator.get_next()
with tf.Session() as sess:
print(sess.run([i, data]))
И ошибка:
Трассировка (последний вызов был последним): файл "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/tensor_util.py", строка 468, в make_tensor_proto str_values = [compat.as_bytes (x) для x в proto_values] Файл "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/tensor_util.py", строка 468, в str_values = [compat.as_bytes (x) для x в proto_values ] Файл "/usr/local/lib/python3.5/dist-packages/tensorflow/python/util/compat.py", строка 65, as_bytes (bytes_or_text,)) TypeError: получена ожидаемая двоичная или Unicode строка
Во время обработки вышеупомянутого исключения произошло другое исключение:
Traceback (последний вызов был последним): файл "2tfrecord.py", строка 126, в main1 (), файл "2tfrecord.py", строка 72, в main1 iterator = ds.map (_parse_function) .make_one_shot_iterator () File "/ usr /local/lib/python3.5/dist-packages/tensorflow/python/data/ops/dataset_ops.py ", строка 712, в карте возвращает файл MapDataset (self, map_func)" /usr/local/lib/python3.5 /dist-packages/tensorflow/python/data/ops/dataset_ops.py ", строка 1385, вв этом self._map_func.add_to_graph (ops.get_default_graph ()) Файл "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/function.py", строка 486, в add_to_graph self._create_definition_if_needed ( Файл "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/function.py", строка 321, в _create_definition_if_needed self._create_definition_if_needed_impl () файле "/usr/local/lib/python3.5 /dist-packages/tensorflow/python/framework/function.py ", строка 338, в _create_definition_if_needed_impl output = self._func (* входные данные) файл" /usr/local/lib/python3.5/dist-packages/tensorflow/python /data/ops/dataset_ops.py ", строка 1376, в tf_map_func flatened_ret = [ops.convert_to_tensor (t) для t в nest.flatten (ret)] Файл" /usr/local/lib/python3.5/dist-packages /tensorflow/python/data/ops/dataset_ops.py ", строка 1376, в flatered_ret = [ops.convert_to_tensor (t) для t в файле nest.flatten (ret)]" /usr/local/lib/python3.5/ dist-packages / tenorflow / python / framework / ops.py ", строка 836, в convert_to_ тензор as_ref = False) Файл "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", строка 926, в internal_convert_to_tensor ret = translation_func (значение, dtype = dtype, name = name, as_ref = as_ref) Файл "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/constant_op.py", строка 229, в функции _constant_tensor_conversion_function возвращает константу (v, dtype = dtype, name = name) Файл "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/constant_op.py", строка 208, в постоянном значении, dtype = dtype, shape = shape, verify_shape = verify_shape)) Файл "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/tensor_util.py", строка 472, в make_tensor_proto "поддерживаемого типа". % (тип (значения), значения)) TypeError: Не удалось преобразовать объект типа в Tensor. Содержимое: SparseTensor (indices = Tensor ("ParseSingleExample / Slice_Indices_i: 0", shape = (?, 1), dtype = int64), значения = Tensor ("ParseSingleExample / ParseExample / ParseExample: 3", shape = (??), dtype = int64), dens_shape = Tensor ("ParseSingleExample / Squeeze_Shape_i: 0", shape = (1,), dtype = int64)). Рассмотрим приведение элементов к поддерживаемому типу.
Версия Python: 3.5.2
Версия Tensorflow: 1.4.1