2016-06-14 5 views
3

Ich versuche, ein CNN mit Tensorflow zu erstellen, die Bilder in 16 Klassen klassifiziert.Tensorflow cnn Fehler: Logits und Labels müssen die gleiche Größe haben:

Meine ursprüngliche Bildgröße 72x72x1, und mein Netzwerk ist wie folgt strukturiert:

# Network 
n_input = dim 
n_output = nclass # 16 
weights = { 
    'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32], stddev=0.1)), 
    'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64], stddev=0.1)), 
    'wd1': tf.Variable(tf.random_normal([9*9*128, 1024], stddev=0.1)), 
    'wd2': tf.Variable(tf.random_normal([1024, n_output], stddev=0.1)) 
} 
biases = { 
    'bc1': tf.Variable(tf.random_normal([32], stddev=0.1)), 
    'bc2': tf.Variable(tf.random_normal([64], stddev=0.1)), 
    'bd1': tf.Variable(tf.random_normal([1024], stddev=0.1)), 
    'bd2': tf.Variable(tf.random_normal([n_output], stddev=0.1)) 
} 

Hier meine konv net Funktion:

def conv_basic(_input, _w, _b, _keepratio): 
# Input 
_input_r = tf.reshape(_input, shape=[-1, 72, 72, 1]) 

# Conv1 
_conv1 = tf.nn.relu(tf.nn.bias_add(
     tf.nn.conv2d(_input_r, _w['wc1'], strides=[1, 1, 1, 1], padding='SAME') 
     , _b['bc1'])) 
_pool1 = tf.nn.max_pool(_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') 
mean, var = tf.nn.moments(_pool1, [0, 1, 2]) 
_pool1 = tf.nn.batch_norm_with_global_normalization(_pool1, mean, var, 1., 0., 1e-7, 0) 
_pool_dr1 = tf.nn.dropout(_pool1, _keepratio) 

# Conv2 
_conv2 = tf.nn.relu(tf.nn.bias_add(
     tf.nn.conv2d(_pool_dr1, _w['wc2'], strides=[1, 1, 1, 1], padding='SAME') 
     , _b['bc2'])) 
_pool2 = tf.nn.max_pool(_conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') 
mean, var = tf.nn.moments(_pool2, [0, 1, 2]) 
_pool2 = tf.nn.batch_norm_with_global_normalization(_pool2, mean, var, 1., 0., 1e-7, 0) 
_pool_dr2 = tf.nn.dropout(_pool2, _keepratio) 

# Vectorize 
_dense1 = tf.reshape(_pool_dr2, [-1, _w['wd1'].get_shape().as_list()[0]]) 

# Fc1 
_fc1 = tf.nn.relu(tf.add(tf.matmul(_dense1, _w['wd1']), _b['bd1'])) 
_fc_dr1 = tf.nn.dropout(_fc1, _keepratio) 

# Fc2 
_out = tf.add(tf.matmul(_fc_dr1, _w['wd2']), _b['bd2']) 

# Return everything 
out = { 
    'input_r': _input_r, 
    'conv1': _conv1, 
    'pool1': _pool1, 
    'pool1_dr1': _pool_dr1, 
    'conv2': _conv2, 
    'pool2': _pool2, 
    'pool_dr2': _pool_dr2, 
    'dense1': _dense1, 
    'fc1': _fc1, 
    'fc_dr1': _fc_dr1, 
    'out': _out 
} 
return out 

Wenn ich versuche, dies zu laufen, erhalte ich eine Fehler: "tensorflow.python.framework.errors.InvalidArgumentError: logits and labels must be same size: logits_size=[6,16] labels_size=[1,16]"

auf der Linie cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(_pred, y))

Ich habe versucht, die wd1-Gewichtswerte zu ändern, und abgesehen davon, dass die angeforderte Form ein Vielfaches von xxx benötigt, werden nur die Werte in den Klammern geändert.

Diese Werte (besonders 6) scheinen sehr willkürlich, idk woher sie kommen. Es wäre schön, wenn mir jemand erklären würde, wie FC-Schicht-Neuronen-Beträge gewählt werden, da es auch etwas willkürlich erscheint.

Dank

EDIT: Mein vollständiger Code https://gist.github.com/EricZeiberg/f0b138d859b9ed00ce045dc6b341e0a7

Antwort

0

Es ist schwer aus zu sagen, was Sie zur Verfügung gestellt, aber es scheint, wie Sie Eingänge mit einer Chargengröße von 6 ernähren, aber nur für sie ein Etikett zur Verfügung stellen. Woher kommen deine Daten?

+0

Ich habe den Beitrag bearbeitet, um meinen vollständigen Code zu enthalten – Eric

3

Da der Code (und erraten, was in ihm fehlt), ich glaube, Sie diese Parameter und Ergebnisse haben (korrigieren Sie mich, wenn falsch):

  • batch_size: 1
  • num_classes: 16
  • Etiketten y: Typ int, [batch_size, 1]
  • _pred Ausgänge Form: Typ float32 sollte sein Form [batch_size, num_classes]

in Ihrem Code Sie nur 2 max Pooling verwenden, die die Eingabe-Feature-Karte [1, 72, 72, 1]-[1, 18, 18, 64] reduzieren.

Bei diesem Schritt sollten Sie schreiben:

# Vectorize 
_dense1 = tf.reshape(_pool_dr2, [1, 18*18*64]) 

Sie sollten auch Ihre Matrix wd1 mit ersetzen:

'wd1': tf.Variable(tf.random_normal([18*18*64, 1024], stddev=0.1)) 

Im Allgemeinen in diesen Situationen müssen Sie jede Form drucken Schritt für Schritt und realisieren Sie selbst, wo die Form nicht dem entspricht, was Sie erwarten.

+0

Ich habe den Beitrag bearbeitet, um meinen vollständigen Code zu enthalten – Eric

+0

Nach dem Ausprobieren Ihres Codes, sagt es jetzt 'ValueError: Kann Wert der Form (1, 16) für Tensor nicht einspeisen u'Reshape_3: 0 ', die Form hat (1,)' ' – Eric

+0

Oh, ich habe auch eine Batch-Größe von 1 und num_classes ist 16 – Eric