Нейронная сеть после первой эпохи генерирует значения NaN в качестве выхода, потери - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь установить нейронную сеть с несколькими слоями, которые решат простую проблему регрессии f (x) = 0,1x или f (x) = 10x

Весь код показан ниже (генерация данных и нейронная сеть)

  • 4 полностью связанных слоя с ReLu
  • функция потерь RMSE
  • обучение GradientDescent

проблема в том, что после того, как я его запустил, функция вывода и потерь превращается в значение NaN:

  • эпоха: 0, оптимизатор: нет, потеря: inf
  • эпоха: 1, оптимизатор: нет, потери: nan

и выходной слой: [NaN, NaN, NaN, ....., NaN]

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

import tensorflow as tf
import sys
import numpy

#prepraring input data -> X
learningTestData = numpy.arange(1427456).reshape(1394,1024)

#preparing output data -> f(X) =0.1X
outputData = numpy.arange(1427456).reshape(1394,1024)

xx = outputData.shape
dd = 0
while dd < xx[0]:
    jj = 0
    while jj < xx[1]:
        outputData[dd,jj] = outputData[dd,jj] / 10
        jj += 1
    dd += 1

#preparing the NN
x = tf.placeholder(tf.float32, shape=[None, 1024])
y = tf.placeholder(tf.float32, shape=[None, 1024])

full1 = tf.contrib.layers.fully_connected(inputs=x, num_outputs=1024, activation_fn=tf.nn.relu)
full1 = tf.layers.batch_normalization(full1)

full2 = tf.contrib.layers.fully_connected(inputs=full1, num_outputs=5000, activation_fn=tf.nn.relu)
full2 = tf.layers.batch_normalization(full2)

full3 = tf.contrib.layers.fully_connected(inputs=full2, num_outputs=2500, activation_fn=tf.nn.relu)
full3 = tf.layers.batch_normalization(full3)

full4 = tf.contrib.layers.fully_connected(inputs=full3, num_outputs=1024, activation_fn=tf.nn.relu)
full4 = tf.layers.batch_normalization(full4)


out = tf.contrib.layers.fully_connected(inputs=full4, num_outputs=1024, activation_fn=None)


epochs = 20
batch_size = 50
learning_rate = 0.001
batchOffset = 0

# Loss (RMSE) and Optimizer
cost = tf.losses.mean_squared_error(labels=y, predictions=out)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)


with tf.Session() as sess:
    # Initializing the variables
    sess.run(tf.global_variables_initializer())

    e = 0

    while e < epochs:

        #selecting next batch
        sb = batchOffset
        eb = batchOffset+batch_size
        x_batch = learningTestData[sb:eb, :]
        y_batch = outputData[sb:eb, :]

        #learn
        opt = sess.run(optimizer,feed_dict={x: x_batch, y: y_batch})
        #show RMSE
        c = sess.run(cost, feed_dict={x: x_batch, y: y_batch})
        print("epoch: {}, optimizer: {}, loss: {}".format(e, opt, c))

        batchOffset += batch_size
        e += 1

1 Ответ

1 голос
/ 16 апреля 2019

Вам необходимо нормализовать ваши данные, потому что ваши градиенты, и в результате cost, взрываются.Попробуйте запустить этот код:

learning_rate = 0.00000001
x_batch = learningTestData[:10]
y_batch = outputData[:10]
with tf.Session() as sess:
    # Initializing the variables
    sess.run(tf.global_variables_initializer())
    opt = sess.run(optimizer,feed_dict={x: x_batch, y: y_batch})

    c = sess.run(cost, feed_dict={x: x_batch, y: y_batch})
    print(c) # 531492.3

В этом случае вы получите конечные значения, потому что градиенты не взяли cost в бесконечность.Используйте нормализованные данные, уменьшите скорость обучения или уменьшите размер пакета, чтобы он работал.

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