版本:我在python3中使用tensorflow(版本:v1.1.0-13-g8ddd727 1.1.0)(Python 3.4.3(默认,2016年11月17日,01:08:31) [GCC 4.8.4]在linux上),它是从源码和基于GPU安装的(名称:GeForce GTX TITAN X专业:5次要:2 memoryClockRate(GHz)1.076)。
上下文:生成对抗网络(GAN)通过将从潜在空间中提取的样本传递到生成网络,学习从高维分布中合成新样本。当高维分布描述特定数据集的图像时,网络应该学习为潜在空间中彼此接近的潜在变量生成视觉上相似的图像样本。对于图像检索和图像分类等任务,通过将图像投影到潜在空间中来利用潜在空间的排列并将其用作判别任务的表示可能是有用的。
上下文问题:我试图反转生成器(计算cifar10中的输入图像和生成器的图像g(z)之间的L2范数,其中z是要训练的参数随机梯度下降,以最小化此范数,并找到输入图像的原像的近似值。)
技术问题:因此,我正在tensorflow中的新会话中构建一个新图形,但是我需要使用在另一个会话中训练过的训练有素的gan,我无法导入,因为这两个图形不一样。也就是说,当我使用sess.run()时,找不到变量,因此会出现错误消息。
代码是
import tensorflow as tf
from data import cifar10, utilities
from . import dcgan
import logging
logger = logging.getLogger("gan.test")
BATCH_SIZE = 1
random_z = tf.get_variable(name='z_to_invert', shape=[BATCH_SIZE, 100], initializer=tf.random_normal_initializer())
#random_z = tf.random_normal([BATCH_SIZE, 100], mean=0.0, stddev=1.0, name='random_z')
# Generate images with generator
generator = dcgan.generator(random_z, is_training=True, name='generator')
# Add summaries to visualise output images
generator_visualisation = tf.cast(((generator / 2.0) + 0.5) * 255.0, tf.uint8)
summary_generator = tf.summary.\
image('summary/generator', generator_visualisation,
max_outputs=8)
#Create one image to test inverting
test_image = map((lambda inp: (inp[0]*2. -1., inp[1])),
utilities.infinite_generator(cifar10.get_train(), BATCH_SIZE))
inp, _ = next(test_image)
summary_inp = tf.summary.image('input_image', inp)
img_summary = tf.summary.merge([summary_generator, summary_inp])
with tf.name_scope('error'):
error = inp - generator #generator = g(z)
# We set axis = None because norm(tensor, ord=ord) is equivalent to norm(reshape(tensor, [-1]), ord=ord)
error_norm = tf.norm(error, ord=2, axis=None, keep_dims=False, name='L2Norm')
summary_error = tf.summary.scalar('error_norm', error_norm)
with tf.name_scope('Optimizing'):
optimizer = tf.train.AdamOptimizer(0.001).minimize(error_norm, var_list=z)
sv = tf.train.Supervisor(logdir="gan/invert_logs/", save_summaries_secs=None, save_model_secs=None)
batch = 0
with sv.managed_session() as sess:
logwriter = tf.summary.FileWriter("gan/invert_logs/", sess.graph)
while not sv.should_stop():
if batch > 0 and batch % 100 == 0:
logger.debug('Step {} '.format(batch))
(_, s) = sess.run((optimizer, summary_error))
logwriter.add_summary(s, batch)
print('step %d: Patiente un peu poto!' % batch)
img = sess.run(img_summary)
logwriter.add_summary(img, batch)
batch += 1
print(batch)
我明白这是什么问题,实际上我正在尝试运行一个保存在gan / train_logs中的会话,但图表中没有我想要运行的那些变量。
因此,我尝试实现这一点:
graph = tf.Graph()
tf.reset_default_graph()
with tf.Session(graph=graph) as sess:
ckpt = tf.train.get_checkpoint_state('gan/train_logs/')
saver = tf.train.import_meta_graph(ckpt.model_checkpoint_path + '.meta', clear_devices=True)
saver.restore(sess, ckpt.model_checkpoint_path)
logwriter = tf.summary.FileWriter("gan/invert_logs/", sess.graph)
#inp, _ = next(test_image)
BATCH_SIZE = 1
#Create one image to test inverting
test_image = map((lambda inp: (inp[0]*2. -1., inp[1])),
utilities.infinite_generator(cifar10.get_train(), BATCH_SIZE))
inp, _ = next(test_image)
#M_placeholder = tf.placeholder(tf.float32, shape=cifar10.get_shape_input(), name='M_input')
M_placeholder = inp
zmar = tf.summary.image('input_image', inp)
#Create sample noise from random normal distribution
z = tf.get_variable(name='z', shape=[BATCH_SIZE, 100], initializer=tf.random_normal_initializer())
# Function g(z) zhere z is randomly generated
g_z = dcgan.generator(z, is_training=True, name='generator')
generator_visualisation = tf.cast(((g_z / 2.0) + 0.5) * 255.0, tf.uint8)
sum_generator = tf.summary.image('summary/generator', generator_visualisation)
img_summary = tf.summary.merge([sum_generator, zmar])
with tf.name_scope('error'):
error = M_placeholder - g_z
# We set axis = None because norm(tensor, ord=ord) is equivalent to norm(reshape(tensor, [-1]), ord=ord)
error_norm = tf.norm(error, ord=2, axis=None, keep_dims=False, name='L2Norm')
summary_error = tf.summary.scalar('error_norm', error_norm)
with tf.name_scope('Optimizing'):
optimizer = tf.train.AdamOptimizer(0.001).minimize(error_norm, var_list=z)
sess.run(tf.global_variables_initializer())
for i in range(10000):
(_, s) = sess.run((optimizer, summary_error))
logwriter.add_summary(s, i)
print('step %d: Patiente un peu poto!' % i)
img = sess.run(img_summary)
logwriter.add_summary(img, i)
print('Done Training')
这个脚本运行,但是我已经检查了tensorboard,这里使用的生成器没有经过训练的权重,只会产生噪音。
我想我正在尝试在使用另一个图表及其经过培训的会话的图表中运行会话。我已经在tensorflow网站https://www.tensorflow.org/versions/r1.3/programmers_guide/graphs上仔细阅读了Graphs和Session文档,我发现了一个有趣的tf.import_graph_def函数:
您可以通过传递可选的input_map参数,将导入图形中的张量重新绑定到默认图形中的tf.Tensor对象。例如,input_map使您可以导入tf.GraphDef中定义的图形片段,并将正在构建的图形中的张量静态连接到该片段中的tf.placeholder张量。
但我不知道如何使用此功能,没有给出任何示例,而且我只找到了可能对我有用的两个链接: https://github.com/tensorflow/tensorflow/issues/7508 Tensorflow: How to use a trained model in a application?
在这个主题上得到你的帮助真的很高兴。对于已经使用过tf.import_graph_def函数的人来说,这应该是直截了当的...我真正需要的是让受过训练的生成器将它应用于一个新的变量z,该变量将在另一个会话中训练。
由于