#python #tensorflow #neural-network #nan
#python #тензорный поток #нейронная сеть #nan
Вопрос:
Я пытаюсь установить нейронную сеть с несколькими слоями, которая решит простую задачу регрессии, которая должна быть f (x) = 0,1x или f (x) = 10x
Весь код показан ниже (генерация данных и нейронная сеть)
- 4 полностью связанных слоя с ReLU
- функция потерь RMSE
- градиент обучения нарастает
проблема в том, что после того, как я ее запускаю, функция вывода и потерь превращается в значение NaN:
- эпоха: 0, оптимизатор: нет, потеря: inf
- эпоха: 1, оптимизатор: нет, потеря: nan
И выходной уровень: [NaN, NaN, NaN, ….. , NaN]
Я новичок в tensorflow, и я не уверен, что я могу делать неправильно (плохо реализовать следующую партию, обучение, реализацию сеанса)
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:
Вам необходимо нормализовать свои данные, потому что ваши градиенты и, как следствие 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
до бесконечности. Используйте нормализованные данные, уменьшите скорость обучения или уменьшите размер пакета, чтобы заставить его работать.
Комментарии:
1. Спасибо, помогли как корректировка даты обучения, так и подготовка данных. Когда я генерировал данные случайным образом, вместо этого постепенно функция потери нейронной сети перестала искать inf и начала искать локальные минимумы. Большое спасибо!
2. Отлично, рад слышать. Подумайте о том, чтобы нажать кнопку «Принять мой ответ», если это помогло
3. Я сделал, потому что я новичок и у меня низкий идентификатор репутации, который не отображается