我是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()