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.