在Tensorflow中共享变量,如何共享conv2d()?

在Tensorflow中共享变量,如何共享conv2d()?,tensorflow,Tensorflow,我试图通过以下方式访问一次创建的变量(或张量和变量altoghter,还不确定TF中这些定义的分离): def C2d(Tensor, params): with tf.variable_scope("conv"): Tensor = tf.pad(Tensor, params) conv = tf.contrib.layers.conv2d(Tensor, params) return conv with tf.variable_scope('

我试图通过以下方式访问一次创建的变量(或张量和变量altoghter,还不确定TF中这些定义的分离):

def C2d(Tensor, params):
    with tf.variable_scope("conv"):
        Tensor = tf.pad(Tensor, params)
        conv = tf.contrib.layers.conv2d(Tensor, params)
    return conv

with tf.variable_scope('scope1'):
    var1 = C2d(Tensor, params)

with tf.variable_scope('scope1', reuse=True):
    var2 = C2d(Tensor, params)

打印
False

var1:

var2:
如何通过这样的函数调用得到相同的张量

  • 接下来的问题是,
    tf.contrib.layers.conv2d(…)
    作为参数
    weigth_初始值设定项
    ,如果我试图通过变量获取对已经初始化的现有张量的引用,当我第二次传递该参数初始值设定项时会发生什么

  • 实际上,在我看来,该功能似乎是正确的,
    tf.contrib.layers.conv2d()
    返回层的输出,当您调用它两次时,它返回不同的输出是正常的

    如果您检查图形中创建的变量,例如使用
    tf.global_variables()
    ,您将看到它只创建了由层启动的变量的一个副本


    对于第二个问题,您可以将同一个变量初始值设定项传递给多个变量,这样就不会发生冲突。

    是的,您是对的,权重只有一个副本。虽然不是真正透明的行为。。。在本例中,张量的不同名称是否意味着导致这个张量或至少这个张量本身的图形会被计算两次?If将浪费计算资源,我认为最好将这个张量存储在全局字典中。调用两次
    con2d()
    意味着您需要两个不同的数据流,但其中的操作应该使用相同的变量。例如,您可能希望使用相同的卷积权重处理两个不同维度的图像。然后创建两个占位符
    p1,p2
    (每个维度一个),并创建图形的两个部分,调用
    t1=conv2d(p1),t2=conv2d(p2)
    (第二次使用
    reuse=True
    ),因此,当您运行
    t1
    时,您将为第一个图像执行图形,运行
    t2
    时,您将运行第二个图像我的意思是,如果我想将conv2d的输出传递到两个不同的层,那么正确的方法是什么?我不太明白您的确切意思。。。每次调用
    conv2d()
    ,都会创建一个新的张量。这个张量是对输入张量进行的一些操作。通常,在同一个输入上调用它两次没有多大意义,因为创建了同一张量的精确副本,并且应该不需要它,但是在不同的输入张量上使用相同的参数调用
    conv2d()
    
    print(var1 == var2)
    
    var2:  <tf.Tensor 'scope1_1/conv/Conv/Relu:0' shape=(475, 473, 256) dtype=float32>