MNIST手寫數字分類:像素歸一化后準確率低,問題出在哪兒?

MNIST手寫數字分類:像素歸一化后準確率低,問題出在哪兒?

tensorflow MNIST分類:像素歸一化后準確率低的原因及解決方案

在使用TensorFlow進行MNIST手寫數字分類時,許多開發者可能會遇到一個難題:對數據集進行像素歸一化處理后,模型訓練準確率卻異常低。本文將結合代碼示例,深入分析此問題并提供解決方案。

問題根源在于對tf.nn.softmax_cross_entropy_with_logits函數的誤用。原始代碼中,預測值y_pred使用了tf.nn.softmax函數進行softmax概率計算:

y_pred = tf.nn.softmax(tf.matmul(x, w) + b)

然而,tf.nn.softmax_cross_entropy_with_logits函數期望輸入的是線性輸出(logits),而不是softmax概率。 將已進行softmax轉換的y_pred傳入該函數計算損失,導致了損失函數計算錯誤,進而影響模型訓練效果。

解決方案:

關鍵在于修改y_pred的計算方式,移除tf.nn.softmax函數:

y_pred = tf.matmul(x, w) + b

同時,在計算準確率時,需要對y_pred應用tf.nn.softmax函數以獲得概率分布,以便與真實標簽進行比較:

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(tf.nn.softmax(y_pred), 1))

修改后的代碼片段如下(假設部分代碼已存在):

# ... (導入包和設置超參數的代碼部分保持不變)  # 下載數據集 mnist = input_data.read_data_sets('original_data/', one_hot=True)  train_img = mnist.train.images train_label = mnist.train.labels test_img = mnist.test.images test_label = mnist.test.labels train_img /= 255.0 test_img /= 255.0  X = tf.compat.v1.placeholder(tf.float32, shape=[None, inputSize]) y = tf.compat.v1.placeholder(tf.float32, shape=[None, numClasses]) W = tf.Variable(tf.random_normal([inputSize, numClasses], stddev=0.1)) B = tf.Variable(tf.constant(0.1), [numClasses]) y_pred = tf.matmul(X, W) + B  # 修改:移除softmax  loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_pred)) + 0.01 * tf.nn.l2_loss(W) opt = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)  correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(tf.nn.softmax(y_pred), 1)) # 修改:在計算準確率時應用softmax accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  saver = tf.train.Saver() multiclass_parameters = {}  # ... (運行代碼部分保持不變)

通過以上調整,tf.nn.softmax_cross_entropy_with_logits函數將接收正確的線性輸出,計算出正確的損失值,從而使模型有效訓練并獲得更高的準確率。 這再次強調了正確理解和使用TensorFlow函數對于構建高效深度學習模型的重要性。

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享