2

Ich habe eine tiefe CNN, die eine Bezeichnung zwischen "0" und "2" für jedes Pixel in einem 3D-Bild vorhersagt. Ich habe das Modell auf einem Bild trainiert, bei dem jedes Pixel mit "1" beschriftet ist. Daher glaube ich, dass beim Testen des Modells jede Vorhersage "1" sein sollte. Stattdessen sagt das Modell nur "0" voraus.Tensorflow neuronalen Netzwerk Vorhersage ist immer das gleiche

Hier ist das Repository für das gesamte Modell: https://github.com/dhasl002/Research-DeepLearning.

Da der Code fast 300 Zeilen ist, werde ich nur den entsprechenden Code unten enthalten.

x = tf.placeholder(tf.float32, shape=[None, 7168]) 
y_ = tf.placeholder(tf.float32, shape=[None, 7168, 3]) 

W_final = weight_variable([7168,7168,3]) 
b_final = bias_variable([7168,3]) 

#"final" is the result of the many convolutions 
final_conv = tf.tensordot(final, W_final, axes=[[1], [1]]) + b_final 

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=final_conv)) 
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) 
correct_prediction = tf.equal(tf.argmax(final_conv, 2), tf.argmax(y_, 2)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

#a is a threshold associate with each pixel, b is the label of each pixel 
a = np.zeros((1,7168),dtype = float) 
b = np.zeros((1,7168, 3), dtype = float) 

#this is a little simplified for clarity of reader 
#TRAINING 
for line in inputFile: 
    thresh, label = line.strip().split(",") 
    a[0][it] = thresh 
    b[0][it][label] = 1 
train_step.run(feed_dict={x: a, y_: b, keep_prob: .5}) 

#TESTING 
for line in inputFile: 
    thresh, label = line.strip().split(",") 
    a[0][it] = thresh 
    b[0][it][label] = 1 
temp = sess.run(tf.argmax(final_conv,2), feed_dict={x: a}) 

Ich glaube, dass „temp“ von der letzten Zeile sollte die richtigen Vorhersagen (7168 Etikett - eine pro Pixel) halten. Warum führt "temp" immer zu "0" -Etiketten, wenn es nur auf Bildern mit "1" -Etiketten trainiert wird?

+2

Fügen Sie mindestens einige Ihrer Daten zum Repo hinzu, so dass es reproduziert werden konnte – Maxim

+0

Ich habe einige der Daten zum Repo hinzugefügt. Vielen Dank. –

Antwort

2

Die von Ihnen angegebenen Daten enthalten nicht nur 1 Etiketten, sondern gelegentlich auch 2 (Sie können die Textdateien überfliegen oder einfach die label Werte drucken, um dies zu sehen). Es widerspricht nicht nur Ihrer Idee, eine konstante Funktion zu trainieren, es unterbricht auch die Ein-Hot-Codierung und damit den gesamten Algorithmus.

Hier ist der Auszug aus dem Skript:

a = np.zeros((1,N*M*P),dtype = float) 
b = np.zeros((1,N*M*P, 3), dtype = float) 
[...] 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    parent = "..." 
    with open(parent) as inf1: 
    next(inf1) 
    for line5 in inf1: 
     line1, maxNum = line5.strip().split(",") 
     path = "..." 
     num = 0 
     while num < maxNum: 
     it = 0 
     with open(path + str(num) + ".txt") as inf: 
      next(inf) 
      num = num + 1 
      for line in inf: 
      [...] 
      a[0][it] = thresh 
      b[0][it][label] = 1 
      it = it + 1 

an Ihrem Code Sehen, b soll ein One-Hot-Vektor sein. Beachten Sie jedoch, dass es nur dann auf Null gesetzt wird, wenn die Variable definiert ist. Danach ist es 1 bei verschiedenen Indizes zugeordnet. Die späteren Iterationen der while-Schleife aktualisieren die gleiche b-Anordnung, daher enthält sie mehrere 1 in den späteren Reihen der Charge. Die cross-entropy loss erwartet eine gültige Wahrscheinlichkeitsverteilung, also mit Ihren Daten sein Ausgang wird völlig bedeutungslos:

Jede Zeile labels[i] muss eine gültige Wahrscheinlichkeitsverteilung sein.

Zusammenfassung: so, wie Sie Datenverarbeitung zu tun ist zu kompliziert und, als Folge, fehleranfällig. Versuchen Sie, Ihre Eingabedateien einfacher zu organisieren, damit sie in ein numpliges Array (oder Pandas-Datenframe) eingelesen und der Sitzung zugeführt werden können.

1

Da Sie ReLUs verwenden, ist eine Möglichkeit, dass Sie unter dem Dying ReLU Problem leiden; Sie könnten dies beheben, indem Sie zu etwas wie undicht ReLUs wechseln.

Darüber hinaus ist Ihr Modell ziemlich tief und komplex; um sicherzustellen, dass es richtig funktioniert, möchten Sie es möglicherweise erheblich zurück skalieren, es testen, um zu sehen, ob es Ihnen vernünftige Ergebnisse gibt, und dann Dinge schrittweise hinzufügen.

In jedem Fall scheint es, dass Ihr Modell viel zu komplex für das Problem ist. Ein Modell, das für jedes einzelne Pixel eine Beschriftung erzeugt, sollte ziemlich einfach sein, da die Kennzeichnung eines bestimmten Pixels wahrscheinlich nur von nahen Pixeln abhängt und wahrscheinlich nicht sehr komplex.

+0

Ich repliziere die Architektur von einer Forschungsarbeit, also bin ich etwas zuversichtlich in das Modell selbst.Ich dachte, dass meine Probleme von der Art herrührten, wie ich das Modell aufbewahre, trainiere und teste. –

+1

Können Sie einen Link zum Papier hinzufügen? Ich bin gespannt, warum sie für jedes einzelne Pixel ein Label ausgeben. – Stephen

+0

Ich habe es dem Repository hinzugefügt. Ist es möglich, dass das Modell so langsam trainiert, dass ich mehr als 300 Bilder benötige, um es zu trainieren? –

Verwandte Themen