In einem Klassifikationsproblem mit vielen Klassen schlägt Tensorflow docs vor, sampled_softmax_loss über eine einfache softmax zu verwenden, um Trainingslaufzeit zu reduzieren.Tensorflow Sampled Softmax Verlust Korrekte Verwendung
Nach der docs und source (Linie 1180), für sampled_softmax_loss die Anrufmuster:
tf.nn.sampled_softmax_loss(weights, # Shape (num_classes, dim) - floatXX
biases, # Shape (num_classes) - floatXX
labels, # Shape (batch_size, num_true) - int64
inputs, # Shape (batch_size, dim) - floatXX
num_sampled, # - int
num_classes, # - int
num_true=1,
sampled_values=None,
remove_accidental_hits=True,
partition_strategy="mod",
name="sampled_softmax_loss")
Es ist unklar, (zumindest für mich), wie ein reale Welt Problem in die Formen zu konvertieren, dass dieser Verlust Funktion erfordert. Ich denke, das Feld "Eingaben" ist das Problem.
Hier ist ein Beispiel für eine Copy-Paste-ready-Minimalfunktion, die beim Aufruf der Verlustfunktion einen Matrixmultiplikations-Formfehler auslöst.
import tensorflow as tf
# Network Parameters
n_hidden_1 = 256 # 1st layer number of features
n_input = 784 # MNIST data input (img shape: 28*28)
n_classes = 10 # MNIST total classes (0-9 digits)
# Dependent & Independent Variable Placeholders
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None, n_classes]) #
# Weights and Biases
weights = {
'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'out': tf.Variable(tf.random_normal([n_hidden_1, n_classes]))
}
biases = {
'b1': tf.Variable(tf.random_normal([n_hidden_1])),
'out': tf.Variable(tf.random_normal([n_classes]))
}
# Super simple model builder
def tiny_perceptron(x, weights, biases):
layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])
layer_1 = tf.nn.relu(layer_1)
out_layer = tf.matmul(layer_1, weights['out']) + biases['out']
return out_layer
# Create the model
pred = tiny_perceptron(x, weights, biases)
# Set up loss function inputs and inspect their shapes
w = tf.transpose(weights['out'])
b = biases['out']
labels = tf.reshape(tf.argmax(y, 1), [-1,1])
inputs = pred
num_sampled = 3
num_true = 1
num_classes = n_classes
print('Shapes\n------\nw:\t%s\nb:\t%s\nlabels:\t%s\ninputs:\t%s' % (w.shape, b.shape, labels.shape, inputs.shape))
# Shapes
# ------
# w: (10, 256) # Requires (num_classes, dim) - CORRECT
# b: (10,) # Requires (num_classes) - CORRECT
# labels: (?, 1) # Requires (batch_size, num_true) - CORRECT
# inputs: (?, 10) # Requires (batch_size, dim) - Not sure
loss_function = tf.reduce_mean(tf.nn.sampled_softmax_loss(
weights=w,
biases=b,
labels=labels,
inputs=inputs,
num_sampled=num_sampled,
num_true=num_true,
num_classes=num_classes))
Die letzte Zeile löst und Valueerror, die besagt, dass Sie mehrfach Tensoren mit Form kippen (? 10) und (?, 256). In der Regel stimme ich dieser Aussage zu. Voll Fehler unten:
ValueError: Dimensions must be equal, but are 10 and 256 for 'sampled_softmax_loss_2/MatMul_1' (op: 'MatMul') with input shapes: [?,10], [?,256].
Wenn der ‚dim‘ Wert von tensorflow docs soll, konstant sein, entweder die ‚Gewichte‘ oder ‚Eingänge‘ Variablen in die Verlustfunktion gehen falsch.
Alle Gedanken wären toll, ich bin völlig ratlos, wie man diese Verlustfunktion korrekt verwendet & es hätte einen großen Einfluss auf die Trainingszeit für das Modell, das wir es verwenden (500k Klassen). Vielen Dank!
--- EDIT ---
Es ist möglich, die Probe oben ohne Fehler auszuführen, indem Sie mit den Parametern spielen gezeigt zu bekommen und das Ignorieren der sampled_softmax_loss
erwarteten Eingaben Ruf Muster. Wenn Sie dies tun, führt dies zu einem trainierbaren Modell, das die Vorhersagegenauigkeit beeinträchtigt (wie Sie es erwarten würden).
Ich könnte falsch liegen, aber versuchen Sie, Ihre Gewichte mit Form definieren '[num_hidden_1, num_input]' und '[num_classes, num_hidden_1]'. Es scheint, als ob Ihre Daten nicht wie erwartet von Ihren vollständig verbundenen Schichten umgewandelt werden ... – Engineero
@Engineero Danke fürs Wiegen.Die versteckten Gewichte zwischen aufeinanderfolgenden Schichten des Modells werden miteinander multipliziert, so dass (256, 784) und (10, 256) die nicht kompatibel sind. Um sicherzustellen, dass der Rest des Codes korrekt ist, wird die Einstellung 'n_hidden_1' bis 10 (wie' n_classes') erfolgreich sein. Das macht natürlich nichts produktives, da es auf die falschen Kriterien optimiert! Nur ein kleiner Test. –
Interessant. Ich dachte an die Operationen: 'h = W1 * x',' y = W2 * h', in diesem Fall würden Sie Ihre Gewichtsmatrizen mit den vorgeschlagenen Dimensionen benötigen. Ich denke, es implementiert das Gegenteil: 'h = x * W1' und' y = h * W2'. ** Edit: ** Jetzt sehe ich, wo du dein Netzwerk definierst. Mein Fehler. – Engineero