Como usar a API do conjunto de dados para ler o arquivo TFRecords de listas de comprimento de variante?

Eu quero usar a API do conjunto de dados do Tensorflow para ler o arquivo TFRecords de listas de comprimento de variante. Aqui está o meu código.

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())

Verifique o arquivo 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]

Mas ele mostrou o seguinte erro quando tentei usar a API do conjunto de dados para ler o arquivo TFRecord.

tensorflow.python.framework.errors_impl.InvalidArgumentError: Name:, Key: data, Index: 0. Número de valores int64! = esperado. Tamanho dos valores: 5, mas formato da saída: []

Obrigado.
ATUALIZAR: Tentei usar o código a seguir para ler TFRecord com a API do conjunto de dados, mas ambos falharam.

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]))

ou

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]))

E o erro:

Traceback (última chamada mais recente): arquivo "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/tensor_util.py", linha 468, em make_tensor_proto str_values = [compat.as_bytes (x) para x em proto_values] Arquivo "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/tensor_util.py", linha 468, em str_values = [compat.as_bytes (x) para x em proto_values ] Arquivo "/usr/local/lib/python3.5/dist-packages/tensorflow/python/util/compat.py", linha 65, em as_bytes (bytes_or_text,)) TypeError: String binária ou unicode esperada, obtida

Durante o tratamento da exceção acima, ocorreu outra exceção:

Traceback (última chamada mais recente): Arquivo "2tfrecord.py", linha 126, em main1 () Arquivo "2tfrecord.py", linha 72, em iterador main1 = ds.map (função_parse) .make_one_shot_iterator () Arquivo "/ usr /local/lib/python3.5/dist-packages/tensorflow/python/data/ops/dataset_ops.py ", linha 712, no mapa retorna o arquivo MapDataset (self, map_func)" /usr/local/lib/python3.5 /dist-packages/tensorflow/python/data/ops/dataset_ops.py ", linha 1385, eminiciar self._map_func.add_to_graph (ops.get_default_graph ()) Arquivo "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/function.py", linha 486, em add_to_graph self._create_definition_if_needed () Arquivo "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/function.py", linha 321, em _create_definition_if_needed self._create_definition_if_needed_impl () Arquivo "/usr/local/lib/python3.5 /dist-packages/tensorflow/python/framework/function.py ", linha 338, em _create_definition_if_needed_impl outputs = self._func (* inputs) Arquivo" /usr/local/lib/python3.5/dist-packages/tensorflow/python /data/ops/dataset_ops.py ", linha 1376, em tf_map_func flattened_ret = [ops.convert_to_tensor (t) para t em nest.flatten (ret)] Arquivo" /usr/local/lib/python3.5/dist-packages /tensorflow/python/data/ops/dataset_ops.py ", linha 1376, em flattened_ret = [ops.convert_to_tensor (t) para t no arquivo nest.flatten (ret)]" /usr/local/lib/python3.5/ dist-packages / tensorflow / python / framework / ops.py ", linha 836, em convert_to_ tensor as_ref = False) Arquivo "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", linha 926, em internal_convert_to_tensor ret = conversion_func (valor, dtype = dtype, nome = nome, as_ref = as_ref) Arquivo "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/constant_op.py", linha 229, na constante de retorno _constant_tensor_conversion_function (v, dtype = dtype, name = nome) Arquivo "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/constant_op.py", linha 208, em valor constante, dtype = dtype, shape = shape, confirm_shape = confirm_shape)) O arquivo "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/tensor_util.py", linha 472, no make_tensor_proto "tipo suportado". % (tipo (valores), valores)) TypeError: falha ao converter o objeto do tipo em Tensor. Conteúdo: SparseTensor (índices = Tensor ("ParseSingleExample / Slice_Indices_i: 0", forma = (?, 1), dtype = int64), valores = Tensor ("ParseSingleExample / ParseExample / ParseExample: 3", shape = (?,), dtype = int64), dense_shape = Tensor ("ParseSingleExample / Squeeze_Shape_i: 0", shape = (1,), dtype = int64)). Considere converter elementos para um tipo suportado.

Versão Python: 3.5.2
Versão do Tensorflow: 1.4.1

questionAnswers(2)

yourAnswerToTheQuestion