Python,Tensorflow-变量未初始化

时间:2018-07-12 23:29:15

标签: python tensorflow

前奏:我正在尝试为CIFAR10数据库(图像识别)创建一个模型,由于某种原因,该培训似乎没有做任何事情。在另一个线程上,有人帮助我得出结论,我的权重没有改变,也没有初始化,这可能会导致问题的“不变”部分。

我正在尝试使用tf.truncated_normal函数初始化权重,并使用tf.zeros函数初始化权重。我创建了一些函数来使代码更易于阅读:

# Creates a weight variable
def weight(shape):
    initial = tf.truncated_normal(shape, stddev=0.01)
    return tf.Variable(initial)

# Creates a bias variable
def bias(shape):
    initial = tf.zeros(shape=shape)
    return tf.Variable(initial)

# Creates a FCL
def hiddenLayer(prev, prev_size, size):
    W = weight([prev_size, size])
    B = bias([size])
    S = tf.nn.relu(tf.matmul(prev, W) + B)

    return W, B, S

# Creates the output layer (same but with softmax)
def outputLayer(prev, prev_size, size):
    W = weight([prev_size, size])
    B = bias([size])
    S = tf.nn.softmax(tf.matmul(prev, W) + B)

    return W, B, S

但是,变量只是没有初始化(因为在训练之前尝试打印变量时,我总是会遇到相应的错误)。因此,我认为这可能与函数和变量的返回有关,所以我在主函数中编写了所有这些混乱的东西(我认为具有(?)是很常见的事情):

#   Layer 1
    W1 = tf.Variable(tf.truncated_normal([data_size, l1_size], stddev=0.01))
    B1 = tf.Variable(tf.zeros([l1_size]))
    S1 = tf.nn.relu(tf.matmul(data, W1) + B1)

#   Layer 2
    W2 = tf.Variable(tf.truncated_normal([l1_size, l2_size], stddev=0.01))
    B2 = tf.Variable(tf.zeros([l2_size]))
    S2 = tf.nn.relu(tf.matmul(S1, W2) + B2)

#   Output Layer
    W3 = tf.Variable(tf.truncated_normal([l2_size, output_size], stddev=0.01))
    B3 = tf.Variable(tf.zeros([output_size]))
    result = tf.nn.softmax(tf.matmul(S2, W3) + B3)

但是错误不断出现:

Traceback (most recent call last):
  File "C:\...\model.py", line 89, in <module>
    main()
  File "C:\...\model.py", line 69, in main
    print(sess.run(B3, feed_dict={data: batch_data, labels: batch_labels}) * 100, "%")
...
tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use
uninitialized value Variable_5
...

请记住,此错误读取为Variable_5,当我尝试输出W3而不是B3时,我得到了相同的字符,但输出的是Variable_4,这是有道理的,因为它是在B3之前创建的一个。这意味着它与特定变量无关,这适用于所有变量。我想念什么吗?

1 个答案:

答案 0 :(得分:1)

在使用TensorFlow Session对象执行变量之前,必须初始化所有变量。方法tf.global_variables_initializer()初始化图中计算机本地的所有全局可训练变量。而方法tf.local_variables_initializer初始化在分布式环境中共享的所有变量。两者都运行是个好习惯。查看示例:

with tf.Session() as sess:
    # initialize all variables
    tf.global_variables_initializer().run()
    tf.local_variables_initializer().run()