Tensorflow:如何在图中共享ops?

Tensorflow:如何在图中共享ops?,tensorflow,tensorboard,Tensorflow,Tensorboard,这是关于创建一个尽可能简单的图形,这样以后就可以检查它了。代码的相关部分是这个,我认为这是创建生成性对抗训练的典型代码块(接下来是一个在实践中不起作用的简化网络): 我的整个代码的Tensorflow图如下所示: 现在我尝试了“tf.name\u scope”和“tf.variable\u scope”的所有方法,但有一件事我不能做,那就是合并ops。Tensorflow会自动为网络再次创建相同的操作。这意味着,例如,在此设置和图形中,它将始终创建“layer_1”和layer_1_2”。我想

这是关于创建一个尽可能简单的图形,这样以后就可以检查它了。代码的相关部分是这个,我认为这是创建生成性对抗训练的典型代码块(接下来是一个在实践中不起作用的简化网络):

我的整个代码的Tensorflow图如下所示:


现在我尝试了“tf.name\u scope”和“tf.variable\u scope”的所有方法,但有一件事我不能做,那就是合并ops。Tensorflow会自动为网络再次创建相同的操作。这意味着,例如,在此设置和图形中,它将始终创建“layer_1”和layer_1_2”。我想我明白这一切在做什么。但我不明白的是,为什么不可能将其限定为一个层,只有一个ops块和一个生成变量的块。因此,在图中,“鉴别器”内只有一个网络,选择仅在输入端进行。我认为这基本上可以归结为为什么不可能制作一个图形,在重新塑造之后,网络将其视为一个更大的批次,因为现在ops是相同的?

您永远不会在tensorflow中共享ops。假设一个op有一个固定的输入(在运行期间),再次运行同一个op没有意义,因为它会给您相同的输出

然而,共享权重/变量是有意义的。假设你有一个密集的完全连接的层,你应用于两个不同的张量(在你的例子中是假数据和真数据)。请注意,输入是不同的,因此这些将是不同的操作。使用
tf.variable\u scope(…,reuse=tf.AUTO\u reuse)
重用变量


如果你真的想在你的图中有一个单独的运算,一个选项是把输入浓缩成一个看起来像是你当前批大小两倍的批,然后在串联张量上运行运算。通过这种方式,您可以确保对两个输入应用相同的操作,并且可能会获得一些小的速度提升(类似于从大批量中获得的速度)。

谢谢您的回复。连接它们是我现在所做的,以避免出现这种过于复杂的图形。事实上,这就是为什么tensorflow不知道在整形操作之后,除了批量大小之外,网络输入具有相同的尺寸,并且由于变量共享,应该进行完全相同的计算。因此,我不明白为什么计算图不会自动变得更简单?这与计算时的时间同步有关吗?我知道一种更好的方式来表达我的想法:)Op可以用作固定操作,但输入/输出值可以更改,对吗?那么,为什么我不能在更高的层次上做到这一点呢?因此,网络成为Op?或者如果可能的话,我该怎么做?@JeroenBertels我想你明白了。为什么会这样,我不太清楚。可能是因为有人认为这会更简单。
def generator(x):
    w_init = tf.truncated_normal_initializer(0., 0.02)
    b_init = tf.constant_initializer(0.)
    l1 = tf.layers.dense(x, 256, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.relu, name='layer_1')
    l2 = tf.layers.dense(l1, 512, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.relu, name='layer_2')
    o = tf.layers.dense(l2, 784, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.tanh, name='layer_out')
    return o

def discriminator(x, reuse=False):
    w_init = tf.truncated_normal_initializer(0., 0.02)
    b_init = tf.constant_initializer(0.)
    x = tf.reshape(x, [-1, 784])
    l1 = tf.layers.dense(x, 1024, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.relu, name='layer_1')
    l2 = tf.layers.dense(l1, 512, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.relu, name='layer_2')
    o = tf.layers.dense(l2, 1, kernel_initializer=w_init, bias_initializer=b_init, activation=tf.nn.sigmoid, name='layer_out')
    return o

with tf.variable_scope('input_variables'):
    x = tf.placeholder(tf.float32, shape=(None, 28, 28, 1), name='real_images')
    z = tf.placeholder(tf.float32, shape=(None, noise_size), name='noise_vector')

with tf.variable_scope('generator'):
    G_z = generator(z)

with tf.variable_scope('discriminator', reuse=tf.AUTO_REUSE):
    D_real = discriminator(x)
    D_fake = discriminator(G_z, reuse=True)