2017-10-04 18 views
0

私はテンソルフローが新しく、バッチを使用してCSVファイルからトレーニングしようとしています。Tensorflow - バッチ処理の問題

ここで読み取りcsvファイルのための私のコードだと、ここでバッチ

filename_queue = tf.train.string_input_producer(
    ['BCHARTS-BITSTAMPUSD.csv'], shuffle=False, name='filename_queue') 

reader = tf.TextLineReader() 
key, value = reader.read(filename_queue) 

# Default values, in case of empty columns. Also specifies the type of the 
# decoded result. 
record_defaults = [[0.], [0.], [0.], [0.], [0.],[0.],[0.],[0.]] 
xy = tf.decode_csv(value, record_defaults=record_defaults) 

# collect batches of csv in 
train_x_batch, train_y_batch = \ 
    tf.train.batch([xy[0:-1], xy[-1:]], batch_size=100) 

とは、訓練のためのmake:

# initialize 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

# Start populating the filename queue. 
coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(sess=sess, coord=coord) 


# train my model 
for epoch in range(training_epochs): 
    avg_cost = 0 
    total_batch = int(2193/batch_size) 

    for i in range(total_batch): 
     batch_xs, batch_ys = sess.run([train_x_batch, train_y_batch]) 
     feed_dict = {X: batch_xs, Y: batch_ys} 
     c, _ = sess.run([cost, optimizer], feed_dict=feed_dict) 
     avg_cost += c/total_batch 

    print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost)) 

coord.request_stop() 
coord.join(threads) 

は、ここに私の質問です:

1.

私のcsvファイル2193レコードがあり、バッチサイズは100です。だから私はこれを望んでいます。あらゆるエポックで'最初のレコード'、100レコードの21バッチ、93レコードの最後の1バッチを列車に送ります。合計22バッチ。

しかし、すべてのバッチは100サイズであることがわかりました。さらに、それは第2の「時代」からの「最初の記録」から始まらない。

レコードサイズ(この場合は2193)はどのように取得できますか?私はそれをハードコードする必要がありますか?またはそれを行う他のスマートな方法はありますか?私はtendor.get_shape()。as_list()を使用しましたが、batch_xsでは機能しません。それはただ私に空の形[]を返します。

答えて

1

最近、このような問題の解決を容易にするtf.contrib.dataというTensorFlowに新しいAPIを追加しました。 (「キューランナー」エポック境界が失われるためのAPIは、それが困難な正確なエポックの境界上の計算を書くために作るベース)

は、ここでは、あなたのプログラムを書き換えることtf.contrib.dataを使用したい方法の例です:

lines = tf.contrib.data.TextLineDataset("BCHARTS-BITSTAMPUSD.csv") 

def decode(line): 
    record_defaults = [[0.], [0.], [0.], [0.], [0.],[0.],[0.],[0.]] 
    xy = tf.decode_csv(value, record_defaults=record_defaults) 
    return xy[0:-1], xy[-1:] 

decoded = lines.map(decode) 

batched = decoded.batch(100) 

iterator = batched.make_initializable_iterator() 

train_x_batch, train_y_batch = iterator.get_next() 

そして、トレーニングの部分は少し簡単になることができます。

# initialize 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

# train my model 
for epoch in range(training_epochs): 
    avg_cost = 0 
    total_batch = int(2193/batch_size) 

    total_cost = 0.0 
    total_batch = 0 

    # Re-initialize the iterator for another epoch. 
    sess.run(iterator.initializer) 

    while True: 

    # NOTE: It is inefficient to make a separate sess.run() call to get each batch 
    # of input data and then feed it into a different sess.run() call. For better 
    # performance, define your training graph to take train_x_batch and train_y_batch 
    # directly as inputs. 
    try: 
     batch_xs, batch_ys = sess.run([train_x_batch, train_y_batch]) 
    except tf.errors.OutOfRangeError: 
     break 

    feed_dict = {X: batch_xs, Y: batch_ys} 
    c, _ = sess.run([cost, optimizer], feed_dict=feed_dict) 
    total_cost += c 
    total_batch += batch_xs.shape[0] 

    avg_cost = total_cost/total_batch 

    print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost)) 

"Importing Data" programmer's guideを参照して、新しいAPIを使用する方法の詳細については。

+0

まだレコードの数(2193)を取得する方法はありません? – BlakStar

+0

'total_batch'変数は' while'ループの最後に2193(または実際のレコード数が何であるかにかかわらず)を含みます。 – mrry

+0

私は今日それを逃しました...そしてそれは誤りを作ります。これはbatch_xsの形状[7,100]なので、形状[?、7]を持つXには供給できません。あなたがリンクしたガイドを読んで、それが形を作ることを意図していることを知りました[7,100]。しかし、私はbatch_xsが[100,7]の代わりに[7,100]という形をしている理由を理解していません。または別の方法がありますか? – BlakStar