2017-11-06 4 views
1

Tensorflowを勉強していて、いくつか問題がありました。 2x+2z-3t=y(a = 2、b = 2、c = -3の場合はa、b、cの値を取得する)を近似しようとしているが、動作しない場合の損失関数を最小にしたい。私のミスはどこですか?テンソルフロープログラムが変数にスタックしました

これが私の出力です:

a: [ 0.51013279] b: [ 0.51013279] c: [ 1.00953674] loss: 2.72952e+10 

私が必要:2 B:2 C:-3と0

import tensorflow as tf 
import numpy as np 

a = tf.Variable([1], dtype=tf.float32) 
b = tf.Variable([1], dtype=tf.float32) 
c = tf.Variable([0], dtype=tf.float32) 

x = tf.placeholder(tf.float32) 
z = tf.placeholder(tf.float32) 
t = tf.placeholder(tf.float32) 
linear_model = a * x + b * z + c * t 
y = tf.placeholder(tf.float32) 

loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares 

optimizer = tf.train.GradientDescentOptimizer(0.01) 
train = optimizer.minimize(loss) 

x_train = np.arange(0, 5000, 1) 
z_train = np.arange(0, 10000, 2) 
t_train = np.arange(0, 5000, 1) 
y_train = list(map(lambda x, z, t: 2 * x + 2 * z - 3 * t, x_train, z_train, 
t_train)) 

init = tf.global_variables_initializer() 
sess = tf.Session() 
sess.run(init) 
for i in range(10000): 
sess.run(train, {x: x_train, z: z_train, t: t_train, y: y_train}) 

curr_a, curr_b, curr_c, curr_loss = sess.run([a, b, c, loss], {x: x_train, 
z: z_train, t: t_train, y: y_train}) 
print("a: %s b: %s c: %s loss: %s" % (curr_a, curr_b, curr_c, curr_loss)) 

に近い損失私はの値を確認するためにマキシムのコードを少し変更しました、Bは、次のようにC:

_, loss_val, curr_a, curr_b, curr_c, model_val = sess.run([optimizer, 
loss,a, b, c, linear model],   {x: x_train, z: z_train, t: t_train, 
y: y_train}) 

をだから私の出力は、次のとおりです。

10 2.04454e-11 1.83333 0.666667 -0.166667

20 2.04454e-11 1.83333 0.666667 -0.166667

30 2.04454e-11 1.83333 0.666667 -0.166667

I = 2、B = 2を期待、c = -3

答えて

0

まず、単一の解は存在しないため、オプティマイザはローカルミニマムのいずれかに収束することができます。正確な値は、変数の初期化に大きく依存します。

あなたのバグに関する短い回答:は、学習率に注意してください。 - 10回の未満の繰り返しで、あなたがそれを実行した場合、あなたはそれが非常に高速に収束することに気づくでしょう

a = tf.Variable(2, dtype=tf.float32) 
b = tf.Variable(1, dtype=tf.float32) 
c = tf.Variable(0, dtype=tf.float32) 

x = tf.placeholder(shape=[None, 1], dtype=tf.float32) 
z = tf.placeholder(shape=[None, 1], dtype=tf.float32) 
t = tf.placeholder(shape=[None, 1], dtype=tf.float32) 
y = tf.placeholder(shape=[None, 1], dtype=tf.float32) 

linear_model = a * x + b * z + c * t 
loss = tf.reduce_mean(tf.square(linear_model - y)) # sum of the squares 
optimizer = tf.train.GradientDescentOptimizer(0.0001).minimize(loss) 

n = 50 
x_train = np.arange(0, n, 1).reshape([-1, 1]) 
z_train = np.arange(0, 2*n, 2).reshape([-1, 1]) 
t_train = np.arange(0, n, 1).reshape([-1, 1]) 
y_train = np.array(map(lambda x, z, t: 2 * x + 2 * z - 3 * t, x_train, z_train, t_train)).reshape([-1, 1]) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

    for i in range(101): 
    _, loss_val = sess.run([optimizer, loss], {x: x_train, z: z_train, t: t_train, y: y_train}) 
    if i % 10 == 0: 
     a_val, b_val, c_val = sess.run([a, b, c]) 
     print('iteration %2i, loss=%f a=%.5f b=%.5f c=%.5f' % (i, loss_val, a_val, b_val, c_val)) 

:あなたのコードの私のバージョンをチェックアウト。ただし、n50から75に増やすと、モデルが分岐します。しかし、学習率を下げると0.00001は、それほど速くはありませんが、再び収束します。オプティマイザに送るデータが多いほど、適切な学習率が重要になります。

あなたは試したことがあります5000トレーニングのサイズ:一度に多くのポイントを正しく処理するには学習率がどれほど小さいかをイメージすることすらできません。

+0

しかし、値が近いa = 2、b = 2、c = -3 私はこのようなものを取得する必要があると思った –

+0

@СтаниславКитаевは私の答えを参照してください:多くのローカルミニマがあります。見つかったa、b、cは、データをほぼ完全に適合させます。それらを別々に初期化すると、別の解決策が得られます。 – Maxim

+0

もう一度質問にお答えしますか? 変数に力を加えて(x^2 ...など)この関数を変更できますか? –

関連する問題