张量流优化器输出 nan,即使我将学习率设置得尽可能小



下面是代码。

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(来减小权重初始化的大小。

如果这不能解决问题,请在此处发表评论。

最新更新