[英]Tensorflow GAN: “No gradients provided for any variable”
我正在嘗試使用TF建立GAN,但我很愚蠢。 我在網上搜索,但找不到答案。
當我運行提供的代碼時,我得到:
gen_optimize = tf.train.AdamOptimizer(learning_rate, beta1).minimize(gen_loss, var_list=gen_vars)
ValueError:未為任何變量提供漸變,請檢查您的圖形變量之間是否不支持漸變的操作
def generator(z, activation=tf.nn.relu, reuse=False):
shape = z.get_shape().as_list()
weight_init = tf.random_normal_initializer(stddev=0.1)
bias_init = tf.constant_initializer(0.0)
fc1_units = 256
fc1_weights = tf.get_variable('gen_fc1_weights', (shape[1], fc1_units), dtype=tf.float32, initializer=weight_init)
fc1_biases = tf.get_variable('gen_fc1_biases', (fc1_units), initializer=bias_init)
fc1 = activation(tf.matmul(z, fc1_weights) + fc1_biases)
fc2_units = 784
fc2_weights = tf.get_variable('gen_fc2_weights', (fc1_units, fc2_units), dtype=tf.float32, initializer=weight_init)
fc2_biases = tf.get_variable('gen_fc2_biases', (fc2_units), initializer=bias_init)
fc2 = activation(tf.matmul(fc1, fc2_weights) + fc2_biases)
output = tf.nn.sigmoid(fc2, name='gen_sigmoid_output')
return output
def discriminator(X, activation=tf.nn.relu):
shape = z.get_shape().as_list()
weight_init = tf.random_normal_initializer(stddev=0.1)
bias_init = tf.constant_initializer(0.0)
with tf.variable_scope('discriminator', reuse=tf.AUTO_REUSE):
fc1_units = 1024
fc1_weights = tf.get_variable('dis_fc1_weights', (shape[1], fc1_units), dtype=tf.float32, initializer=weight_init)
fc1_biases = tf.get_variable('dis_fc1_biases', (fc1_units), initializer=bias_init)
fc1 = activation(tf.matmul(z, fc1_weights) + fc1_biases)
fc2_units = 1
fc2_weights = tf.get_variable('dis_fc2_weights', (fc1_units, fc2_units), dtype=tf.float32, initializer=weight_init)
fc2_biases = tf.get_variable('dis_fc2_biases', (fc2_units), initializer=bias_init)
fc2 = tf.matmul(fc1, fc2_weights) + fc2_biases
sigmoid_out = tf.nn.sigmoid(fc2, name='dis_sigmoid_output')
return sigmoid_out, fc2
X = tf.placeholder(tf.float32, shape=(real_batch_size, 28*28), name='X')
z = tf.placeholder(dtype=tf.float32, shape=(fake_batch_size, 100), name='z')
gen = generator(z)
dis_real, dis_real_logits = discriminator(X)
dis_fake, dis_fake_logits = discriminator(gen)
dis_real_loss = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(labels=tf.ones_like(dis_real), logits=dis_real_logits))
dis_fake_loss = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(labels=tf.zeros_like(dis_fake), logits=dis_fake_logits))
dis_loss = dis_real_loss + dis_fake_loss
gen_loss = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(labels=tf.ones_like(dis_fake), logits=dis_fake_logits))
train_vars = tf.trainable_variables()
dis_vars = [var for var in train_vars if 'dis_' in var.name]
gen_vars = [var for var in train_vars if 'gen_' in var.name]
dis_optimize = tf.train.AdamOptimizer(learning_rate, beta1).minimize(dis_loss, var_list=dis_vars)
gen_optimize = tf.train.AdamOptimizer(learning_rate, beta1).minimize(gen_loss, var_list=gen_vars)
您的問題在於如何過濾變量:
dis_vars = [var for var in train_vars if 'dis_' in var.name]
gen_vars = [var for var in train_vars if 'gen_' in var.name]
您在discriminator
范圍中定義了discriminator的變量,在/
(無前綴)范圍中定義了generator的變量,因此您的過濾器僅過濾出每個變量。
您可以收集正確過濾的變量:
dis_vars = [var for var in train_vars if 'discriminator' in var.name]
gen_vars = [var for var in train_vars if 'discriminator' not in var.name]
此外,錯誤指出“在變量和損耗Tensor(“ Mean_2:0”,shape =(),dtype = float32)之間,沒有變量提供漸變,請檢查圖表以了解不支持漸變的運算符。 “
實際上,問題在於損失張量。
當輸入是發電機輸出時,損耗張量是鑒別器的評估值。 鑒別符定義是錯誤的,實際上,您指的是從未定義的變量z 。 因此,如果您使用X而不是z更新鑒別代碼,那么它將起作用:
import tensorflow as tf
def generator(z, activation=tf.nn.relu, reuse=False):
with tf.variable_scope("generator"):
shape = z.get_shape().as_list()
weight_init = tf.random_normal_initializer(stddev=0.1)
bias_init = tf.constant_initializer(0.0)
fc1_units = 256
fc1_weights = tf.get_variable(
'gen_fc1_weights', (shape[1], fc1_units),
dtype=tf.float32,
initializer=weight_init)
fc1_biases = tf.get_variable(
'gen_fc1_biases', (fc1_units), initializer=bias_init)
fc1 = activation(tf.matmul(z, fc1_weights) + fc1_biases)
fc2_units = 784
fc2_weights = tf.get_variable(
'gen_fc2_weights', (fc1_units, fc2_units),
dtype=tf.float32,
initializer=weight_init)
fc2_biases = tf.get_variable(
'gen_fc2_biases', (fc2_units), initializer=bias_init)
fc2 = activation(tf.matmul(fc1, fc2_weights) + fc2_biases)
output = tf.nn.sigmoid(fc2, name='gen_sigmoid_output')
return output
def discriminator(X, activation=tf.nn.relu):
with tf.variable_scope('discriminator', reuse=tf.AUTO_REUSE):
shape = X.get_shape().as_list()
weight_init = tf.random_normal_initializer(stddev=0.1)
bias_init = tf.constant_initializer(0.0)
fc1_units = 1024
fc1_weights = tf.get_variable(
'dis_fc1_weights', (shape[1], fc1_units),
dtype=tf.float32,
initializer=weight_init)
fc1_biases = tf.get_variable(
'dis_fc1_biases', (fc1_units), initializer=bias_init)
fc1 = activation(tf.matmul(X, fc1_weights) + fc1_biases)
fc2_units = 1
fc2_weights = tf.get_variable(
'dis_fc2_weights', (fc1_units, fc2_units),
dtype=tf.float32,
initializer=weight_init)
fc2_biases = tf.get_variable(
'dis_fc2_biases', (fc2_units), initializer=bias_init)
fc2 = tf.matmul(fc1, fc2_weights) + fc2_biases
return fc2
### ADDED TO TEST
real_batch_size, fake_batch_size = 10, 10
learning_rate = 1e-5
beta1 = 0.5
###
X = tf.placeholder(tf.float32, shape=(real_batch_size, 28 * 28), name='X')
z = tf.placeholder(dtype=tf.float32, shape=(fake_batch_size, 100), name='z')
gen = generator(z)
dis_real_logits = discriminator(X)
dis_fake_logits = discriminator(gen)
dis_real_loss = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(
labels=tf.ones_like(dis_real_logits), logits=dis_real_logits))
dis_fake_loss = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(
labels=tf.zeros_like(dis_fake_logits), logits=dis_fake_logits))
dis_loss = dis_real_loss + dis_fake_loss
gen_loss = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(
labels=tf.ones_like(dis_fake_logits), logits=dis_fake_logits))
train_vars = tf.trainable_variables()
dis_vars = [var for var in train_vars if 'dis_' in var.name]
gen_vars = [var for var in train_vars if 'gen_' in var.name]
dis_optimize = tf.train.AdamOptimizer(learning_rate, beta1).minimize(
dis_loss, var_list=dis_vars)
gen_optimize = tf.train.AdamOptimizer(learning_rate, beta1).minimize(
gen_loss, var_list=gen_vars)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.