computer vision - semantic - ¿Cómo implementar la clasificación de píxeles para el etiquetado de escenas en TensorFlow?
semantic segmentation (1)
Para aplicar softmax y usar una pérdida de entropía cruzada , debe mantener intacta la salida final de su red de tamaño batch_size x 256 x 256 x 33 . Por lo tanto, no puede utilizar promedios medios o argmax porque destruiría las probabilidades de salida de su red.
Tiene que recorrer todos los lotes de tamaño x 256 x 256 píxeles y aplicar una pérdida de entropía cruzada a su predicción para este píxel. Esto es fácil con la función tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels)
.
Algunas advertencias del documento antes de aplicar el siguiente código:
- ADVERTENCIA: Esta operación espera logits sin escala , ya que realiza un softmax en logits internamente para mayor eficiencia. No llame a esta operación con la salida de softmax, ya que producirá resultados incorrectos.
- logits y debe tener la forma [batch_size, num_classes] y el dtype (float32 o float64).
- las etiquetas deben tener la forma [batch_size] y el dtype int64.
El truco es usar batch_size * 256 * 256
como el tamaño de lote requerido por la función. Vamos a cambiar la forma de logits
y labels
a este formato. Aquí está el código que utilizo:
inputs = tf.placeholder(tf.float32, [batch_size, 256, 256, 3]) # input images
logits = inference(inputs) # your outputs of shape [batch_size, 256, 256, 33] (no final softmax !!)
labels = tf.placeholder(tf.float32, [batch_size, 256, 256]) # your labels of shape [batch_size, 256, 256] and type int64
reshaped_logits = tf.reshape(logits, [-1, 33]) # shape [batch_size*256*256, 33]
reshaped_labels = tf.reshape(labels, [-1]) # shape [batch_size*256*256]
loss = sparse_softmax_cross_entropy_with_logits(reshaped_logits, reshaped_labels)
A continuación, puede aplicar su optimizador en esa pérdida.
Actualización: v0.10
La documentation de tf.sparse_softmax_cross_entropy_with_logits
muestra que ahora acepta cualquier forma para logits
, por lo que no es necesario cambiar la forma de los tensores (gracias @chillinger):
inputs = tf.placeholder(tf.float32, [batch_size, 256, 256, 3]) # input images
logits = inference(inputs) # your outputs of shape [batch_size, 256, 256, 33] (no final softmax !!)
labels = tf.placeholder(tf.float32, [batch_size, 256, 256]) # your labels of shape [batch_size, 256, 256] and type int64
loss = sparse_softmax_cross_entropy_with_logits(logits, labels)
Estoy trabajando en un modelo de aprendizaje profundo utilizando TensorFlow de Google . El modelo debe utilizarse para segmentar y etiquetar escenas .
- Estoy usando el conjunto de datos SiftFlow que tiene 33 clases semánticas e imágenes con 256x256 píxeles .
- Como resultado, en mi capa final utilizando convolución y desconvolución, llego al siguiente tensor (matriz) [256, 256, 33] .
- A continuación, me gustaría aplicar Softmax y comparar los resultados con una etiqueta semántica de tamaño [256, 256] .
Preguntas: ¿Debo aplicar promediado promedio o argmax a mi capa final para que su forma se convierta en [256,256,1] y luego recorrer cada píxel y clasificar como si estuviera clasificando 256x256 instancias? Si la respuesta es sí, ¿cómo, si no, qué otras opciones?