使用 MNIST 数据进行分类的损失在每个时期都保持大致相同

Loss for classification using MNIST data stays around the same through every epoch

import numpy as np
import tensorflow as tf
import pandas as pd
data = pd.read_csv('mnist_train.csv')
X = data.drop('label', axis=1).values
y = data['label'].values
with tf.Session() as sess:
    Y = tf.one_hot(y, 10).eval()
hidden  = [5, 4, 3]

def costa(y, yhat):
    loss = tf.nn.softmax_cross_entropy_with_logits_v2(logits=yhat, labels=y)
    loss = tf.reduce_sum(loss)
    return loss

def train(cost):
    train_op = tf.train.GradientDescentOptimizer(0.0001).minimize(cost)
    return train_op

with tf.Graph().as_default():
    X1 = tf.placeholder(tf.float32, [None, 784])
    y1 = tf.placeholder(tf.float32, [None, 10])
    w1 = tf.Variable(tf.random_normal((784, hidden[0])))
    w2 = tf.Variable(tf.random_normal((hidden[0], hidden[1])))
    w3 = tf.Variable(tf.random_normal((hidden[1], hidden[2])))
    wo = tf.Variable(tf.random_normal((hidden[2], 10)))
    b1 = tf.Variable(tf.random_normal((1, hidden[0])))
    b2 = tf.Variable(tf.random_normal((1, hidden[1])))
    b3 = tf.Variable(tf.random_normal((1, hidden[2])))
    bo = tf.Variable(tf.random_normal((1, 10)))
    layer1 = tf.nn.relu(tf.matmul(X1, w1) + b1)
    layer2 = tf.nn.relu(tf.matmul(layer1, w2) + b2)
    layer3 = tf.nn.relu(tf.matmul(layer2, w3) + b3)
    layerout = (tf.matmul(layer3, wo) + bo)
    yhat = layerout
    cost = costa(y1, yhat)
    train_op = train(cost)
    init_op = tf.global_variables_initializer()
    for epoch in range(1000):

        with tf.Session() as sess:
            sess.run(init_op)
            sess.run(train_op, feed_dict={X1:X, y1:Y})
            loss = sess.run(cost, feed_dict={X1:X, y1:Y})
            print("Loss for epoch {}: {}".format(epoch, loss))

损失基本保持不变,上下跳动很多,但并没有相应减少。

我似乎找不到这里出了什么问题,我们将不胜感激。

是对层的激活还是我弄错了成本函数?

这里有几个问题:

  1. 你每个时代都是运行sess.run(init_op)。这意味着模型参数在每个时期都被重置为随机数,因此将无法学习。尝试将此操作放在 for epoch in range(1000)
  2. 之前
  3. 您每个时期都在创建一个新会话。更改您的代码,使其看起来像这样:

    with tf.Session() as sess:
        sess.run(init_op)
    
        for epoch in range(1000):
            sess.run(train_op, feed_dict={X1:X, y1:Y})
            loss = sess.run(cost, feed_dict={X1:X, y1:Y})
            print("Loss for epoch {}: {}".format(epoch, loss))
    

好吧,稍微调整一下就成功了,我改为使用 RMSPropOptimizer,损失开始按预期减少。

我仍然需要弄清楚为什么会这样,我还在学习,但现在这是我的解决方案。

虽然损失减少的很慢。

(2.0/neurons_in_prev_layer)**0.5 的标准偏差初始化权重对我来说就像一个魅力! 还将隐藏层更改为 2 个隐藏层 256 个 256 个神经元。