2017-01-29 2 views
5

Я новичок в Tensorflow и задавался вопросом, можно ли свести к минимуму функцию одной переменной с помощью Tensorflow.Минимизировать функцию одной переменной в Tensorflow

Например, можно использовать Tensorflow для минимизации 2 * x^2 - 5^x + 4 с использованием начального предположения (скажем, x = 1)?

Я пытаюсь следующее:

import tensorflow as tf 
import numpy as np 

X = tf.placeholder(tf.float32, shape =()) 
xvar = tf.Variable(np.random.randn())  
f = 2*mul(X,X) - 5*X + 4 

opt = tf.train.GradientDescentOptimizer(0.5).minimize(f) 

with tf.Session() as sess: 
    tf.global_variables_initializer().run() 
    y = sess.run(opt, feed_dict = {X : 5.0}) #initial guess = 5.0 
    print(y) 

Но это дает следующее сообщение об ошибке:

ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables 

Пожалуйста, помогите мне понять, что я делаю неправильно здесь.

ответ

11

Если вы хотите свести к минимуму один параметр, вы можете сделать следующее (я избегал использования заполнителя, так как вы пытаетесь подготовить параметр - заполнители часто используются для гиперпараметров и ввода и не считаются обучаемыми параметры):

import tensorflow as tf 

x = tf.Variable(10.0, trainable=True) 
f_x = 2 * x* x - 5 *x + 4 

loss = f_x 
opt = tf.train.GradientDescentOptimizer(0.1).minimize(f_x) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in range(100): 
     print(sess.run([x,loss])) 
     sess.run(opt) 

Это выведет следующий список пар (х, потеря):

[10.0, 154.0] 
[6.5, 56.0] 
[4.4000001, 20.720001] 
[3.1400001, 8.0192013] 
[2.3840001, 3.4469128] 
[1.9304, 1.8008881] 
[1.65824, 1.2083197] 
[1.494944, 0.99499512] 
[1.3969663, 0.91819811] 
[1.3381798, 0.89055157] 
[1.3029079, 0.88059855] 
[1.2817447, 0.87701511] 
[1.2690468, 0.87572551] 
[1.2614281, 0.87526155] 
[1.2568569, 0.87509394] 
[1.2541142, 0.87503386] 
[1.2524685, 0.87501216] 
[1.2514811, 0.87500429] 
[1.2508886, 0.87500143] 
[1.2505331, 0.87500048] 
[1.2503198, 0.875] 
[1.2501919, 0.87500024] 
[1.2501152, 0.87499976] 
[1.2500691, 0.875] 
[1.2500415, 0.875] 
[1.2500249, 0.87500024] 
[1.2500149, 0.87500024] 
[1.2500089, 0.875] 
[1.2500054, 0.87500024] 
[1.2500032, 0.875] 
[1.2500019, 0.875] 
[1.2500012, 0.87500024] 
[1.2500007, 0.87499976] 
[1.2500005, 0.875] 
[1.2500002, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
[1.2500001, 0.87500024] 
+0

Это хорошо, просто чтобы понять, что функция потерь сама оптимизированная функция. –