Error de flujo tensor: formas incompatibles para la difusión

Actualmente estoy desarrollando un progtwig en Tensorflow que lee datos de 1750 por 1750 píxeles. Lo pasé por una red convolucional:

import os import sys import tensorflow as tf import Input FLAGS = tf.app.flags.FLAGS tf.app.flags.DEFINE_integer('batch_size', 100, "hello") tf.app.flags.DEFINE_string('data_dir', '/Volumes/Machine_Learning_Data', "hello") def inputs(): if not FLAGS.data_dir: raise ValueError('Please supply a data_dir') data_dir = os.path.join(FLAGS.data_dir, 'Data') images, labels = Input.inputs(data_dir = data_dir, batch_size = FLAGS.batch_size) return images, labels def weight_variable(shape): initial = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(initial) def bias_variable(shape): initial = tf.constant(0.1, shape = shape) return tf.Variable(initial) def conv2d(images, W): return tf.nn.conv2d(images, W, strides = [1, 1, 1, 1], padding = 'SAME') def max_pool_5x5(images): return tf.nn.max_pool(images, ksize = [1, 5, 5, 1], strides = [1, 1, 1, 1], padding = 'SAME') def forward_propagation(images): with tf.variable_scope('conv1') as scope: W_conv1 = weight_variable([5, 5, 1, 32]) b_conv1 = bias_variable([32]) image_matrix = tf.reshape(images, [-1, 1750, 1750, 1]) h_conv1 = tf.nn.sigmoid(conv2d(image_matrix, W_conv1) + b_conv1) h_pool1 = max_pool_5x5(h_conv1) with tf.variable_scope('conv2') as scope: W_conv2 = weight_variable([5, 5, 32, 64]) b_conv2 = bias_variable([64]) h_conv2 = tf.nn.sigmoid(conv2d(h_pool1, W_conv2) + b_conv2) h_pool2 = max_pool_5x5(h_conv2) with tf.variable_scope('conv3') as scope: W_conv3 = weight_variable([5, 5, 64, 128]) b_conv3 = bias_variable([128]) h_conv3 = tf.nn.sigmoid(conv2d(h_pool2, W_conv3) + b_conv3) h_pool3 = max_pool_5x5(h_conv3) with tf.variable_scope('local3') as scope: W_fc1 = weight_variable([10 * 10 * 128, 256]) b_fc1 = bias_variable([256]) h_pool3_flat = tf.reshape(h_pool3, [-1, 10 * 10 * 128]) h_fc1 = tf.nn.sigmoid(tf.matmul(h_pool3_flat, W_fc1) + b_fc1) keep_prob = tf.placeholder(tf.float32) h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) W_fc2 = weight_variable([256, 4]) b_fc2 = bias_variable([4]) y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) return y_conv def error(forward_propagation_results, labels): labels = tf.cast(labels, tf.float32) mean_squared_error = tf.square(tf.sub(labels, forward_propagation_results)) cost = tf.reduce_mean(mean_squared_error) train = tf.train.GradientDescentOptimizer(learning_rate = 0.3).minimize(cost) return train print cost 

Desafortunadamente ha aparecido un error

Formas incompatibles para la transmisión: TensorShape ([Dimension (100)]) y TensorShape ([Dimension (9187500), Dimension (4)])

y no he podido depurar esto.

¿Cuál es el problema con las dimensiones de la matriz? El intérprete dice que el error ocurrió en la línea tf.sub.

Editar:

Esta es la parte principal del código donde se llaman las funciones.

 import Input import Process import tensorflow as tf def train(): with tf.Session() as sess: images, labels = Process.inputs() forward_propgation_results = Process.forward_propagation(images) train_loss = Process.error(forward_propgation_results, labels) init = tf.initialize_all_variables() sess.run(init) def main(argv = None): train() if __name__ == '__main__': tf.app.run() 

He encontrado los siguientes problemas:

  1. Su entrada de labels es una simple matriz tridimensional de identificadores de tags, pero debe ser codificada en caliente para ser una matriz con tamaño [batch_size, 4] que se rellene con 1s o 0s.

  2. Su operación de agrupación máxima debe tener pasos que sean diferentes de 1 para reducir realmente el ancho y la altura de la imagen. Así que la configuración de strides=[1, 5, 5, 1] debería funcionar.

  3. Después de arreglar eso, sus operaciones de agrupación máxima en realidad no reducen el ancho / alto de 1750 a 10 como está suponiendo, sino solo a 14 (porque 1750 / 5 / 5 / 5 == 14 Así que probablemente desee Aumente su matriz de peso aquí, pero también hay otras opciones.

  4. ¿Es posible que tus imágenes comiencen con 3 canales? Usted está asumiendo la escala de grises aquí, por lo que debe cambiar la forma de image_matrix para tener 3 canales, o convertir las imágenes a escala de grises.

Después de aplicar estas correcciones, tanto la salida de red como las tags deberían tener la forma [batch_size, 4] y debería poder calcular la diferencia.

Editar: He ajustado esto después de discutir el código en el chat a continuación.

El etiquetado One_hot agrega dimensión a su entrada. Como ejemplo, si el tensor de las labels es de tamaño [batch, 1], utilizando tf.one_hot(batch_labels, depth=2, axis=-1) devuelve un tensor de dimensión [batch, 1,2]. Para el caso de tamaño [batch_size, 1] para las labels tensoriales, el siguiente script puede ser la solución para deshacerse de la dimensión adicional:

tf.one_hot(tf.squeeze(batch_labels,[1]), depth=2, axis=-1)

Básicamente, el tensor de las labels debe ser de tamaño [batch_size,]. La función tf.squeeze (), elimina dimensiones específicas. El argumento [1], solicita a la función que elimine la segunda dimensión que es 1 .