Потери для классификации с использованием данных MNIST остаются одинаковыми во все эпохи - PullRequest
0 голосов
/ 06 ноября 2018
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 голосов
/ 08 ноября 2018

Хорошо, один маленький трюк сделал свое дело, вместо этого я использовал RMSPropOptimizer, и потери начали уменьшаться, как и ожидалось.

Мне все еще нужно выяснить, почему это работает, я все еще учусь, но сейчас это решение, которое у меня есть.

Хотя потеря уменьшается очень медленно.

0 голосов
/ 09 ноября 2018

Инициализация весов со стандартным отклонением (2.0/neurons_in_prev_layer)**0.5 для меня сработала! Также изменены скрытые слои на 2 скрытых слоя по 256, 256 нейронов.

0 голосов
/ 06 ноября 2018

Здесь есть несколько проблем:

  1. Вы бежите sess.run(init_op) каждую эпоху. Это означает, что параметры модели сбрасываются на случайные числа каждую эпоху, и, следовательно, не смогут учиться. Попробуйте поставить этот оператор до for epoch in range(1000)
  2. Вы создаете новую сессию каждую эпоху. Измените свой код так, чтобы он выглядел так:

    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))
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...