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
Ich habe den Beitrag bearbeitet, um meinen vollständigen Code zu enthalten – Eric