python - 第一个 epoch 后的神经网络生成 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
解决方案
您需要标准化您的数据,因为您的梯度,因此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
达到无穷大。使用归一化数据,降低学习率或减少批量大小以使其工作。
推荐阅读
- android - 如何在 Android 中获取 API 数据
- printf - 使用 printf()(Julia 中的 @printf)打印一个以“0”为底的指数。
- maven - 如何在 Maven 依赖项中引用文件?
- node.js - MongoDB:创建一个单独的集合/模式,其中每个项目都是一个数组,而不是一个对象
- python - 如何在pygame中使一个圆从一个角斜向另一个角移动
- reactjs - 无法从 api 获取数据
- javascript - 将对象推送到数组时,新对象显示为 [[object],[object],[object]] 而不是 [object, object, object]
- php - 用点连接字符串等于
- julia - Julia中的python“as”等价物
- html - 将打字稿参数传递给 html 文件中的 (click) 方法