14

Tensorflow에서 다차원 배열을 TFRecord에 저장하려고합니다. 예를 들어 : 다차원 배열을 사용하는 tf.SequenceExample

[[1, 2, 3], [1, 2], [3, 2, 1]] 

내가 해결하기 위해 노력하고있는 작업이 순차적으로

, 나는 Tensorflow의 tf.train.SequenceExample()를 사용하려고하고 데이터를 쓸 때 나는 TFRecord 파일에 데이터를 쓰기에 성공입니다.

W tensorflow/core/framework/op_kernel.cc:936] Invalid argument: Name: , Key: input_characters, Index: 1. Number of int64 values != expected. values size: 6 but output shape: [] 
E tensorflow/core/client/tensor_c_api.cc:485] Name: , Key: input_characters, Index: 1. Number of int64 values != expected. values size: 6 but output shape: [] 

내 데이터는 다음과 같습니다로드하려고 사용하고 기능 : 내가 tf.parse_single_sequence_example를 사용하여 TFRecord 파일에서 데이터를로드 할 때 그러나, 나는 비밀 오류의 많은 수의 인사를하고

def read_and_decode_single_example(filename): 

    filename_queue = tf.train.string_input_producer([filename], 
               num_epochs=None) 

    reader = tf.TFRecordReader() 
    _, serialized_example = reader.read(filename_queue) 

    context_features = { 
     "length": tf.FixedLenFeature([], dtype=tf.int64) 
    } 

    sequence_features = { 
     "input_characters": tf.FixedLenSequenceFeature([],   dtype=tf.int64), 
     "output_characters": tf.FixedLenSequenceFeature([], dtype=tf.int64) 
    } 

    context_parsed, sequence_parsed = tf.parse_single_sequence_example(
    serialized=serialized_example, 
    context_features=context_features, 
    sequence_features=sequence_features 
) 

context = tf.contrib.learn.run_n(context_parsed, n=1, feed_dict=None) 
print context 

내가 데이터를 저장하기 위해 사용하고있는 기능은 여기에 있습니다 :

# http://www.wildml.com/2016/08/rnns-in-tensorflow-a-practical-guide-and-undocumented-features/ 
def make_example(input_sequence, output_sequence): 
    """ 
    Makes a single example from Python lists that follows the 
    format of tf.train.SequenceExample. 
    """ 

    example_sequence = tf.train.SequenceExample() 

    # 3D length 
    sequence_length = sum([len(word) for word in input_sequence]) 
    example_sequence.context.feature["length"].int64_list.value.append(sequence_length) 

    input_characters = example_sequence.feature_lists.feature_list["input_characters"] 
    output_characters = example_sequence.feature_lists.feature_list["output_characters"] 

    for input_character, output_character in izip_longest(input_sequence, 
                  output_sequence): 

     # Extend seems to work, therefore it replaces append. 
     if input_sequence is not None: 
      input_characters.feature.add().int64_list.value.extend(input_character) 

     if output_characters is not None: 
      output_characters.feature.add().int64_list.value.extend(output_character) 

    return example_sequence 

어떤 도움을 환영 할 것입니다.

+0

안녕하세요, 컨텍스트를 더 제공 할 수 있습니까? 가장 좋은 것은 실제로 데이터를 파일에 저장하는 단계를 포함하여 실제로 실행 및 테스트 할 수있는 최소한의 예제를 제공하는 것입니다. – jlarsch

+0

예제를 따라하기가 매우 어려우며 관련 컨텍스트를 포함하도록 예제를 편집하면 더 많은 도움을 얻을 수 있습니다. 예를 들어 코드에 주석을 넣은 링크를 보면 시퀀스 예제를 생성하는 스 니펫에는 실제로 데이터를 쓰는 코드가 포함되지 않는다는 것이 분명해진다. –

답변

5

제공된 코드를 사용하여 오류를 재현하지 못했지만 일부 교훈있는 추측을하면 다음 작동 코드가 제공됩니다.

import tensorflow as tf 
import numpy as np 
import tempfile 

tmp_filename = 'tf.tmp' 

sequences = [[1, 2, 3], [1, 2], [3, 2, 1]] 
label_sequences = [[0, 1, 0], [1, 0], [1, 1, 1]] 

def make_example(input_sequence, output_sequence): 
    """ 
    Makes a single example from Python lists that follows the 
    format of tf.train.SequenceExample. 
    """ 

    example_sequence = tf.train.SequenceExample() 

    # 3D length 
    sequence_length = len(input_sequence) 

    example_sequence.context.feature["length"].int64_list.value.append(sequence_length) 

    input_characters = example_sequence.feature_lists.feature_list["input_characters"] 
    output_characters = example_sequence.feature_lists.feature_list["output_characters"] 

    for input_character, output_character in zip(input_sequence, 
                  output_sequence): 

     if input_sequence is not None: 
      input_characters.feature.add().int64_list.value.append(input_character) 

     if output_characters is not None: 
      output_characters.feature.add().int64_list.value.append(output_character) 

    return example_sequence 

# Write all examples into a TFRecords file 
def save_tf(filename): 
    with open(filename, 'w') as fp: 
     writer = tf.python_io.TFRecordWriter(fp.name) 
     for sequence, label_sequence in zip(sequences, label_sequences): 
      ex = make_example(sequence, label_sequence) 
      writer.write(ex.SerializeToString()) 
     writer.close() 

def read_and_decode_single_example(filename): 

    filename_queue = tf.train.string_input_producer([filename], 
               num_epochs=None) 

    reader = tf.TFRecordReader() 
    _, serialized_example = reader.read(filename_queue) 

    context_features = { 
     "length": tf.FixedLenFeature([], dtype=tf.int64) 
    } 

    sequence_features = { 
     "input_characters": tf.FixedLenSequenceFeature([], dtype=tf.int64), 
     "output_characters": tf.FixedLenSequenceFeature([], dtype=tf.int64) 
    } 


    return serialized_example, context_features, sequence_features 

save_tf(tmp_filename) 
ex,context_features,sequence_features = read_and_decode_single_example(tmp_filename) 
context_parsed, sequence_parsed = tf.parse_single_sequence_example(
    serialized=ex, 
    context_features=context_features, 
    sequence_features=sequence_features 
) 

sequence = tf.contrib.learn.run_n(sequence_parsed, n=1, feed_dict=None) 
#check if the saved data matches the input data 
print(sequences[0] in sequence[0]['input_characters']) 

필요한 변경했다 :

  1. sequence_length = sum([len(word) for word in input_sequence]) 그것은 당신의 예제 데이터 작동하지 않습니다 그렇지 않으면

sequence_length = len(input_sequence)

  1. extendappend으로 변경되었습니다.
+0

이러한 변경 사항을 시도 할 때 'TypeError : [37] 유형이 이지만 (, )'중 하나가 예상됩니다. – Torkoal

+0

나는 [[1, 2, 3], [1, 2], [3, 2, 1]]이 하나가 아닌 많은 시퀀스를 의미한다는 것을 알았습니다. – Torkoal

+0

답변에서 스 니펫을 시도 했습니까? 내가 그것을 (우분투, python3.4, GPU없이 TF) 실행할 때 어떤 오류도 발생하지 않았다. 입력 데이터가 문제의 데이터와 정확히 일치합니까? –

3

같은 문제가있었습니다. 전적으로 해결할 수 있다고 생각하지만 출력 형식을 결정한 다음 사용 방법을 알아 내야합니다.

처음으로무엇이 오류입니까?

오류 메시지는 사용자가 읽으려는 내용이 지정한 기능 크기에 맞지 않는다고 말합니다. 그럼 어디에서 지정 했습니까? 바로 여기에 :

sequence_features = { 
    "input_characters": tf.FixedLenSequenceFeature([], dtype=tf.int64), 
    "output_characters": tf.FixedLenSequenceFeature([], dtype=tf.int64) 
} 

이것은 "내 input_characters는 단일 값의 시퀀스입니다."라고 말하지만 실제로는 그렇지 않습니다. 당신이 가지고있는 것은 일련의 단일 값들의 연속이므로 오류입니다.

두 번째무엇을 할 수 있습니까?

대신 사용하는 경우 : 당신이 최상위 시퀀스의 각 요소는 세 요소 긴 것을 지정했기 때문에

a = [[1,2,3], [2,3,1], [3,2,1]] 
sequence_features = { 
    "input_characters": tf.FixedLenSequenceFeature([3], dtype=tf.int64), 
    "output_characters": tf.FixedLenSequenceFeature([3], dtype=tf.int64) 
} 

당신은 당신의 코드에 오류가되지 않습니다.

고정 길이 시퀀스가 ​​없다면 다른 유형의 기능을 사용해야 할 것입니다.

sequence_features = { 
    "input_characters": tf.VarLenFeature(tf.int64), 
    "output_characters": tf.VarLenFeature(tf.int64) 
} 

VarLenFeature는 읽기 전에 길이를 알 수 없음을 알려줍니다. 불행히도 이는 한 단계에서 input_characters를 더 이상 밀도가없는 벡터로 읽을 수 없음을 의미합니다. 대신 기본적으로 SparseTensor이됩니다. 당신은 tf.sparse_tensor_to_dense 예와 조밀 한 텐서에이를 설정할 수 있습니다 :

당신이보고 된 적이 the article에서 언급 한 바와 같이
input_densified = tf.sparse_tensor_to_dense(sequence_parsed['input_characters']) 

데이터가 항상 동일한 길이를 가지고 있지 않은 경우, 당신은 "not_really_a_word"을 가지고 있어야합니다 기본 색인으로 사용하는 어휘의 단어. 예 :

array((1,2,3), (2,3,0), (3,2,1)) 

텐서 끝나게됩니다 다음

a = [[1,2,3], [2,3], [3,2,1]] 

파이썬 목록을 사용하여,의 당신이 "not_really_a_word"단어 인덱스 0 매핑이 있다고 가정 해 보자.

경고; 밀도가 높은 텐서 (tensor)처럼 스파 스 센서의 역 전파가 단지 효과가 있다는 것을 확신하지 못합니다. wildml article은 "not_actually_a_word"단어에 대한 손실을 마스킹하여 시퀀스 당 0을 채우는 것에 대해 이야기합니다 ("사이드 노트 : 자신의 기사에서 0의 '주의/클래스'에주의하십시오). 이것은 첫 번째 방법을 구현하는 것이 더 쉬울 것이라고 제안하는 것으로 보인다.

각 예제가 시퀀스 시퀀스 인 여기 설명 된 경우와 다릅니다. 내 이해를 위해, 이런 종류의 방법이 잘 지원되지 않는 이유는 그것이 지원하려는 경우의 남용이기 때문입니다; 고정 크기 임베딩을 직접로드합니다.


내가 원하는 것은 그 숫자를 단어 삽입으로 바꾸는 것입니다. 당신은 인덱스 목록을 embedding의 목록으로 바꿀 수 있습니다. tf.nn.embedding_lookup

관련 문제