J'ai récemment commencé à utiliser TensorFlow, mais pendant l'apprentissage, j'ai eu un problème en raison du fait que la précision a soudainement chuté et n'a pas changé. Si elle est inférieure, la précision diminuera soudainement à partir du 70e pas.
.
.
.
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
.
.
.
En regardant les poids, c'était comme suit.
(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]],
.
.
.
Puisqu'il s'agit de NaN, j'ai cherché "tensorflow nan" et j'ai trouvé une solution. http://stackoverflow.com/questions/33712178/tensorflow-nan-bug
La partie problème était la partie calcul de l'entropie croisée, qui était la suivante (y_conv est la probabilité de chaque étiquette par la fonction softmax).
python
cross_entropy = -tf.reduce_sum(labels*tf.log(y_conv))
Si cela reste tel quel, il deviendra log (0) et NaN peut sortir. Par conséquent, il a été résolu en normalisant à la gamme de 1e-10 à 1,0, puis en prenant le journal comme indiqué ci-dessous.
python
cross_entropy = -tf.reduce_sum(labels*tf.log(tf.clip_by_value(y_conv,1e-10,1.0)))
Il existe une fonction appelée ~~ tf.nn.softmax_cross_entropy_with_logits, et il semble préférable de l'utiliser comme suit. ~~ → Cette méthode n'a pas fonctionné.
Recommended Posts