理解张量板:为啥要向优化器发送 12 个张量?

Posted

技术标签:

【中文标题】理解张量板:为啥要向优化器发送 12 个张量?【英文标题】:Understanding tensorboard: why 12 tensors sent to optimizer?理解张量板:为什么要向优化器发送 12 个张量? 【发布时间】:2018-06-09 05:51:47 【问题描述】:

所以我做了我能做到的最简单的模型(感知器/自动编码器),它(除了输入生成)如下:

N = 64 * 64 * 3

def main():
    x = tf.placeholder(tf.float32, shape=(None, 64, 64, 3), name="x")

    with tf.name_scope("perceptron"):
        W = tf.Variable(tf.random_normal([N, N], stddev=1), name="W")
        b = tf.Variable(tf.random_normal([], stddev=1), name="b")
        y = tf.add(tf.matmul( tf.reshape(x, [-1,N]), W), b, name="y")
        act = tf.nn.sigmoid(y, name="sigmoid")
        yhat = tf.reshape(act, [-1, 64, 64, 3], name="yhat")

    with tf.name_scope("mse"):
        sq_error = tf.reduce_mean(np.square(x - yhat), axis=1)
        cost = tf.reduce_mean( sq_error, name="cost" )
        tf.summary.scalar("cost", cost)

    with tf.name_scope("conv_opt"): #Should just be called 'opt' here
        training_op = tf.train.AdamOptimizer(0.005).minimize(cost, name="train_op")

    with tf.device("/gpu:0"):
        config = tf.ConfigProto(allow_soft_placement=True)
        config.gpu_options.allow_growth = True
        sess = tf.Session(config=config)
        sess.run(tf.global_variables_initializer())

        logdir = "log_directory"
        if os.path.exists(logdir):
            shutil.rmtree(logdir)
        os.makedirs(logdir)

        input_gen = input.input_generator_factory(...)
        input_gen.initialize((64,64,3), 512)

        merged = tf.summary.merge_all()
        train_writer = tf.summary.FileWriter(logdir, sess.graph)

        for i in range(10):
            batch = input_gen.next_train_batch()
            summary,_ = sess.run([merged, training_op], feed_dict=x : batch)
            train_writer.add_summary(summary, i)
            print("Iteration %d completed" % (i))

if __name__ == "__main__":
    main()

这会产生以下tensorboard graph。无论如何,我认为从 'perception' 到 'conv_opt' 的粗箭头(可能应该只是称为 'opt',抱歉)对应于反向传播的错误信号,(而 ?x64x64x3 箭头对应于推理)。但为什么是 12 张量?我不明白这个数字是从哪里来的。我本来预计会更少,实际上只对应于Wb。有人可以解释一下发生了什么吗?

【问题讨论】:

【参考方案1】:

我认为原因是当您添加 tf.train.AdamOptimizer(0.005).minimize(cost) 操作时,隐含地假设您优化了所有可训练变量(因为您没有另外指定)。 因此,您需要知道这些变量的值以及参与计算cost 的所有中间张量的值,包括梯度(它们也是张量并隐式添加到计算图中)。现在让我们计算来自perceptron 的变量和张量:

    W b tf.reshape(x, [-1,N]) tf.matmul( ..., W) 它相对于第一个参数的梯度。 它相对于第二个参数的梯度。 tf.add(..., b, name="y") 它相对于第一个参数的梯度。 它相对于第二个参数的梯度。 tf.nn.sigmoid(y, name="sigmoid") 它的渐变。 tf.reshape(act, [-1, 64, 64, 3], name="yhat")

我实际上并不能 100% 确定会计是这样完成的,但你知道数字 12 可能来自哪里。


作为一个练习,我们可以看到这种类型的会计还解释了数字 9 在图表中的来源:

    x - yhat 它相对于第一个参数的梯度 相对于第二个参数的梯度 np.square(...) 它的渐变 tf.reduce_mean(..., axis=1) 它的渐变 tf.reduce_mean( sq_error, name="cost" ) 它的渐变

【讨论】:

我会投赞成票,但我不会让我投票——这听起来不错。在我接受任何答案之前会等待一段时间。

以上是关于理解张量板:为啥要向优化器发送 12 个张量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在张量板上只看到大约一百个边界框?

重置张量流优化器

为啥张量板图弯曲得很奇怪?

张量积算法优化

理解张量板图像

Adam 优化器真的是 RMSprop 加动量吗?如果是,为啥它没有动量参数?