2016-07-06 6 views
1

Ich versuche ein neuronales Netzwerk im Tensorfluss zu erstellen, das nicht wirklich in die Klassifizierung von Regressionskategorien gehört. Es ist wahrscheinlich näher am Verstärkungslernen.Tensorflow NN mit spezifischer benutzerdefinierter Kostenfunktion

Ich habe ein Netzwerk mit ein paar versteckten ReLU-Ebenen erstellt, die in einer 3-Element-Softmax-Ausgabeschicht enden. Die Zielvektoren für jede Probe sind Belohnungen (können negativ für Strafe oder 0 für neutral sein), um eine bestimmte Auswahl (von denen es 3 gibt) zu treffen. Die Idee ist, die summierte Belohnung über alle Proben zu maximieren.

Gegeben eine Beispieleingabe, die einer Modellausgabe M = [a, b, c] mit Zielen Y = [d, e, f] zugeordnet wird; der Verlust für diese spezifische Probe wäre M * Y 'oder einfach -tf.matmul (Modell, Y, transpose_b = True). Wenn ich jedoch mit Chargen arbeite, die anstelle von Vektoren Matrizen ergeben, bin ich nicht in der Lage, dies als eine Kostenfunktion auszudrücken, die die TensorFlow-Optimierer nutzen können. Wenn Sie einfach den obigen Beispielcode verwenden, erhalten Sie eine bedeutungslose Batchgröße^2-große Matrix.

Wie kann ich das tun?

Antwort

2

Nehmen wir an, Sie haben die Ausgabe Ihres Modells für eine Mini-Charge von N Beispiele, nennen Sie es output. Das hätte die Form [N, 1, 3]. (Hinweis: Normalerweise würde die Ausgabe von softmax die Form [N, 3] haben, aber Sie können tf.reshape verwenden, um sie zu [N, 1, 3] umzuformen). Nennen Sie Ihre Belohnungen oder Ziele target, und das hätte auch die Form [N, 1, 3]. Sie können die folgende Operation tun, um die loss mit Form [N, 1, 1] zu erhalten:

loss = tf.batch_matmul(output, tf.transpose(target, [0, 2, 1])) 

Wenn Sie für Ihre mini zu durchschnittlichen Verlust möchten, können Sie wie folgt vorgehen:

loss = tf.reduce_mean(loss) 

, in dem Fall, dass Sie erhalten eine Skalarwert.

Verwandte Themen