在每个时期,使用MNIST数据进行分类的损失几乎保持不变

时间:2018-11-06 16:10:05

标签: python tensorflow mnist

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))

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

我似乎无法在这里找到问题所在,我们将不胜感激。

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

3 个答案:

答案 0 :(得分:0)

这里有几个问题:

  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))
    

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

好一点的调整就可以解决问题,我改用RMSPropOptimizer,损耗开始按预期减少。

我仍然需要弄清楚为什么它可行,我仍在学习,但是现在这是我所拥有的解决方案。

尽管损失减少得非常缓慢。