导入的库被认为是python中的变量

时间:2017-07-19 16:03:01

标签: python tensorflow

当我运行此代码时,我收到错误:

"UnboundLocalError: local variable 'tf' referenced before assignment"

在我宣布权重的行中。为什么将tf视为未分配的变量?

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/",one_hot = True)
n_nodes_hl1 = 500
n_nodes_hl2 = 500
n_nodes_hl3 = 500
n_classes = 10
batch_size = 128
x = tf.placeholder('float',[None,784]) #THrows error if the matrix is not 784-dim vec
y = tf.placeholder('float')

def convolutional_neural_network_model(x):
#The Line with the Error
  weights = {'W_conv1':tf.Variable(tf.random_normal([5,5,1,32])),
             'W_conv2':tf.Variable(tf.random_normal([5,5,32,64])),
             'W_fc':tf.Variable(tf.random_normal([7*7*64,1024])),
             'out':tf.Variable(tf.random_normal([1024, n_classes]))} 
  biases = {'b_conv1':tf.Variable(tf.random_normal([32])),
            'b_conv2':tf.Variable(tf.random_normal([64])),
            'b_fc':tf.Variable(tf.random_normal([1024])),
            'out':tf.Variable(tf.random_normal([n_classes]))}  

  x = tf.reshape(x,shape=[-1,28,28,1])
  conv1  = conv2d(x,weights['W_conv1'])
  conv1 = maxpool2d(conv1)

  conv2  = conv2d(conv1,weights['W_conv2'])
  conv2 = maxpool2d(conv2)

  fc = tf.reshape(conv2,[-1,7*7*64])
  tf = tf.nn.relu(tf.matmul(fc,weights['W_fc']) + biases['b_fc'])

  output = tf.matmul(fc,weights['out']) + biases['out']
  return output

def train_neural_network(x):
  prediction = convolutional_neural_network_model(x)
  cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = prediction,labels = y))
  # learning_rate  = 0.001
  optimizer = tf.train.AdamOptimizer().minimize(cost)
#
  hm_epochs = 10
#
  with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
#
    for epoch in range(hm_epochs):
      epoch_loss = 0
      for _ in range(int(mnist.train.num_examples/batch_size)):
        epoch_x,epoch_y = mnist.train.next_batch(batch_size)
        _, c = sess.run([optimizer,cost], feed_dict={x: epoch_x, y:epoch_y})
        epoch_loss += c
      print('Epoch',epoch,'/',hm_epochs,'  loss :',epoch_loss)
#
    correct = tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))
#
    accuracy = tf.reduce_mean(tf.cast(correct,'float'))
    print('Accuracy :',accuracy.eval({x:mnist.test.images,y:mnist.test.labels}))
#


def conv2d(x,W):
  return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')

def maxpool2d(x):
  return tf.nn.max_pool(x,ksize = [1,2,2,1],strides=[1,2,2,1],padding='SAME')

if __name__ == '__main__':
  print('Begin')
  train_neural_network(x)
print('Done')

2 个答案:

答案 0 :(得分:1)

导入tensorflow as tf后,您会在以下行重新定义tf

tf = tf.nn.relu(tf.matmul(fc,weights['W_fc']) + biases['b_fc'])

更改此变量的名称将解决问题。

答案 1 :(得分:0)

tf = tf.nn.relu(tf.matmul(fc,weights['W_fc']) + biases['b_fc'])

如果tf,则不应使用import tensorflow as tf作为变量的名称;目前还不清楚你是指变量还是模块。