tensorflow optimizer输出nan,即使我将学习率设置为尽可能小

2024-09-29 21:38:16 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是代码。在

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数字。训练后,体重全部恢复。即使我把学习率设为最小。为什么会这样?由于学习率很小,你基本上不会移动变量。从pout可以明显看出,初始运行损失给出了一个有效的结果,这意味着我如何设置损失不是问题。提前谢谢。在


Tags: runtffeednumhiddenw1sessnodes
1条回答
网友
1楼 · 发布于 2024-09-29 21:38:16

我怀疑是你的问题:

W1=tf.Variable(np.random.rand(4,hidden_nodes),dtype=tf.float64)
W2=tf.Variable(np.random.rand(hidden_nodes,2),dtype=tf.float64)

试试这个:

^{pr2}$

权重初始化在[0,1]范围内,这是相当大的权重。这将使网络从剧烈的梯度波动开始,很可能会让你陷入NaN的境地。在

xavier初始化器将考虑到节点的输入数量,并初始化该值,以使节点不会饱和。在专业术语中,它根据您的架构智能地初始化权重。在

注意,这个初始值设定项也有一个会议版本。在

或者,作为一个快速测试,您可以通过简单地将随机权重乘以一个小值(如1e-4)来减小权重初始化的大小。在

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

相关问题 更多 >

    热门问题