web-dev-qa-db-ja.com

DataSet APIを使用してtf.train.SequenceExampleデータのTensorflowでパディングされたバッチを作成するにはどうすればよいですか?

LSTMモデルTensorflowでトレーニングするには、データをtf.train.SequenceExample形式で、TFRecordファイルに保存します 。ここで、新しいDataSet APIを使用して、トレーニング用の埋め込みバッチを生成しますドキュメント にはpadded_batchの使用例がありますが、私のデータではpadded_shapesの値がどうあるべきかわかりません。

TFrecordファイルをバッチに読み込むために、次のPythonコードを記述しました:

_import math
import tensorflow as tf
import numpy as np
import struct
import sys
import array

if(len(sys.argv) != 2):
  print "Usage: createbatches.py [RFRecord file]"
  sys.exit(0)


vectorSize = 40
inFile = sys.argv[1]

def parse_function_dataset(example_proto):
  sequence_features = {
      'inputs': tf.FixedLenSequenceFeature(shape=[vectorSize],
                                           dtype=tf.float32),
      'labels': tf.FixedLenSequenceFeature(shape=[],
                                           dtype=tf.int64)}

  _, sequence = tf.parse_single_sequence_example(example_proto, sequence_features=sequence_features)

  length = tf.shape(sequence['inputs'])[0]
  return sequence['inputs'], sequence['labels']

sess = tf.InteractiveSession()

filenames = tf.placeholder(tf.string, shape=[None])
dataset = tf.contrib.data.TFRecordDataset(filenames)
dataset = dataset.map(parse_function_dataset)
# dataset = dataset.batch(1)
dataset = dataset.padded_batch(4, padded_shapes=[None])
iterator = dataset.make_initializable_iterator()

batch = iterator.get_next()

# Initialize `iterator` with training data.
training_filenames = [inFile]
sess.run(iterator.initializer, feed_dict={filenames: training_filenames})

print(sess.run(batch))
_

dataset = dataset.batch(1)を使用するとコードはうまく機能します(その場合はパディングは必要ありません)が、_padded_batch_バリアントを使用すると、次のエラーが発生します。

TypeError:浅い構造がシーケンスの場合、入力もシーケンスでなければなりません。入力のタイプは次のとおりです。

padded_shapesパラメーターに何を渡す必要があるかを理解できますか?

(このためにスレッドとキューを使用するサンプルコードがたくさんあることは知っていますが、このプロジェクトには新しいDataSet APIを使用したいです)

12

形状のタプルを渡す必要があります。あなたの場合、合格する必要があります

dataset = dataset.padded_batch(4, padded_shapes=([vectorSize],[None]))

または試す

dataset = dataset.padded_batch(4, padded_shapes=([None],[None]))

これを確認してください code 詳細については。この方法をデバッグして、なぜ機能しないのかを理解する必要がありました。

9
Zaher Wanli

現在のDatasetオブジェクトにTupleが含まれている場合、各埋め込み要素の形状を指定することもできます。

たとえば、(same_sized_images, Labels)データセットと各ラベルの長さは異なりますが、ランクは同じです。

def process_label(resized_img, label):
    # Perfrom some tensor transformations
    # ......

    return resized_img, label

dataset = dataset.map(process_label)
dataset = dataset.padded_batch(batch_size, 
                               padded_shapes=([None, None, 3], 
                                              [None, None]))  # my label has rank 2
1
Dat Nguyen