我正在尝试实施Adversarial NN,它需要在交替训练小批量时"冻结"图形的一个或另一个部分.即有两个子网:G和D.
G( Z ) -> Xz
D( X ) -> Y
Run Code Online (Sandbox Code Playgroud)
其中损失函数G取决于D[G(Z)], D[X].
首先,我需要在D中训练所有G参数固定的参数,然后在G中参数D中的参数固定.第一种情况下的损失函数将是第二种情况下的负损失函数,并且更新将必须应用于第一或第二子网的参数.
我看到张量流有tf.stop_gradient功能.为了训练D(下游)子网,我可以使用此功能来阻止梯度流
Z -> [ G ] -> tf.stop_gradient(Xz) -> [ D ] -> Y
Run Code Online (Sandbox Code Playgroud)
这tf.stop_gradient是非常简洁的注释,没有内联示例(例子seq2seq.py太长而且不容易阅读),但看起来它必须在图形创建期间调用.这是否意味着如果我想在交替批次中阻止/解除阻塞梯度流,我需要重新创建并重新初始化图模型?
也似乎无法阻止流经G(上游)网络的梯度tf.stop_gradient,对吧?
作为替代方案,我看到可以将变量列表传递给优化器调用opt_op = opt.minimize(cost, <list of variables>),如果可以在每个子网的范围内获取所有变量,这将是一个简单的解决方案.可以获得<list of variables>一个tf.scope吗?
在TensorFlow中初始化变量的标准方法是
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
Run Code Online (Sandbox Code Playgroud)
在运行了一段时间的学习后,我创建了一组新的变量,但是一旦我初始化它们,它就会重置我现有的所有变量.目前我的方法是保存我需要的所有变量,然后在tf.initalize_all_variables调用之后重新应用它们.这有效,但有点丑陋和笨重.我在文档中找不到这样的东西......
有没有人知道刚刚初始化未初始化变量的任何好方法?
我正在尝试使用张量流中的一些简单模型,包括一个看起来非常类似于ML初学者示例的第一个MNIST,但具有更大的维度.我能够毫无问题地使用梯度下降优化器,获得足够好的收敛性.当我尝试使用ADAM优化器时,出现如下错误:
tensorflow.python.framework.errors.FailedPreconditionError: Attempting to use uninitialized value Variable_21/Adam
[[Node: Adam_2/update_Variable_21/ApplyAdam = ApplyAdam[T=DT_FLOAT, use_locking=false, _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_21, Variable_21/Adam, Variable_21/Adam_1, beta1_power_2, beta2_power_2, Adam_2/learning_rate, Adam_2/beta1, Adam_2/beta2, Adam_2/epsilon, gradients_11/add_10_grad/tuple/control_dependency_1)]]
Run Code Online (Sandbox Code Playgroud)
抱怨未初始化的特定变量根据运行而变化.这个错误是什么意思?它表明什么是错的?无论我使用什么学习率,它似乎都会发生.
我想MomentumOptimizer在Tensorflow中使用.但是,由于此优化程序使用某个内部变量,因此尝试在不初始化此变量的情况下使用它会产生错误:
FailedPreconditionError(参见上面的回溯):尝试使用未初始化的值Variable_2/Momentum
例如,通过初始化所有变量可以很容易地解决这个问题
tf.global_variables_initializer().run()
Run Code Online (Sandbox Code Playgroud)
但是,我不想初始化所有变量 - 只有优化器的变量.有没有办法做到这一点?