python - 使用TensorFlow創建邏輯回歸模型訓練結果為nan
問題描述
在TensorFlow中,我想創建一個邏輯回歸模型,代價函數如下:
使用的數據集截圖如下:
我的代碼如下:
train_X = train_data[:, :-1]train_y = train_data[:, -1:]feature_num = len(train_X[0])sample_num = len(train_X)print('Size of train_X: {}x{}'.format(sample_num, feature_num))print('Size of train_y: {}x{}'.format(len(train_y), len(train_y[0])))X = tf.placeholder(tf.float32)y = tf.placeholder(tf.float32)W = tf.Variable(tf.zeros([feature_num, 1]))b = tf.Variable([-.3])db = tf.matmul(X, tf.reshape(W, [-1, 1])) + bhyp = tf.sigmoid(db)cost0 = y * tf.log(hyp)cost1 = (1 - y) * tf.log(1 - hyp)cost = (cost0 + cost1) / -sample_numloss = tf.reduce_sum(cost)optimizer = tf.train.GradientDescentOptimizer(0.1)train = optimizer.minimize(loss)init = tf.global_variables_initializer()sess = tf.Session()sess.run(init)print(0, sess.run(W).flatten(), sess.run(b).flatten())sess.run(train, {X: train_X, y: train_y})print(1, sess.run(W).flatten(), sess.run(b).flatten())sess.run(train, {X: train_X, y: train_y})print(2, sess.run(W).flatten(), sess.run(b).flatten())
運行結果截圖如下:
可以看到,在迭代兩次之后,得到的W和b都變成了nan,請問是哪里的問題?
問題解答
回答1:經過一番搜索,找到了問題所在。
在選取迭代方式的那一句:
optimizer = tf.train.GradientDescentOptimizer(0.1)
這里0.1的學習率過大,導致不知什么原因在損失函數中出現了log(0)的情況,結果導致了損失函數的值為nan,解決方法是減小學習率,比如降到1e-5或者1e-6就可以正常訓練了,我根據自己的情況把學習率調整為了1e-3,程序完美運行。
附上最終擬合結果:
相關文章:
1. css - 移動端 oppo 手機之 Border-radius2. node.js - Nodejs微信開發,視頻上傳成功,但是不返回給用戶3. javascript - 為什么我的vue里的router-link不起作用4. javascript - gulp 使用 testAutoFx 添加前綴后,再使用gulp-minify-css壓縮文件,無法正常壓縮5. javascript - vue.js 在main.js里寫的方法 頁面刷新方法變無效 怎么寫一個全局的方法不管怎么刷新都一直在6. a標簽跨域下載文件能否重命名?7. android - weex 項目createInstanceReferenceError: Vue is not defined8. javascript - 如圖,百度首頁,查看源代碼為什么什么都沒有?9. android - 哪位大神知道java后臺的api接口的對象傳到前端后輸入日期報錯,是什么情況?求大神指點10. pdo 寫入到數據庫的內容為中文的時候寫入亂碼
