2016-06-05 3 views
3

여러 개의 그래디언트 단계를 거치고 싶은 상당히 큰 배치 크기가 있습니다. 루프 용 파이썬으로이 일을 쉽게 할 수는 있지만 각 반복마다 GPP로 데이터를 전송하는 것을 포함하지 않는보다 효율적인 방법이있을 수 있다고 상상합니다. 나는 기차를 가져 오기 목록에 여러 번 넣으려고 시도했지만 실제로는 두 번 이상 실행되고 있는지 확신하지 못합니다 (런타임은 정확히 동일합니다).train을 tensorflow에서 여러 번 실행하십시오.

답변

4

앞서를 만들 수 있고, 대신 peristent 텐서를 사용 run 호출 사이에이 데이터를 유지 할 수있다. 장난감 예가 있습니다

t = tf.int32 
params = tf.Variable(tf.ones_initializer((), dtype=dt)) 
data_batches = [[1], [2, 3], [4, 5, 6]] 

# op that uploads data to TF and saves it as a persistent Tensor 
data_saver_placeholder = tf.placeholder(dt) 
tensor_handle_op = tf.get_session_handle(data_saver_placeholder) 

data_placeholder, data = tf.get_session_tensor(dt) 
train_op = tf.assign_add(params, tf.reduce_prod(data)) 
init_op = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init_op) 

for batch in data_batches: 
    # upload tensor to TF runtime and save its handle 
    tensor_handle = sess.run(tensor_handle_op, feed_dict={data_saver_placeholder: batch}) 
    # run train op several times reusing same data 
    for i in range(3): 
     sess.run(train_op, feed_dict={data_placeholder: tensor_handle.handle}) 


assert sess.run(params) == 382 
+0

이 솔루션을 한동안 사용했지만'get_session_tensor' API가 변경되어 더 이상 작동하지 않습니다. 이제 dtype과 함께 핸들이 필요합니다. –

+0

소스를 보면 핸들은 텐서의 장치를 결정하는 데만 사용됩니다. 따라서 CPU를 사용하는 경우 CPU에 더미 핸들을 만들어 재사용 할 수 있습니다. –

+0

고마워요, Yaroslav,하지만 두 가지 점에 대해서는 혼란 스럽습니다. 우선, CPU에서 GPU 로의 큰 배치의 다중 전송을 피하기 위해 더미 핸들이 CPU가 아닌 GPU에 있어야하지 않습니까? 둘째, 메모리를 비우기 위해'delete_session_tensor'를 호출 할 필요가없는 이유는 무엇입니까? – gmr

2

sess.run([myop,myop])을 실행하면 myop 번만 실행됩니다.

op를 실행하고 그 결과를 파이썬 런타임에 가져 오지 않으려면 컨트롤 종속성을 사용할 수 있습니다. 이 작업을 수행하는 간단한 방법은, 즉, group 영업 이익

sess.run(tf.group(myop)) 
sess.run(tf.group(myop)) 

그래프는 실행 호출 사이 group 연산을 구성하여 여분의 오버 헤드를 얻을 수 큰 경우

(어쩌면 -10>에 대한 노드 그래프를 10-100ms)입니다 그래서 당신은 가변 크기의 배치가있는 경우는 변수를 저장하는 나쁜 적합 시간

myop_nooutput = tf.group(myop) 
sess.run(myop_nooutput) 
sess.run(myop_nooutput) 
+0

예제에 피드 dict은 어디에 있습니까? –

+0

sess.run에 추가 인수로'feed_dict'를 전달할 수 있습니다 –

+0

그래서 각 실행마다 feed_dict가 별도로 전달됩니까? (이것은 내가 피하고자했던 것입니다.) –

관련 문제