2017-11-26 4 views
0

예는 다음과 같은 코드를 포함했다 :TensorFlow의 시간이나 배치에 최적화 한

pred = tf.tensordot(x, w, 1) + b 
cost = tf.reduce_sum((pred-y)**2/n_samples) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 

을 ... a의 오버 헤드를 발생

for epoch in range(epochs): 
    for (x1, y1) in zip(train_x, train_y): 
     optimizer.run({x: x1, y: y1}) 

각 교육 사례에 대한 Python 루프 반복. 나는이 방법 대신 다음과 같이 시도하기로 결정했다 :

for epoch in range(epochs): 
    optimizer.run({x: train_x, y: train_y}) 

그리고 똑같이 잘 작동하는 것처럼 보입니다.

내가 한 번에 하나씩하는 것에 대해 잘 모르고있는 이유가 있습니까? 아니면 실제로 일괄 처리 방식이 무료 속도 향상이기 때문에 대신 사용해야하는 경우입니까?

답변

1

첫 번째 변형은 각 데이터 쌍마다 개별적으로 최적화됩니다. 이것은 배치 크기가 1 인 확률적인 그래디언트 디센트입니다. 벡터 계산을위한 가능성을 용인하기 때문에 속도가 매우 느릴 수 있습니다. GPU를 사용하는 경우.

두 번째 변형은 각 단계에서 전체 데이터 세트를 사용하므로 확률 적이 아닌 그라디언트 디센트입니다. 이것은 거대한 데이터 세트에 대해서는 실용적이지 않으며 많은 저자는 컨버전스가 느리다는 의견을 제시합니다.

배치 크기가 1보다 크지 만 전체 데이터 세트보다 훨씬 작은 미니 배치가 좋은 절충안입니다. 100에서 시작하면 다른 두 방법보다 더 나은 수렴을 기대할 수 있습니다. 텐서 유동 배치에서 미니

은 다음 호출을 통해 지원된다 https://www.tensorflow.org/api_docs/python/tf/train/batch
이 원하는 크기 (예컨대, 100)의 순서로 데이터를 분할 지원한다.