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を使用したいです)
形状のタプルを渡す必要があります。あなたの場合、合格する必要があります
dataset = dataset.padded_batch(4, padded_shapes=([vectorSize],[None]))
または試す
dataset = dataset.padded_batch(4, padded_shapes=([None],[None]))
これを確認してください code 詳細については。この方法をデバッグして、なぜ機能しないのかを理解する必要がありました。
現在の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