TensorFlow devolviendo nan al implementar regresión logística

He estado intentando implementar la Regresión logística en TensorFlow siguiendo el ejemplo de MNIST pero con datos de un CSV. Cada fila es una muestra y tiene 12 dimensiones. Mi código es el siguiente:

batch_size = 5 learning_rate = .001 x = tf.placeholder(tf.float32,[None,12]) y = tf.placeholder(tf.float32,[None,2]) W = tf.Variable(tf.zeros([12,2])) b = tf.Variable(tf.zeros([2])) mult = tf.matmul(x,W) pred = tf.nn.softmax(mult+b) cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1)) optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) sess = tf.Session() sess.run(tf.initialize_all_variables()) avg_cost = 0 total_batch = int(len(Xtrain)/batch_size) for i in range(total_batch): batch_xs = Xtrain[i*batch_size:batch_size*i+batch_size] batch_ys = ytrain[i*batch_size:batch_size*i+batch_size] _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,y: batch_ys}) print(c) 

Xtrain es una matriz numpy de 252×10, etrain es una matriz numpy de 252×2.

El problema: el costo c se calcula para la primera iteración (el valor es 0.6931 …), pero para cada iteración posterior, devuelve “nan”.

Cosas que he intentado: me aseguré de que todos los aspectos de los componentes del modelo funcionaran. El problema pasa totalmente después de la primera iteración. He jugado un poco con la tasa de aprendizaje, pero eso no hace nada. He intentado inicializar los pesos como truncado_normal (lo que no debería hacer para la regresión logística de todos modos), pero eso tampoco ayuda.

Entonces, ¿algún pensamiento? He pasado alrededor de 3 horas tratando de arreglarlo y me he quedado sin ideas. Parece que algo simplemente no funciona cuando TensorFlow va a optimizar la función de costo.

El problema que tienes es que log (pred) no está definido para pred = 0. La forma “hacky” para esto es usar tf.maximum(pred, 1e-15) o tf.clip_by_value(pred, 1e-15, 1.0) .

Sin embargo, una solución aún mejor es utilizar tf.nn.softmax_cross_entropy_with_logits(pred) lugar de aplicar softmax y la entropía cruzada por separado, que trata casos extremos como este (de ahí todos sus problemas) automáticamente.

Para más información, recomiendo esta gran respuesta: https://stackoverflow.com/a/34243720/5829427