Tensorflow,尽管运行了全局变量初始化器,变量仍然未初始化

我是Tensorflow的新手,以前使用过Caffe。我试图在Tensorflow中实现http://cvlab.cse.msu.edu/pdfs/Tai_Yang_Liu_CVPR2017.pdf中的方法。

尽管我已经对Tensorflow中的变量进行了初始化,但我仍然在使用这些变量时遇到了问题。我尝试使用tf.get_variable来替代tf.Variable,但这并没有奏效。并且设置initializer=tf.contrib.layers.xavier_initializer()也没有起到作用。

我的代码如下:

import tensorflow as tfimport sys, osimport numpy as npglobal xseeddef get_model(inp, train):    #创建架构    #db输入,批量大小为128    with tf.name_scope('input'):        inl = tf.reshape(inp, [-1, 31, 31, 1])    with tf.name_scope('batchnorm_scale_relu'):        #批量归一化,缩放,ReLU        normed = tf.contrib.layers.batch_norm(inl, is_training=train)        alpha = tf.Variable(tf.truncated_normal((1,), stddev=0.1), trainable=True, name="alpha")        beta = tf.Variable(tf.truncated_normal((1,), stddev=0.1), trainable=True, name="beta")        scaled = alpha * normed + beta        relud = tf.nn.relu(scaled, name="relu1")    with tf.name_scope('conv1'):        #???填充???是否正确        padded_input = tf.pad(relud, [[0, 0], [1, 1], [1, 1], [0, 0]], "CONSTANT")        #权重初始化msra        convolved = tf.layers.conv2d(inputs=padded_input, filters=128, kernel_size=(3, 3), strides=(1, 1), padding="VALID",                kernel_initializer=tf.contrib.layers.variance_scaling_initializer(seed=xseed))    with tf.name_scope('batchnorm_scale_relu_1a'):        #批量归一化,缩放,ReLU        normed_1a = tf.contrib.layers.batch_norm(convolved, is_training=train)        alpha_1a = tf.Variable(tf.truncated_normal((1,), stddev=0.1), trainable=True, name="alpha_1a")        beta_1a = tf.Variable(tf.truncated_normal((1,), stddev=0.1), trainable=True, name="beta_1a")        scaled_1a = alpha_1a * normed_1a + beta_1a        relud_1a = tf.nn.relu(scaled_1a, name="relu1_1a")    with tf.name_scope('conv1_1a'):        padded_input_1a = tf.pad(relud_1a, [[0, 0], [1, 1], [1, 1], [0, 0]], "CONSTANT")        #权重初始化msra        convolved_1a = tf.layers.conv2d(inputs=padded_input_1a, filters=128, kernel_size=(3, 3), strides=(1, 1), padding="VALID",                kernel_initializer=tf.contrib.layers.variance_scaling_initializer(seed=xseed))    return convolved_1axseed = Nonewith tf.device("cpu"):    inp = tf.placeholder(tf.float32, [None, 31, 31, 1])    init_op = tf.global_variables_initializer()    init_op2 = tf.local_variables_initializer()    with tf.Session(config=tf.ConfigProto()) as sess:        m = get_model(inp, True)        sess.run(init_op)        sess.run(init_op2)        print(sess.run(tf.report_uninitialized_variables()))        res = sess.run(m, feed_dict={ inp: np.zeros((1, 31, 31, 1))})

它报告了未初始化的变量:

['BatchNorm/beta' 'BatchNorm/moving_mean' 'BatchNorm/moving_variance'  'batchnorm_scale_relu/alpha' 'batchnorm_scale_relu/beta' 'conv2d/kernel'  'conv2d/bias' 'BatchNorm_1/beta' 'BatchNorm_1/moving_mean'  'BatchNorm_1/moving_variance' 'batchnorm_scale_relu_1a/alpha_1a'  'batchnorm_scale_relu_1a/beta_1a' 'conv2d_1/kernel' 'conv2d_1/bias']

并且在评估卷积张量时抛出了异常:

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value batchnorm_scale_relu_1a/alpha_1a     [[Node: batchnorm_scale_relu_1a/alpha_1a/read = Identity[T=DT_FLOAT, _class=["loc:@batchnorm_scale_relu_1a/alpha_1a"], _device="/job:localhost/replica:0/task:0/device:CPU:0"](batchnorm_scale_relu_1a/alpha_1a)]]

请帮帮我。


回答:

我自己解决了这个问题。将这段代码替换为:

with tf.device("cpu"):    inp = tf.placeholder(tf.float32, [None, 31, 31, 1])    init_op = tf.global_variables_initializer()    init_op2 = tf.local_variables_initializer()    with tf.Session(config=tf.ConfigProto()) as sess:        m = get_model(inp, True)        sess.run(init_op)        sess.run(init_op2)        print(sess.run(tf.report_uninitialized_variables()))        res = sess.run(m, feed_dict={ inp: np.zeros((1, 31, 31, 1))})

替换为以下代码:

with tf.device("cpu"):    inp = tf.placeholder(tf.float32, [None, 31, 31, 1])    with tf.Session(config=tf.ConfigProto()) as sess:        m = get_model(inp, True)        sess.run(tf.initialize_all_variables())        res = sess.run(tf.report_uninitialized_variables())        #print(res) -- 输出 [] (无)        res = sess.run(m, feed_dict={ inp: np.zeros((1, 31, 31, 1))})        print(res)

关键是使用tf.initialize_all_variables()而不是tf.global_variables_initializer()

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注