Нейронная сеть Tensorflow не оптимизируется должным образом - PullRequest
0 голосов
/ 17 октября 2019

Я новичок в нейронных сетях и TensorFlow, я попробовал следующий код для классификации рукописных цифр (модель однослойного персептрона)

Я скачал набор данных из kaggle, который содержит первый столбец в качестве цифрыи следующие 784 столбца значения пикселей.

    import tensorflow as tf
    import numpy as np
    import pandas as pd
    from PIL import Image

    tr = open("train.csv","r")

    tr_cont=tr.read()
    tr_cont=tr_cont.split("\n")
    tr_cont = tr_cont[1:]
    train_in=[]
    train_out=[]

    for inp in tr_cont:
        data = inp.split(",")
        num = [0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0]   #to identify the digit

        num[int(data[0])] = 1   #data[0] is the digit label
        train_out.append(num)
        train_in.append(data[1:])   #these are the pixel values

    x = tf.placeholder(tf.float32 , [None , 784])
    y = tf.placeholder(tf.float32 , [None , 10])

    w = tf.Variable(tf.random_normal([784,10])) #weights
    b = tf.Variable(tf.random_normal([10]))  #biases

    output = tf.nn.relu(tf.add(tf.matmul(x,w),b))

    loss = tf.reduce_sum(tf.square(output-y))

    opt = tf.train.GradientDescentOptimizer(0.3)
    train_m = opt.minimize(loss)

    init = tf.global_variables_initializer()
    sess = tf.Session()
    sess.run(init)

    for i in range(100):
        sess.run(train_m , {x : train_in , y : train_out})
        cost = sess.run(loss,feed_dict={x : train_in , y : train_out})
        print(i,"  ",cost)

Вывод всегда показывает:

0 42000.0

1 42000.0

2 42000.0

3 42000.0

4 42000.0

5 42000.0

6 42000.0

7 42000.0

8 42000.0

9 42000.0

10 42000.0

. ,,etc

Итак, я предполагаю, что нейронные сети не работают.

Я пробовал скорость обучения 0,01, 0,2, 0,3, но она показывает тот же результат.

Что здесь не так?

Нужно ли добавлять скрытые слои?

РЕДАКТИРОВАТЬ: Я также пытался получить вывод для тестовых образцов. Он показывает одинаковый вывод для каждого тестового образца:

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

1 Ответ

0 голосов
/ 18 октября 2019

Проблема была вызвана, потому что значения пикселей не были нормализованы. Нормализация подходит, потому что алгоритмы оптимизации работают лучше, если входные данные находятся в некотором подходящем диапазоне 0-1, например. Для значений пикселей достаточно деления на 255.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...