前奏:我正在尝试为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之前创建的一个。这意味着它与特定变量无关,这适用于所有变量。我想念什么吗?
答案 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()