Os gradientes são sempre zero

Eu escrevi um algoritmo usando a estrutura tensorflow e enfrentei o problema, quetf.train.Optimizer.compute_gradients(loss) retorna zero para todos os pesos. Outro problema é se eu colocar o tamanho do lote maior que 5,tf.histogram_summary para pesos lança um erro que alguns dos valores são NaN.

Não posso fornecer aqui um exemplo reproduzível, porque meu código é bastante volumoso e não sou tão bom em TF para reduzi-lo. Vou tentar colar aqui alguns fragmentos.

Laço principal:

images_ph = tf.placeholder(tf.float32, shape=some_shape)
labels_ph = tf.placeholder(tf.float32, shape=some_shape)
output = inference(BATCH_SIZE, images_ph)
loss = loss(labels_ph, output)
train_op = train(loss, global_step)
session = tf.Session()
session.run(tf.initialize_all_variables())

for i in xrange(MAX_STEPS):
    images, labels = train_dataset.get_batch(BATCH_SIZE, yolo.INPUT_SIZE, yolo.OUTPUT_SIZE)
    session.run([loss, train_op], feed_dict={images_ph : images, labels_ph : labels})

Train_op (aqui está o problema ocorre):

def train(total_loss)
    opt = tf.train.AdamOptimizer()
    grads = opt.compute_gradients(total_loss)

    # Here gradients are zeros
    for grad, var in grads:
        if grad is not None:
            tf.histogram_summary("gradients/" + var.op.name, grad)

    return opt.apply_gradients(grads, global_step=global_step)

Perda (a perda é calculada corretamente, pois muda de amostra para amostra):

def loss(labels, output)
    return tf.reduce_mean(tf.squared_difference(labels, output))

Inferência: um conjunto de camadas de convolução com ReLU seguido por 3 camadas totalmente conectadas com ativação sigmóide na última camada. Todos os pesos inicializados por rv normais truncados. Todos os rótulos são vetores de comprimento fixo com números reais no intervalo[0,1].

Agradecemos antecipadamente por qualquer ajuda! Se você tem alguma hipótese para o meu problema, compartilhe, tentarei. Também posso compartilhar todo o código, se quiser.

questionAnswers(0)

yourAnswerToTheQuestion