byjhh15768
2018-07-02 02:43
采纳率: 100%
浏览 7.5k

关于Tensorflow的minst数字识别出现name XXX is not defined的问题

 def train(mnist):
    x = tf.placeholder(tf.float32, [None, INPUT_NODE], name='x-input')
    y_ = tf.placeholder(tf.float32, [None, OUTPUT_NODE], name='y-input')
    weights1 = tf.Variable(
        tf.truncated_normal([INPUT_NODE, LAYER1_NODE], stddev=0.1))
    biases1 = tf.Variable(tf.constant(0.1, shape=[LAYER1_NODE]))
    weights2 = tf.Variable(
        tf.truncated_normal([LAYER1_NODE, OUTPUT_NODE], stddev=0.1))
    biases2 = tf.Variable(tf.constant(0.1, shape=[OUTPUT_NODE]))

    #计算向前传播y的输出值,此处首次向前传播计算,不必使用滑动平均值来进行权值优化,固填为None
    y = inference(x, None, weights1, biases1, weights2, biases2)

    #存储训练轮数,变量为不可训练的变量
    global_step = tf.Variable(0, trainable=False)

    #给定滑动平均衰减率和训练轮数的变量,初始化滑动平均类,给定训练轮数可以加快早期
    #变量训练速度
    variable_averages = tf.train.ExponentialMovingAverage(
        MOVING_AVERAGE_DECAY, global_step)                  #创建指数移动平均类

    #在所有代表神经网络参数的变量上使用滑动平均,这个集合元素是所有没有指定
    #trainable = False 的参数
    variable_averages_op = variable_averages.apply(
        tf.trainable_variables())                           #将上类作用于当前所有可训练变量

    #计算使用滑动平均的Y值,这里调用之前定义的inference函数,获取参数
    average_y = inference(x, variable_averages, weights1, biases1, weights2, biases2)

    #计算交叉熵,作为刻画真实值y与预测值y_之间的差距
    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
      logits=y, labels=tf.argmax(y_, 1))
    #计算当前BATCH中所有样例的交叉熵平均值
    corss_entropy_mean = tf.reduce_mean(cross_entropy)

    #计算L2正则化损失函数
    regularizer = tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE)
    #计算模型正则化损失
    regularization = regularizer(weights1) + regularizer(weights2)
    #总损失为交叉熵与正则化的和
    loss = cross_entropy_mean + regularization

    #衰减学习率
    global learning_rate
    learning_rate = tf.train.exponential_decay(
        LEARNING_RATE_BASE, global_step, mnist.train.num_examples / BATCH_SIZE, LEARNING_RATE_DECAY)

#最小化loss
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)

with tf.control_dependencies([train_step, Variables_averages_op]):
    train_op = tf.no_op(name='train')

可以看到在前面的train函数中定义了learning_rate局部变量,但是在外部调用时出现变量未定义的报错,我定义全局变量也没有用图片说明

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 清风不识字12138 2018-07-02 08:42
    已采纳

    你虽然在train()函数中将

     learning_rate
    

    设为了全局变量,但是你在

    train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)

    这条语句执行前并没有调用train()函数,你那条将learning_rate 设置为全局变量的语句相当于没有执行,所以会报错。
    解决方案就是在之前调用一下train()函数,然后再执行该语句。

    已采纳该答案
    打赏 评论
  • 毛线一团 2018-07-02 03:37

    只看到Variable节点,没看到Operation边。

    打赏 评论
  • 小土弟 2018-07-02 08:01

    把global learning_rate这句话注释掉就ok了

    打赏 评论

相关推荐 更多相似问题