Ich habe kürzlich angefangen, TensorFlow zu verwenden, aber während des Lernens hatte ich das Problem, dass die Genauigkeit plötzlich abnahm und sich nicht änderte. Wenn es darunter liegt, nimmt die Genauigkeit ab dem 70. Schritt plötzlich ab.
.
.
.
step:67 train:0.894584 test:0.756296
step:68 train:0.900654 test:0.756944
step:69 train:0.897526 test:0.758796
step:70 train:0.361345 test:0.333333
step:71 train:0.361345 test:0.333333
step:72 train:0.361345 test:0.333333
step:73 train:0.361345 test:0.333333
.
.
.
Mit Blick auf die Gewichte war es wie folgt.
(pdb) w1
array([[[[ nan, nan, nan, ..., nan, nan, nan],
[ nan, nan, nan, ..., nan, nan, nan],
[ nan, nan, nan, ..., nan, nan, nan]],
[[ nan, nan, nan, ..., nan, nan, nan],
[ nan, nan, nan, ..., nan, nan, nan],
[ nan, nan, nan, ..., nan, nan, nan]],
.
.
.
Da es sich um NaN handelt, habe ich nach "Tensorflow Nan" gesucht und eine Lösung gefunden. http://stackoverflow.com/questions/33712178/tensorflow-nan-bug
Der Problemteil war der Berechnungsteil der Kreuzentropie, der wie folgt war (y_conv ist die Wahrscheinlichkeit jedes Labels durch die Softmax-Funktion).
python
cross_entropy = -tf.reduce_sum(labels*tf.log(y_conv))
Wenn dies so bleibt, wird es log (0) und NaN kann herauskommen. Daher wurde es gelöst, indem auf den Bereich von 1e-10 bis 1,0 normalisiert und dann das Protokoll wie unten gezeigt erstellt wurde.
python
cross_entropy = -tf.reduce_sum(labels*tf.log(tf.clip_by_value(y_conv,1e-10,1.0)))
Es gibt eine Funktion namens ~~ tf.nn.softmax_cross_entropy_with_logits, und es scheint besser, sie wie folgt zu verwenden. ~~ → Diese Methode hat nicht funktioniert.
Recommended Posts