2016-04-19 32 views
3

Hey ich tensorflow bin neu und auch nach vielen Bemühungen nicht L1 Regularisierungsterm zu dem FehlertermWie genau L1 Regularisierung hinzufügen Fehlerfunktion

x = tf.placeholder("float", [None, n_input]) 
# Weights and biases to hidden layer 
ae_Wh1 = tf.Variable(tf.random_uniform((n_input, n_hidden1), -1.0/math.sqrt(n_input), 1.0/math.sqrt(n_input))) 
ae_bh1 = tf.Variable(tf.zeros([n_hidden1])) 
ae_h1 = tf.nn.tanh(tf.matmul(x,ae_Wh1) + ae_bh1) 

ae_Wh2 = tf.Variable(tf.random_uniform((n_hidden1, n_hidden2), -1.0/math.sqrt(n_hidden1), 1.0/math.sqrt(n_hidden1))) 
ae_bh2 = tf.Variable(tf.zeros([n_hidden2])) 
ae_h2 = tf.nn.tanh(tf.matmul(ae_h1,ae_Wh2) + ae_bh2) 

ae_Wh3 = tf.transpose(ae_Wh2) 
ae_bh3 = tf.Variable(tf.zeros([n_hidden1])) 
ae_h1_O = tf.nn.tanh(tf.matmul(ae_h2,ae_Wh3) + ae_bh3) 

ae_Wh4 = tf.transpose(ae_Wh1) 
ae_bh4 = tf.Variable(tf.zeros([n_input])) 
ae_y_pred = tf.nn.tanh(tf.matmul(ae_h1_O,ae_Wh4) + ae_bh4) 



ae_y_actual = tf.placeholder("float", [None,n_input]) 
meansq = tf.reduce_mean(tf.square(ae_y_actual - ae_y_pred)) 
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(meansq) 

danach laufe ich die oben hinzufügen könnte tensorflow graph

init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

n_rounds = 100 
batch_size = min(500, n_samp) 
for i in range(100): 
    sample = np.random.randint(n_samp, size=batch_size) 
    batch_xs = input_data[sample][:] 
    batch_ys = output_data_ae[sample][:] 
    sess.run(train_step, feed_dict={x: batch_xs, ae_y_actual:batch_ys}) 

Above ist der Code für eine 4-Schicht Autoencoder verwenden,"meansq" ist mein squared Verlust Funkt Ion. Wie kann ich die L1-Regularisierung für die Gewichtsmatrix (Tensoren) im Netzwerk hinzufügen?

+0

L1 kann mit Summen- und Absoperatoren implementiert werden, die beide im Tensorflow (einschließlich ihrer Gradienten) existieren –

+7

'0.001 * tf.reduce_sum (tf.abs (Parameter))' gibt Ihnen die L1-Norm Ihres Parametervektors (könnte technisch ein höherer Rang Tensor in diesem Fall sein, so bestrafen Sie Ihr Lernen durch die –

+0

Vielen Dank + yaroslav. Also für meinen Fall, sollte es wie meansq = tf.reduce_mean (tf.square (ae_y_actual - ae_y_pred)) (?) + 0,001 * tf.reduce_sum (tf.abs (ae_Wh1)) + 0,001 * tf. reduce_sum (tf.abs (ae_Wh1)) Bin ich richtig? – Abhishek

Antwort

2

Sie können TensorFlow apply_regularization und l1_regularizer Methoden verwenden.

Ein Beispiel auf Ihrer Frage zugrunde:

import tensorflow as tf 

total_loss = meansq #or other loss calcuation 
l1_regularizer = tf.contrib.layers.l1_regularizer(
    scale=0.005, scope=None 
) 
weights = tf.trainable_variables() # all vars of your graph 
regularization_penalty = tf.contrib.layers.apply_regularization(l1_regularizer, weights) 

regularized_loss = total_loss + regularization_penalty # this loss needs to be minimized 
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(regularized_loss) 

Hinweis: weights ist ein list wobei jeder Eintrag ein tf.Variable ist.

+2

ist tf.trainable_variables() auch inklusive Vorurteile ?? – Shaowu

+0

sollte es sein. tf.trainable_variables() gibt eine Liste von Variablen zurück, so dass Sie über sie iterieren können, um zu sehen, ob die Variable tatsächlich da ist. (Siehe https://www.tensorflow.org/programs_guide/variables) – bruThaler

+0

Der Grund, warum ich frage, ist, dass Menschen normalerweise nicht regularisieren, wie Sie in vielen Zeitungen sehen, einfach Gewicht ist, was regularisiert wird. – Shaowu

0

Sie können auch tf.slim.l1_regularizer() von slim losses verwenden.

+0

Ihre Antwort könnte hilfreicher sein, wenn Sie ein kleines Codebeispiel hinzufügen –