2017-12-31 54 views
0

ich tensorflow bin mit einem einfachen kleinsten Quadrate Zielfunktion wie folgt zu optimieren:Add Custom Regularisierung Tensorflow

enter image description here

Hier Y ist der Zielvektor, X ist die Eingangsmatrix und Vektor w darstellt die zu lernenden Gewichte.

Beispielszenario:

enter image description here, enter image description here, enter image description here

Wenn ich die anfängliche Zielfunktion aufzuzwingen eine zusätzliche Einschränkung für w1 (der erste skalare Wert im tensorflow Variable w und X1 stellt die vermehren wollte erste Spalte der Feature-Matrix X), wie würde ich dies im Tensorflow erreichen?

enter image description here

Eine Lösung, die ich denken kann, ist tf.slice indizieren den ersten Wert von $ w $ zu verwenden und diese auf den ursprünglichen Kosten Begriff zusätzlich hinzufügen, aber ich bin nicht davon überzeugt, dass es das haben gewünschte Wirkung auf die Gewichte.

Ich würde gerne Eingaben darüber, ob so etwas in Tensorflow möglich ist, und wenn ja, was die besten Möglichkeiten, dies zu implementieren, wäre?

Eine alternative Option wäre, Gewichtsbeschränkungen hinzuzufügen, und zwar mit einem vergrößerten Lagrange-Objektiv, aber ich möchte zuerst die Regularisierungsoption untersuchen, bevor ich die Lagrange-Route beginne.

Der aktuelle Code, den ich für die erste Zielfunktion ohne zusätzliche Regularisierung haben, ist die folgende:

train_x ,train_y are the training data, training targets respectively. 
test_x , test_y are the testing data, testing targets respectively. 

#Sum of Squared Errs. Cost. 
def costfunc(predicted,actual): 
    return tf.reduce_sum(tf.square(predicted - actual)) 

#Mean Squared Error Calc. 
def prediction(sess,X,y_,test_x,test_y): 
    pred_y = sess.run(y_,feed_dict={X:test_x}) 
    mymse = tf.reduce_mean(tf.square(pred_y - test_y)) 
    mseval=sess.run(mymse) 

    return mseval,pred_y 


with tf.Session() as sess: 

    X = tf.placeholder(tf.float32,[None,num_feat]) #Training Data 
    Y = tf.placeholder(tf.float32,[None,1]) # Target Values 
    W = tf.Variable(tf.ones([num_feat,1]),name="weights") 

    init = tf.global_variables_initializer() 

    sess.run(init) 

    #Tensorflow ops and cost function definitions. 
    y_ = tf.matmul(X,W) 
    cost_history = np.empty(shape=[1],dtype=float) 
    out_of_sample_cost_history = np.empty(shape=[1],dtype=float) 
    cost=costfunc(y_,Y) 
    learning_rate = 0.000001 
    training_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 


    for epoch in range(training_epochs): 
     sess.run(training_step,feed_dict={X:train_x,Y:train_y}) 
     cost_history = np.append(cost_history,sess.run(cost,feed_dict={X: train_x,Y: train_y})) 
     out_of_sample_cost_history = np.append(out_of_sample_cost_history,sess.run(cost,feed_dict={X:test_x,Y:test_y})) 


    MSETest,pred_test = prediction(sess,X,y_,test_x,test_y) #Predict on full testing set. 

Antwort

0

tf.slice tun. Und während der Optimierung werden die Gradienten zu w1 hinzugefügt (weil sich Gradienten an den Gabeln addieren). Überprüfen Sie auch die Grafik auf Tensorboard (die link auf wie man es benutzt).

Verwandte Themen