2017-10-04 11 views
0

나는 tensorflow에 상당히 익숙하며 일괄 처리를 사용하여 내 CSV 파일에서 트레이닝을 시도하고 있습니다.Tensorflow - 일괄 처리 문제

1.

내 csv 파일 : 여기

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

내 질문입니다 :

여기에 읽기 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) 

을 만들고 여기에 훈련입니다 2193 개의 레코드가 있고 일괄 처리 크기는 100입니다. 그래서 내가 원하는 것은 이것입니다 : 모든 '신기원'에서 '첫 번째 레코드', 100 개의 레코드로 21 개의 일괄 처리, 93 개의 레코드로 이루어진 마지막 1 개의 일괄 처리를 수행합니다. 그래서 총 22 배치.

그러나 모든 배치의 크기가 100 인 것으로 나타났습니다. 또한, 그것은 두 번째 '신기원'에서 '첫 번째 기록'으로 시작하지 않습니다.

어떻게하면 레코드 크기 (이 경우 2193)를 얻을 수 있습니까? 하드 코딩해야하나요? 아니면 그것을 할 다른 현명한 방법이 있습니까? tendor.get_shape(). as_list()를 사용했지만 batch_xs에서는 작동하지 않습니다. 그냥 빈 모양 []을 반환합니다.

답변

1

우리는 최근에 TensorFlow에 새로운 API를 추가하여 tf.contrib.data이라고 불렀습니다.이 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() 
그런 다음 교육 부분은 조금 간단하게 될 수 있습니다 다음 "Importing Data" programmer's guide를 참조 새로운 API를 사용하는 방법에 대한 자세한 내용은

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

.

+0

그래서 '레코드 수 (2193)'를 구할 수있는 방법은 없습니다. – BlakStar

+0

'total_batch' 변수는'while' 루프의 끝에 2193 (또는 실제 레코드 수가 무엇이든간에)을 포함하게됩니다. – mrry

+0

나는 오늘 그것을 runned ... 그리고 그것은 오류가 있습니다. 이것은 batch_xs의 모양 [7,100]이기 때문에 모양 [?, 7]을 가진 X에 공급할 수 없습니다. 나는 당신이 링크 한 가이드를 읽고 그것이 모양을 만들기위한 것임을 알아냅니다 [7,100]. 그러나 나는 왜 batch_xs가 [100,7] 대신 [7,100] 모양을 가지고 있는지 이해하지 못합니다. 그래서 제 훈련 모델을 바꾸어야합니까? 아니면 다른 방법이 있습니까? – BlakStar