2017-10-16 22 views
2

我想通過玩弄線性迴歸算法來熟悉TensorFlow,並使用源自此處的源代碼https://web.stanford.edu/class/cs20si/syllabus.html,文件名爲03_linear_regression_sol.py使用tf.Variable()和tf.get_variable()時的不同結果

定義的模型是Y_predicted = X * w + b,其中

  1. wb是參數
  2. Y_predictedX正在訓練數據

對於wb,在示例代碼它們被定義爲以下

w = tf.Variable(0.0, name='weights') 
b = tf.Variable(0.0, name='bias') 

我改變了這兩行代碼有點如下

w = tf.get_variable('weights', [], dtype=tf.float32) 
b = tf.get_variable('bias', [], dtype=tf.float32) 

然而,total_loss/n_samples爲完成訓練階段後,這兩個版本是不同的。更具體地說,就原始版本而言,我隨時獲得確定性結果1539.0050282141283。但是,作爲修改後的版本,我得到了不同的運行時間undeterministic的結果,例如,total_loss/n_samples可能是1531.30397938688591526.3752814714044,...等

我的問題是

  1. 的是什麼錯我的代碼,修改後的版本?
  2. 如果不是,爲什麼?

回答

3

tf.Variable接受創建時的初始值(常量),這解釋了使用它時的確定性結果。

tf.get_variable略有不同:它有一個initializer參數,默認情況下None,其被這樣解釋:

如果initializerNone(缺省值),在可變範圍通過的默認初始值將是用過的。如果那個也是None,則會使用glorot_uniform_initializer

由於您沒有通過初始化程序,變量得到了統一的隨機初始值。

+0

在執行階段,我已經爲這兩個版本準備了一行代碼'sess.run(tf.global_variables_initializer())'。我認爲這一行承擔了初始化變量的責任,不是嗎?無論如何,在爲變量添加初始化程序後,'w = tf.get_variable('weights',[],dtype = tf.float32,initializer = tf.zeros_initializer)'和'b = tf.get_variable('bias',[]] ,dtype = tf.float32,initializer = tf.zeros_initializer) ',我得到了確定性的值!大! –

+0

是的,這一行 - 'sess.run(tf.global_variables_initializer())' - 爲所有變量運行初始值設定項。結果歸結爲這些初始化程序是恆定的還是隨機的。 – Maxim