0
votes

I am training convolutional neural network (CNN) and I am experiencing significant drop in training and validation accuracy after X iterations on MNIST: Steps vs. accuracy

That X seems to depend on learning rate. Modifying dropouts does not seem to have any impact on that phenomena. I did tests with lower reporting (report every 100 batches) and noticed that drop happens very fast. Accuracy does not recover after the drop.

training_accuracy / validation_accuracy => 1.0000 / 1.0000 for step 10000
training_accuracy / validation_accuracy => 0.9833 / 1.0000 for step 20000
training_accuracy / validation_accuracy => 1.0000 / 1.0000 for step 30000
training_accuracy / validation_accuracy => 1.0000 / 1.0000 for step 40000
training_accuracy / validation_accuracy => 1.0000 / 1.0000 for step 50000
training_accuracy / validation_accuracy => 0.1000 / 0.1000 for step 60000
training_accuracy / validation_accuracy => 0.1000 / 0.1000 for step 69999

My CNN is typical CNN, trained from 0. Code is available here. Dataset is standard MNIST dataset, with two catches:

  • I add random noise to images with very low values
  • I randomly shift images few pixels left and right

That's not overfitting, since training accuracy go down as well.

I noticed that all predictions are 0 after that drop. So accuracy is 1/10 = 0.1 (because CNN predicts always 0)

Do you know what is that phenomenon? I appreciate your thoughts and feedback.

Update 1: I noticed that all tf weights and biases are filled with nan:

2017-06-10 13:06:34.814975: I tensorflow/core/kernels/logging_ops.cc:79] This is W_fc1: [[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 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 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]...] 2017-06-10 13:06:34.830064: I tensorflow/core/kernels/logging_ops.cc:79] This is b_fc1: [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 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 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...] 2017-06-10 13:06:34.840501: I tensorflow/core/kernels/logging_ops.cc:79] This is W_fc2: [[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 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 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]...] 2017-06-10 13:06:34.851325: I tensorflow/core/kernels/logging_ops.cc:79] This is b_fc2: [nan nan nan nan nan nan nan nan nan nan]

1
NaNs means the loss exploded and your learning rate might be too high.Dr. Snoopy
I do not think that loss exploded. It was going slowly to 0. Or I misunderstood you?Tigran
I added constant to log function, may be that will help: tf.log(y + small_constant).Tigran
Can you please push the code with the logging statement that captures your edited output?Hassan
Code link is broken. Please add code here or in some permanent locationAtul Kumar

1 Answers

3
votes

If you are using the cross entropy loss function, then once your network is outputting predictions of 0.0 then your loss contains log(0) which is nan. In Python, any operation performed on nan is also nan, so this nan quickly backpropagates through your entire network. Use output = tf.clip_by_value(output, 10e-8, 1.-10e-8) before passing output to the loss function. Your solution of using tf.log(y + small_constant) will also work.