Python tensorflow优化器输出nan,即使我将学习速率设置为尽可能小
下面是代码Python tensorflow优化器输出nan,即使我将学习速率设置为尽可能小,python,tensorflow,optimization,Python,Tensorflow,Optimization,下面是代码 def create_train_model(hidden_nodes,num_iters): tf.reset_default_graph() X=tf.placeholder(shape=(120,4),dtype=tf.float64,name='X') y=tf.placeholder(shape=(120,1),dtype=tf.float64,name='y') W1=tf.Variable(np.random.rand(4,hidden_
def create_train_model(hidden_nodes,num_iters):
tf.reset_default_graph()
X=tf.placeholder(shape=(120,4),dtype=tf.float64,name='X')
y=tf.placeholder(shape=(120,1),dtype=tf.float64,name='y')
W1=tf.Variable(np.random.rand(4,hidden_nodes),dtype=tf.float64)
W2=tf.Variable(np.random.rand(hidden_nodes,2),dtype=tf.float64)
A1=tf.sigmoid(tf.matmul(X,W1))
U_est=tf.sigmoid(tf.matmul(A1,W2))
loss=fuloss3(U_est,y)
optimizer=tf.train.AdagradOptimizer(4.9406564584124654e-324)
TRAIN=optimizer.minimize(loss)
init=tf.initialize_all_variables()
sess=tf.Session()
sess.run(init)
for i in range(num_iters):
pout=sess.run(loss,feed_dict={X: Xtrain,
y: ytrain})
sess.run(TRAIN,feed_dict={X: Xtrain,
y: ytrain})
loss_plot[hidden_nodes][i]=sess.run(loss,feed_dict={X: Xtrain,y:
ytrain})
print(pout)
weights1=sess.run(W1)
weights2=sess.run(W2)
print(weights1)
print(weights2)
print('loss (hidden nodes: %d, iterations: %d): %.2f'%(hidden_nodes,
num_iters,loss_plot[hidden_nodes][num_iters-1]))
sess.close()
return weights1, weights2
print(pout)
返回一个非nan
数字。训练结束后,体重全部恢复nan
。即使我已将学习率设置为尽可能最小的水平。为什么会发生这种情况?在学习率如此之小的情况下,你基本上不会移动变量。从pout
中可以明显看出,最初的运行损失给出了一个有效的结果,这意味着我如何设置损失不是一个问题。提前谢谢。我想你的问题在这里:
W1=tf.Variable(np.random.rand(4,hidden_nodes),dtype=tf.float64)
W2=tf.Variable(np.random.rand(hidden_nodes,2),dtype=tf.float64)
试试这个:
W1 = tf.get_variable("W1", shape=..., dtype=...,
initializer=tf.contrib.layers.xavier_initializer())
W2 = tf.get_variable("W2", shape=..., dtype=...,
initializer=tf.contrib.layers.xavier_initializer())
您的权重初始化在[0,1]范围内,这是相当大的权重。这将以剧烈的梯度波动启动网络,这可能会让你陷入NaN
的境地
xavier初始值设定项将考虑到节点的输入数量,并初始化该值,以便不会使节点饱和。在横向术语中,它根据您的体系结构智能地初始化权重
注意,这个初始值设定项也有一个循环版本
或者,作为一个快速测试,您可以通过简单地将随机权重乘以一个小值(如1e-4)来减少权重初始化的大小
如果这不能解决问题,请在这里发表评论。谢谢,我试过了。不幸的是,它仍然输出
nan
权重。我会再次检查我的损失函数,确保它总是输出一个有限的数字。我已经重新打开了。奇怪的是,我的丢失仍然会给出一个初始的非nan
输出。然而,最轻微的更新就完全摧毁了它。这意味着损失的导数是无限的,或者说是nan,所以我的损失有一个平方根。它的导数是0.5/sqrt(x)
如果x=0
,这将是一个问题,即使sqrt(0)
不是。所以我把它改为sqrt(x+e)
。