2017-12-14 3 views
0

Diese Frage wurde schon mehrmals gestellt, aber ich bin nicht in der Lage, frühere Lösungen zu meinem Code anzupassen. Ich würde daher jeden Rat zur Lösung dieses Problems schätzen. Ich habe versucht, pdb zu verwenden und einen Verfolgungspunkt direkt vor dem Problem zu setzen, das mir nicht viel Information gab. Ich Anpassung dieses Tutorial zu meinem Problem: https://www.oreilly.com/ideas/visualizing-convolutional-neural-networksTensorflow logits und labels Fehler, aber sind die gleiche Form

Daten Form:

x_train.shape: (1161, 68, 68, 1) 
x_test.shape: (216, 68, 68, 1) 
y_test.shape: (216,) 
y_train.shape: (1161,) 

Wo der Fehler auftritt:

#Train the Model 
steps = int(x_train.shape[0]/batchSize) 
for i in range(numEpochs): 
    print(i) 
    accHist = [] 
    accHist2 = [] 
    #x_train, y_train = imf.shuffle(x_train, y_train) 
    for j in range(steps): 
     print(j) 
     #Calculate our current step 
     step = i * steps + j 
     #Feed forward batch of train images into graph and log accuracy 
     acc = sess.run([accuracy], feed_dict={X: x_train[(j*batchSize):((j+1)*batchSize),:,:,:], Y_: np.array(y_train[(j*batchSize):((j+1)*batchSize)]).reshape(1,30), keepRate1: 1, keepRate2: 1}) 
     print(accHist) 
     accHist.append(acc) 

     #Back propigate using adam optimizer to update weights and biases. 
     sess.run(train_step, feed_dict={X: x_train[(j*batchSize):((j+1)*batchSize),:,:,:], Y_: np.array(y_train[(j*batchSize):((j+1)*batchSize)]).reshape(1,30), keepRate1: 0.2, keepRate2: 0.5}) 
     print("success") 

    print('Epoch number {} Training Accuracy: {}'.format(i+1, np.mean(accHist))) 

    #Feed forward all test images into graph and log accuracy 
    for k in range(int(x_test.shape[0]/batchSize)): 
     acc = sess.run(accuracy, feed_dict={X: x_test[(k*batchSize):((k+1)*batchSize),:,:,:], Y_: np.array(y_test[(k*batchSize):((k+1)*batchSize)]).reshape(1,30), keepRate1: 1, keepRate2: 1}) 
     accHist2.append(acc) 
    print("Test Set Accuracy: {}".format(np.mean(accHist2))) 

ich die folgende Fehlermeldung erhalten:

InvalidArgumentError: logits and labels must be same size: logits_size=[30,30] labels_size=[1,30] 
    [[Node: cross_entropy_7/SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](cross_entropy_7/Reshape, cross_entropy_7/Reshape_1)]] 

Nach dem Tutorial, Ich dachte, die Anmeldungen hier gesetzt wurden:

#FULLY CONNECTED 3 & SOFTMAX OUTPUT 
with tf.name_scope('softmax') as scope: 
    fc2w = tf.Variable(tf.truncated_normal([512, classes], dtype=tf.float32, 
              stddev=1e-1), name='weights3_2') 
    fc2b = tf.Variable(tf.constant(1.0, shape=[classes], dtype=tf.float32), 
         trainable=True, name='biases3_2') 
    Ylogits = tf.nn.bias_add(tf.matmul(fc1_drop, fc2w), fc2b) 
    Y = tf.nn.softmax(Ylogits) 

print (Ylogits.shape) hier gibt mir: (, 30). Der Kurs ist auf 30 eingestellt, was sinnvoll erscheint.

Dies scheint die Funktionen zu sein, die nicht funktioniert, so druckte ich die Formen:

with tf.name_scope('cross_entropy'): 
    print(Ylogits.shape) 
    print(Y.shape) 
    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=Ylogits, labels=Y_) 
    loss = tf.reduce_mean(cross_entropy) 

Was mich gab: obwohl diese

(?, 30) 
(?, 30) 

Wenn die Leitung für Backpropagation Ausführung oben scheint nicht zu funktionieren. Kann jemand helfen?


Als Antwort auf einen Kommentar (dies ist im Grunde das Tutorial Code aus dem Link oben erwähnt):

Platz-Halter:

classes = 30 
    X = tf.placeholder(tf.float32, name="X-placeholder", shape=(None, 68, 68, 1)) 
    Y_ = tf.placeholder(tf.float32, [None, classes], name="Y_-placeholder") 
    keepRate1 = tf.placeholder(tf.float32, name="keepRate1-placeholder") 
    keepRate2 = tf.placeholder(tf.float32, name="keepRate2-placeholder") 

Modell:

# CONVOLUTION 1 - 1 
with tf.name_scope('conv1_1'): 
    filter1_1 = tf.Variable(tf.truncated_normal([3, 3, 1, 32], dtype=tf.float32, 
          stddev=1e-1), name='weights1_1') 
    stride = [1,1,1,1] 
    conv = tf.nn.conv2d(X, filter1_1, stride, padding='SAME') 
    biases = tf.Variable(tf.constant(0.0, shape=[32], dtype=tf.float32), 
         trainable=True, name='biases1_1') 
    out = tf.nn.bias_add(conv, biases) 
    conv1_1 = tf.nn.relu(out) 

# CONVOLUTION 1 - 2 
with tf.name_scope('conv1_2'): 
    filter1_2 = tf.Variable(tf.truncated_normal([3, 3, 32, 32], dtype=tf.float32, 
               stddev=1e-1), name='weights1_2') 
    conv = tf.nn.conv2d(conv1_1, filter1_2, [1,1,1,1], padding='SAME') 
    biases = tf.Variable(tf.constant(0.0, shape=[32], dtype=tf.float32), 
         trainable=True, name='biases1_2') 
    out = tf.nn.bias_add(conv, biases) 
    conv1_2 = tf.nn.relu(out) 

# POOL 1 
with tf.name_scope('pool1'): 
    pool1_1 = tf.nn.max_pool(conv1_2, 
          ksize=[1, 2, 2, 1], 
          strides=[1, 2, 2, 1], 
          padding='SAME', 
          name='pool1_1') 
    pool1_1_drop = tf.nn.dropout(pool1_1, keepRate1) 

# CONVOLUTION 2 - 1 
with tf.name_scope('conv2_1'): 
    filter2_1 = tf.Variable(tf.truncated_normal([3, 3, 32, 64], dtype=tf.float32, 
               stddev=1e-1), name='weights2_1') 
    conv = tf.nn.conv2d(pool1_1_drop, filter2_1, [1, 1, 1, 1], padding='SAME') 
    biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32), 
         trainable=True, name='biases2_1') 
    out = tf.nn.bias_add(conv, biases) 
    conv2_1 = tf.nn.relu(out) 

# CONVOLUTION 2 - 2 
with tf.name_scope('conv2_2'): 
    filter2_2 = tf.Variable(tf.truncated_normal([3, 3, 64, 64], dtype=tf.float32, 
               stddev=1e-1), name='weights2_2') 
    conv = tf.nn.conv2d(conv2_1, filter2_2, [1, 1, 1, 1], padding='SAME') 
    biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32), 
         trainable=True, name='biases2_2') 
    out = tf.nn.bias_add(conv, biases) 
    conv2_2 = tf.nn.relu(out) 

# POOL 2 
with tf.name_scope('pool2'): 
    pool2_1 = tf.nn.max_pool(conv2_2, 
          ksize=[1, 2, 2, 1], 
          strides=[1, 2, 2, 1], 
          padding='SAME', 
          name='pool2_1') 
    pool2_1_drop = tf.nn.dropout(pool2_1, keepRate1) 

#FULLY CONNECTED 1 
with tf.name_scope('fc1') as scope: 
    shape = int(np.prod(pool2_1_drop.get_shape()[1:])) 
    fc1w = tf.Variable(tf.truncated_normal([shape, 512], dtype=tf.float32, 
              stddev=1e-1), name='weights3_1') 
    fc1b = tf.Variable(tf.constant(1.0, shape=[512], dtype=tf.float32), 
         trainable=True, name='biases3_1') 
    pool2_flat = tf.reshape(pool2_1_drop, [-1, shape]) 
    out = tf.nn.bias_add(tf.matmul(pool2_flat, fc1w), fc1b) 
    fc1 = tf.nn.relu(out) 
    fc1_drop = tf.nn.dropout(fc1, keepRate2) 

#FULLY CONNECTED 3 & SOFTMAX OUTPUT 
with tf.name_scope('softmax') as scope: 
    fc2w = tf.Variable(tf.truncated_normal([512, classes], dtype=tf.float32, 
              stddev=1e-1), name='weights3_2') 
    fc2b = tf.Variable(tf.constant(1.0, shape=[classes], dtype=tf.float32), 
         trainable=True, name='biases3_2') 
    Ylogits = tf.nn.bias_add(tf.matmul(fc1_drop, fc2w), fc2b) 
    Y = tf.nn.softmax(Ylogits) 

numEpochs = 400 
batchSize = 30 
alpha = 1e-5 

with tf.name_scope('cross_entropy'): 
    print(Ylogits.shape) 
    print(Y.shape) 
    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=Ylogits, labels=Y_) 
    loss = tf.reduce_mean(cross_entropy) 

with tf.name_scope('accuracy'): 
    correct_prediction = tf.equal(tf.argmax(Y, 1), tf.argmax(Y_, 1)) 
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

with tf.name_scope('train'): 
    train_step = tf.train.AdamOptimizer(learning_rate=alpha).minimize(loss) 

#Create Session and insert variables 
sess = tf.Session() 
init = tf.global_variables_initializer() 
sess.run(init) 
+0

Wie definieren Sie fc1_drop? – JMA

+0

@jafergas Ich habe den Code hinzugefügt, der fc1_drop oben definiert, da es für einen Kommentar zu lang ist. KeepRate ist definiert als: keepRate2 = tf.placeholder (tf.float32, name = "keepRate2-placeholder") – Lena

Antwort

0

Der Tensor shape (?, 30) gibt an, dass die Stapelgröße nicht festgelegt ist. Sie können also beliebige Stapelgrößendaten an Ihr Diagramm, das Problem, übergeben m ist, dass Sie dann auf diese Art von Problemen stoßen können, und müssen die Tensorformen in Ihrem Kopf verfolgen.

Die Sache, die Sie beheben müssen, ist: Entweder haben Sie 30 Bilder in einem Stapel, aber nur 1 Etikett in einem Stapel, der repariert werden muss, weil Sie Verlust für 30 Bilder mit nur einem Etikett nicht berechnen können Sie müssen die Anzahl der Bilder auf 1 verringern oder die Größe des Etikettenstapels auf 30 erhöhen. Es könnte auch sein, dass Sie die Tensoren an einem anderen Ort falsch verformen.

Ich würde sehen, wo Sie Ihre Daten einlesen, und dann Stapel, das ist wahrscheinlich, wo das Problem sein wird, oder an Orten, wo Sie sie neu gestalten.

Poste deinen gesamten Code, es wäre hilfreicher.

+0

Ich habe mehr Code über – Lena

+0

hinzugefügt Wie vermutet, ist Ihre Batch-Größe 30, so dass Ihre logits Tensor ist in Ordnung, aber Ihre Label Tensor ist nicht, insbesondere Sie tun: acc = sess.run ([Genauigkeit], Feed_Dict = {X: x_train [(j * batchSize): ((j + 1) * BatchSize),:,:,:], Y_: np.array (y_train [(j *) batchSize): ((j + 1) * batchSize)]) .Reshape (1,30), keepRate1: 1, keepRate2: 1}) an 3 Stellen in Ihrem Code, können Sie sehen, dass Sie Ihre Y_ verformen Tensor zu (1,30), und es passt nicht zur Form des Logits-Tensors (30, 30). Sie müssen 30 Etiketten laden und sie dann korrekt für 30 Klassen codieren, so dass sie auch die Form (30, 30) haben. –

+0

danke das hat es gelöst! – Lena

Verwandte Themen