Używasz bardzo podstawowego modelu liniowego w przykładzie dla początkujących?
Oto sztuczka do debugowania - oglądać przekrój entropii jak zwiększyć wielkość wsadu (pierwsza linia jest na przykładzie, drugi właśnie dodane):
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
cross_entropy = tf.Print(cross_entropy, [cross_entropy], "CrossE")
przy wielkości partii 204, zobaczysz:
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[92.37558]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[90.107414]
Ale na 205 zobaczysz sekwencję jak to od początku:
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[472.02966]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[475.11697]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[1418.6655]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[1546.3833]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[1684.2932]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[1420.02]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[1796.0872]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[nan]
Ack - pojawia się NaN. Zasadniczo, duży rozmiar partii tworzy tak duży gradient, że twój model wymyka się spod kontroli - aktualizacje, które stosują, są zbyt duże i przekraczają kierunek, w którym powinny iść ogromnym marginesem.
W praktyce istnieje kilka sposobów, aby to naprawić. Można zmniejszyć szybkość uczenia się z .01 do, powiedzmy, 0.005, co daje ostateczną dokładność 0,92.
train_step = tf.train.GradientDescentOptimizer(0.005).minimize(cross_entropy)
Albo można użyć bardziej skomplikowany algorytm (Adam, Momentum, itp), optymalizacji, który stara się zrobić więcej, aby zorientować się w kierunku gradientu. Lub możesz użyć bardziej złożonego modelu, który ma więcej darmowych parametrów, dzięki którym można rozproszyć ten duży gradient.
W przypadku jesteś cierpi z tego samego błędu jak ja zrobiłeś, możesz chcieć tot sprawdzić tutaj: http://stackoverflow.com/questions/33712178/tensorflow-nan-bug – user1111929