在同一个图中恢复两个tensorflow模型

在同一个图中恢复两个tensorflow模型,tensorflow,Tensorflow,我试图将两个预先训练好的模型(相同的体系结构,不同的初始化)恢复到相同的tensorflow图中(例如,为了计算欺骗两个模型的对抗性示例) 简而言之:我能够在不同的范围内恢复这两个模型,并做出正确的预测。但是,当我试图计算损失梯度时,我得到了一个无效的参数。在尝试重新计算我可以在评估梯度之前成功计算的预测时,错误仍然存在 具体地说,我有一个模型检查点列表 models_ckpts = [model_chkpt0, model_chkpt1] 然后,我在不同的范围内声明了两个模型(该模型是来自的

我试图将两个预先训练好的模型(相同的体系结构,不同的初始化)恢复到相同的tensorflow图中(例如,为了计算欺骗两个模型的对抗性示例)

简而言之:我能够在不同的范围内恢复这两个模型,并做出正确的预测。但是,当我试图计算损失梯度时,我得到了一个无效的参数。在尝试重新计算我可以在评估梯度之前成功计算的预测时,错误仍然存在

具体地说,我有一个模型检查点列表

models_ckpts = [model_chkpt0, model_chkpt1]
然后,我在不同的范围内声明了两个模型(该模型是来自的标准ResNet18)

我使用以下功能恢复它们:

def restore_collection(path, scopename, sess):
  variables = {v.name: v for v in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scopename)}
  for var_name, _ in tf.train.list_variables(path):
    try:
      var_value = tf.train.load_variable(path, var_name)
      target_var_name = '%s/%s:0' % (scopename, var_name)
      target_variable = variables[target_var_name]
      sess.run(target_variable.assign(var_value))
    except:
      pass
然后,我启动一个会话,并使用上面的restore_collection函数恢复这两个模型

sess = tf.Session()
for k, path in enumerate(models_ckpts):
  restore_collection(path, scopename='model_%03i' % k, sess=sess)
我可以使用恢复的模型来计算准确的交叉熵:

for k, _ in enumerate(models_ckpts):
  print(sess.run(models[k].xent, feed_dict={models[k].x_input: test_data,
                                            models[k].y_input: test_labels}))
然后,我声明第一个模型的交叉熵相对于输入的梯度(例如,计算对抗性示例:

with tf.variable_scope('model_000'):
  grad = tf.gradients(models[0].xent, models[0].x_input)[0]
当按如下方式计算这些梯度时,我得到一个错误

_grad = sess.run(grad, feed_dict={models[0].x_input: train_data,
                                  models[0].y_input: train_labels})

InvalidArgumentError                      Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in _do_call(self, fn, *args)
   1364     try:
-> 1365       return fn(*args)
   1366     except errors.OpError as e:

6 frames
InvalidArgumentError: Node 'gradients/model_000/input/map/while_grad/model_000/input/map/while_grad': Connecting to invalid output 6 of source node model_000/input/map/while which has 6 outputs. Try using tf.compat.v1.experimental.output_all_intermediates(True).
当我尝试重新评估我先前计算的交叉熵时,我继续得到同样的错误

for k, _ in enumerate(models_ckpts):
  print(sess.run(models[k].xent, feed_dict={models[k].x_input: test_data,
                                            models[k].y_input: test_labels}))

在恢复变量之前,将梯度与模型一起声明可以消除错误:

from model import Model
models, gradients = [], []
for k, path in enumerate(models_ckpts):
  with tf.variable_scope('model_%03i' % k):
    models.append(Model(mode='eval'))
    gradients.append(tf.gradients(models[0].xent, models[0].x_input)[0])
from model import Model
models, gradients = [], []
for k, path in enumerate(models_ckpts):
  with tf.variable_scope('model_%03i' % k):
    models.append(Model(mode='eval'))
    gradients.append(tf.gradients(models[0].xent, models[0].x_input)[0])