如何收集发生器和鉴别器的可训练变量?(张力流)

2024-04-24 04:44:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在this tutorial之后实现生成性对抗网络

不幸的是,我不知道如何在我的项目中应用此部分:

# Only update D(X)'s parameters, so var_list = theta_D
D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list=theta_D)
# Only update G(X)'s parameters, so var_list = theta_G
G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list=theta_G)

我有一个更复杂的网络,层由可重用函数初始化,我不能手工收集theta_D和{}中的变量。在

我已经将生成器和鉴别器层放入命名范围中。是否可以在构建网络后收集变量,然后将其传递给AdamOptimizer().minimize(...)?在

这个代码给我一个空结果:

^{pr2}$

编辑

我试图在命名范围内调用tf.get_collection,得到了一些结果。但是如果我将theta_G和{}替换为example代码,则模型无法学习:

with tf.name_scope('G_sample'):
    G_sample = generator(Z)
    theta_G = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)

with tf.name_scope('D_real'):
    D_real, D_logit_real = discriminator(X)
    theta_D = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES)

不管我训练多长时间,它都会返回噪声而不是图像。选择了错误的变量,但我不知道为什么


编辑2

我根据vijay m's answer修改了示例代码。它运行正常,但不学习。结果就是噪音。在

完整代码是:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import os


def xavier_init(size):
    in_dim = size[0]
    xavier_stddev = 1. / tf.sqrt(in_dim / 2.)
    return tf.random_normal(shape=size, stddev=xavier_stddev)


X = tf.placeholder(tf.float32, shape=[None, 784])
Z = tf.placeholder(tf.float32, shape=[None, 100])


def sample_Z(m, n):
    return np.random.uniform(-1., 1., size=[m, n])


def generator(z, reuse=False):

    with tf.variable_scope('generator', reuse=reuse):

        G_W1 = tf.Variable(xavier_init([100, 128]))
        G_b1 = tf.Variable(tf.zeros(shape=[128]))

        G_W2 = tf.Variable(xavier_init([128, 784]))
        G_b2 = tf.Variable(tf.zeros(shape=[784]))

        #

        G_h1 = tf.nn.relu(tf.matmul(z, G_W1) + G_b1)
        G_log_prob = tf.matmul(G_h1, G_W2) + G_b2
        G_prob = tf.nn.sigmoid(G_log_prob)

    return G_prob


def discriminator(x, reuse=False):

    with tf.variable_scope('discriminator', reuse=reuse):

        D_W1 = tf.Variable(xavier_init([784, 128]))
        D_b1 = tf.Variable(tf.zeros(shape=[128]))

        D_W2 = tf.Variable(xavier_init([128, 1]))
        D_b2 = tf.Variable(tf.zeros(shape=[1]))

        #

        D_h1 = tf.nn.relu(tf.matmul(x, D_W1) + D_b1)
        D_logit = tf.matmul(D_h1, D_W2) + D_b2
        D_prob = tf.nn.sigmoid(D_logit)

    return D_prob, D_logit


def plot(samples):
    fig = plt.figure(figsize=(4, 4))
    gs = gridspec.GridSpec(4, 4)
    gs.update(wspace=0.05, hspace=0.05)

    for i, sample in enumerate(samples):
        ax = plt.subplot(gs[i])
        plt.axis('off')
        ax.set_xticklabels([])
        ax.set_yticklabels([])
        ax.set_aspect('equal')
        plt.imshow(sample.reshape(28, 28), cmap='Greys_r')

    return fig



G_sample = generator(Z)
D_real, D_logit_real = discriminator(X)

t_vars = tf.trainable_variables()
theta_D = [var for var in t_vars if var.name.startswith('discriminator')]
theta_G = [var for var in t_vars if var.name.startswith('generator')]

D_fake, D_logit_fake = discriminator(G_sample)

# Alternative losses:
# -------------------
D_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_real, labels=tf.ones_like(D_logit_real)))
D_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_fake, labels=tf.zeros_like(D_logit_fake)))
D_loss = D_loss_real + D_loss_fake
G_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_fake, labels=tf.ones_like(D_logit_fake)))

D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list=theta_D)
G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list=theta_G)

mb_size = 128
Z_dim = 100

mnist = input_data.read_data_sets('../../MNIST_data', one_hot=True)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

if not os.path.exists('out/'):
    os.makedirs('out/')

i = 0

for it in range(1000000):
    if it % 1000 == 0:
        samples = sess.run(G_sample, feed_dict={Z: sample_Z(16, Z_dim)})

        fig = plot(samples)
        plt.savefig('out/{}.png'.format(str(i).zfill(3)), bbox_inches='tight')
        i += 1
        plt.close(fig)

    X_mb, _ = mnist.train.next_batch(mb_size)

    _, D_loss_curr = sess.run([D_solver, D_loss], feed_dict={X: X_mb, Z: sample_Z(mb_size, Z_dim)})
    _, G_loss_curr = sess.run([G_solver, G_loss], feed_dict={Z: sample_Z(mb_size, Z_dim)})

    if it % 1000 == 0:
        print('Iter: {}'.format(it))
        print('D loss: {:.4}'. format(D_loss_curr))
        print('G_loss: {:.4}'.format(G_loss_curr))
        print()

θD:

[<tf.Variable 'discriminator/Variable:0' shape=(784, 128) dtype=float32_ref>, <tf.Variable 'discriminator/Variable_1:0' shape=(128,) dtype=float32_ref>, <tf.Variable 'discriminator/Variable_2:0' shape=(128, 1) dtype=float32_ref>, <tf.Variable 'discriminator/Variable_3:0' shape=(1,) dtype=float32_ref>]

θG:

[<tf.Variable 'generator/Variable:0' shape=(100, 128) dtype=float32_ref>, <tf.Variable 'generator/Variable_1:0' shape=(128,) dtype=float32_ref>, <tf.Variable 'generator/Variable_2:0' shape=(128, 784) dtype=float32_ref>, <tf.Variable 'generator/Variable_3:0' shape=(784,) dtype=float32_ref>]

Tags: samplesizevartfgeneratorvariablerealfake
1条回答
网友
1楼 · 发布于 2024-04-24 04:44:43

可通过以下步骤完成:

discriminatorgenerator定义{}:

def discriminator(x, reuse=False)
    with tf.variable_scope('discriminator', reuse=reuse):
    ...

def generator(z, output_dim, reuse=False, alpha=0.2, training=True):
    with tf.variable_scope('generator', reuse=reuse):
    ...

获取discriminatorgenerator的参数:

^{pr2}$

在示例代码中,需要在范围内声明变量,例如:

def generator(z, reuse=False):

  with tf.variable_scope('generator', reuse=reuse):

    G_W1 = tf.Variable(xavier_init([100, 128]))
    G_b1 = tf.Variable(tf.zeros(shape=[128]))

    G_W2 = tf.Variable(xavier_init([128, 784]))
    G_b2 = tf.Variable(tf.zeros(shape=[784]))

    G_h1 = tf.nn.relu(tf.matmul(z, G_W1) + G_b1)
    G_log_prob = tf.matmul(G_h1, G_W2) + G_b2
    G_prob = tf.nn.sigmoid(G_log_prob)

    return G_prob

然后可以检查生成器的变量,执行以下操作:

 print([var for var in tf.trainable_variables() if var.name.startswith('generator')])

相关问题 更多 >