2017-03-27 3 views
1

Ich habe eine tf.RandomShuffleQueue genannt data_queue wie folgt definiert:Rang von Etiketten (1 empfangen) sollte gleich Rang Logits minus 1 (4 empfangen)

self.data_queue = tf.RandomShuffleQueue(capacity=1024, 
                min_after_dequeue=21, 
                dtypes=[tf.float32, 
                  tf.int32], 
                shapes=[[221, 221, 3], []], 
                name="data_queue") 

ich in der Lage bin, um erfolgreich enqueue Datenelemente hinein.

Der dequeue Betrieb ist wie folgt definiert:

 [self.batch_images, self.batch_labels] = self.data_queue.dequeue_up_to(self.batchsize) 

In dem obigen Schnipsel self.batchsize ist eine Konstante Tensor.

Das Problem beginnt nun wie folgt:

es diese direkt auf mein Diagramm schieben will. Nur aus Gründen der Übersichtlichkeit die erste Schicht meines Diagramm ist wie folgt:

conv1 = tf.layers.conv2d(self.batch_images, filters=96, kernel_size=7, 
            strides=2, 
            activation=tf.nn.relu, 
            kernel_regularizer=tf 
            .random_uniform_initializer, 
            name='conv1') 

Die letzten Zeilen, wo der Fehler verwiesen wird, sind:

drop2 = tf.layers.dropout(fc2, name='drop2') 
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
       logits=drop2, 
                 labels=self.batch_labels, 
                    name="cross_entropy_per_example") 

Der Fehler, den ich erhalten ist:

line 1709, in sparse_softmax_cross_entropy_with_logits 
    (labels_static_shape.ndims, logits.get_shape().ndims)) 
ValueError: Rank mismatch: Rank of labels (received 1) should equal rank of logits minus 1 (received 4). 
  1. Als ich die tf.rank von self.images und self.labels überprüfte, bekam ich th e folgendes:

    Labels Tensor ("Rank: 0", die Form =(), dtype = float32) Bilder Tensor ("Rank_1: 0", die Form =(), dtype = int32)

Was ist der Grund dafür?

HINWEIS Ich will nicht tf.placeholder und feed_dict verwenden. Ich möchte den self.data_queue direkt mit dem Graphen verbinden.

Antwort

0

Ich habe die Lösung selbst gefunden. Einfach hier posten, wenn jemand sonst in Zukunft Hilfe braucht.

Die Ausgabe der Faltungsschicht muss neu geformt werden, wobei die Chargengröße gleich bleibt. Dies ist wichtig, da ansonsten die voll verknüpften Berechnungen keinen Sinn ergeben. Leider ist die Dokumentation von tf.layers.densehere auf diesem ziemlich unscharf und macht nicht die richtige Umgestaltung selbst.

Ich habe die Umformung mit tf.contrib.layers.flatten und es funktionierte wie ein Charme