2017-12-29 12 views
0
import tensorflow as tf 
import numpy as np 

#date generation 
x_data = np.float32(np.random.rand(2, 100)) 
y_data = np.dot([0.1, 0.2], x_data) + 0.3 

#linear model 
b = tf.Variable(tf.zeros([1])) 
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0)) 
y = tf.matmul(W, x_data) + b 

#minimize variance 
loss = tf.reduce_sum(tf.square(y - y_data)) #why I cannot use sum here 
optimizer = tf.train.GradientDescentOptimizer(0.01) 
train = optimizer.minimize(loss) 

#initialization 
init = tf.global_variables_initializer() 

#graph initialization 
sess = tf.Session() 
sess.run(init) 

#train network 
for step in range(201): 
sess.run(train) 
#if step % 20 == 0: 
print(step, sess.run(W), sess.run(b), sess.run(loss)) 

こんにちはtensorflowを使っておもちゃのモデルを実現しながら、私が問題に会いました。 tf.reduce_sum()を損失関数として使用した場合、オプティマイザは収束できませんでした。実際、損失は大きくなりました。しかし、私がからtf.reduce_sum()からtf.reduce_mean()に変更すると、オプティマイザは正常に動作しました。誰もが理由を教えてくださいtf.reduce_sum()はこのモデルでは機能しませんが、tf.reduce_mean()はどうしますか?(tf.reduce_sumを使用して最適化することはできません)が、(tf.reduce_mean使用して成功した)

答えて

2

すべてのサンプルを一度に合計することによる損失は、平均損失以上です。例えば

のは、次の行で、その後私たちの希望y_data = [1.2、3.2、2.4]こととy =予測[1、3、3]

てみましょう:

tf.reduce_sum(tf.square(y - y_data)) 

損失うであることが判明:

0.04 + 0.04 + 0.36 = 0.44

Insteaあなたはこのような場合には、低損失でつながる同じ予測を意味減らす使用する場合D

だから、あなたの勾配とパラメータの更新も大きくなっている

0.44/3 = 0.14666あなたはreduce_sumスキップを使用する場合可能な極小値。

バッチ処理でも同じ効果を得たい場合は、学習率をバッチサイズで除算してモデルを訓練するか、reduce_meanを使用してモデルを訓練する必要がある場合は、オプティマイザでの学習率が失われます。

関連する問題