使用嵌套梯度带计算黑森州矩阵

时间:2020-10-06 14:49:16

标签: python tensorflow neural-network

我正在尝试使用梯度带和2个batch_jacobian函数来计算相对于输入的神经网络输出的Hessian矩阵。第一个函数返回雅可比行列式,正如预期的那样,第二个函数返回一个毫无意义的错误。选择g的[:,0]坐标,因为仅针对一个变量计算了雅可比行列,因此第二根轴的长度仅为1。该代码不会执行超过计算Hessian的点。

 def dynamics(self, x):  # compute guess of dynamics of the system, using current lagrangian model
    with tf.GradientTape() as tape2: # observing the first order derivatives
        tape2.watch(x)
        with tf.GradientTape(persistent = True) as tape:
            tape.watch(x)
            lagrangian = self.lagrangian_net(x)
            print(lagrangian)
        g = tape.batch_jacobian(lagrangian, x, unconnected_gradients='zero')[:, 0]
        print(g)
    hessian = tape2.batch_jacobian(g, x, unconnected_gradients='zero')
    print(hessian)
    U = g[:, 0, :] - tf.einsum("dij,dj->di", hessian[:, 1, :, 0, :], x[:, 1, :])  # U[d,i]
    P = hessian[:, 1, :, 1, :]
    P = tf.map_fn(tf.linalg.inv, P)  # P[d, i, k]
    A = tf.einsum("di,dik->dk", U, P)
    return A  # return accelerations for the batch

错误:

回溯(最近通话最近): 1183行中的文件``C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ backprop.py'',在batch_jacobian中 parallel_iterations = parallel_iterations) pfor中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ ops \ parallel_for \ control_flow_ops.py”,第164行 返回f() 调用中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ function.py”,第1323行 graph_function,args,kwargs = self._maybe_define_function(args,kwargs) _maybe_define_function中的行1652行中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ function.py” graph_function = self._create_graph_function(args,kwargs) _create_graph_function中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ function.py”,行1545 capture_by_value = self._capture_by_value), 在func_graph_from_py_func中的行715中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ framework \ func_graph.py” func_outputs = python_func(* func_args,** func_kwargs) 包装中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ framework \ func_graph.py”,第705行 提高e.ag_error_metadata.to_exception(type(e)) ValueError:转换后的代码: 相对于C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ ops \ parallel_for:

control_flow_ops.py:161 f *
    return _pfor_impl(loop_fn, iters, parallel_iterations=parallel_iterations)
control_flow_ops.py:214 _pfor_impl
    outputs.append(converter.convert(loop_fn_output))
pfor.py:1175 convert
    output = self._convert_helper(y)
pfor.py:1343 _convert_helper
    "which may run slower" % (y_op.type, y_op, converted_inputs))

ValueError: No converter defined for PartitionedCall
name: "loop_body/PartitionedCall"
op: "PartitionedCall"
input: "loop_body/Reshape_4"
input: "loop_body/PartitionedCall/args_1"
input: "loop_body/PartitionedCall/args_2"
input: "loop_body/PartitionedCall/args_3"
input: "loop_body/PartitionedCall/args_4"
input: "loop_body/PartitionedCall/args_5"
attr {
  key: "Tin"
  value {
    list {
      type: DT_DOUBLE
      type: DT_DOUBLE
      type: DT_DOUBLE
      type: DT_DOUBLE
      type: DT_DOUBLE
      type: DT_INT32
    }
  }
}
attr {
  key: "Tout"
  value {
    list {
      type: DT_DOUBLE
      type: DT_DOUBLE
    }
  }
}
attr {
  key: "_gradient_op_type"
  value {
    s: "PartitionedCall-385"
  }
}
attr {
  key: "config"
  value {
    s: ""
  }
}
attr {
  key: "config_proto"
  value {
    s: "\n\007\n\003CPU\020\001\n\007\n\003GPU\020\0002\002J\0008\001"
  }
}
attr {
  key: "executor_type"
  value {
    s: ""
  }
}
attr {
  key: "f"
  value {
    func {
      name: "__inference___backward_f_232_270"
    }
  }
}

inputs: [WrappedTensor(t=<tf.Tensor 'loop_body/Reshape_4/pfor/Reshape:0' shape=(4, 1, 3, 2, 2) dtype=float64>, is_stacked=True, is_sparse_stacked=False), WrappedTensor(t=<tf.Tensor 'loop_body/PartitionedCall/args_1:0' shape=(4, 1) dtype=float64>, is_stacked=False, is_sparse_stacked=False), WrappedTensor(t=<tf.Tensor 'loop_body/PartitionedCall/args_2:0' shape=(3, 1) dtype=float64>, is_stacked=False, is_sparse_stacked=False), WrappedTensor(t=<tf.Tensor 'loop_body/PartitionedCall/args_3:0' shape=(1, 3, 1) dtype=float64>, is_stacked=False, is_sparse_stacked=False), WrappedTensor(t=<tf.Tensor 'loop_body/PartitionedCall/args_4:0' shape=(1, 3, 1) dtype=float64>, is_stacked=False, is_sparse_stacked=False), WrappedTensor(t=<tf.Tensor 'loop_body/PartitionedCall/args_5:0' shape=(3,) dtype=int32>, is_stacked=False, is_sparse_stacked=False)]. 
Either add a converter or set --op_conversion_fallback_to_while_loop=True, which may run slower

在处理上述异常期间,发生了另一个异常:

回溯(最近通话最近): 文件“ C:/ Users / Maks / Desktop / neural / lagrangian neuro network.py”,第129行,在 N.火车(2) 火车上的“ C:/ Users / Maks / Desktop / neural / lagrangian neuro network.py”文件,第110行 self.train_step(x,true_y) 在train_step中的文件“ C:/ Users / Maks / Desktop / neural / lagrangian neuro network.py”第98行 acc = self.dynamics(x) 动态中的文件“ C:/ Users / Maks / Desktop / neural / lagrangian neuro network.py”,第83行 粗麻布= tape2.batch_jacobian(g,x,unconnected_gradients ='零') 1191行中的文件``C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ backprop.py'',在batch_jacobian中 sys.exc_info()[2]) 重新举起文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ six.py”,第702行 提高价值.with_traceback(tb) 1183行中的文件``C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ backprop.py'',在batch_jacobian中 parallel_iterations = parallel_iterations) pfor中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ ops \ parallel_for \ control_flow_ops.py”,第164行 返回f() 调用中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ function.py”,第1323行 graph_function,args,kwargs = self._maybe_define_function(args,kwargs) _maybe_define_function中的行1652行中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ function.py” graph_function = self._create_graph_function(args,kwargs) _create_graph_function中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ function.py”,行1545 capture_by_value = self._capture_by_value), 在func_graph_from_py_func中的行715中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ framework \ func_graph.py” func_outputs = python_func(* func_args,** func_kwargs) 包装中的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ framework \ func_graph.py”,第705行 提高e.ag_error_metadata.to_exception(type(e)) ValueError:转换后的代码: 相对于C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ ops \ parallel_for:

control_flow_ops.py:161 f *
    return _pfor_impl(loop_fn, iters, parallel_iterations=parallel_iterations)
control_flow_ops.py:214 _pfor_impl
    outputs.append(converter.convert(loop_fn_output))
pfor.py:1175 convert
    output = self._convert_helper(y)
pfor.py:1343 _convert_helper
    "which may run slower" % (y_op.type, y_op, converted_inputs))

ValueError: No converter defined for PartitionedCall
name: "loop_body/PartitionedCall"
op: "PartitionedCall"
input: "loop_body/Reshape_4"
input: "loop_body/PartitionedCall/args_1"
input: "loop_body/PartitionedCall/args_2"
input: "loop_body/PartitionedCall/args_3"
input: "loop_body/PartitionedCall/args_4"
input: "loop_body/PartitionedCall/args_5"
attr {
  key: "Tin"
  value {
    list {
      type: DT_DOUBLE
      type: DT_DOUBLE
      type: DT_DOUBLE
      type: DT_DOUBLE
      type: DT_DOUBLE
      type: DT_INT32
    }
  }
}
attr {
  key: "Tout"
  value {
    list {
      type: DT_DOUBLE
      type: DT_DOUBLE
    }
  }
}
attr {
  key: "_gradient_op_type"
  value {
    s: "PartitionedCall-385"
  }
}
attr {
  key: "config"
  value {
    s: ""
  }
}
attr {
  key: "config_proto"
  value {
    s: "\n\007\n\003CPU\020\001\n\007\n\003GPU\020\0002\002J\0008\001"
  }
}
attr {
  key: "executor_type"
  value {
    s: ""
  }
}
attr {
  key: "f"
  value {
    func {
      name: "__inference___backward_f_232_270"
    }
  }
}

inputs: [WrappedTensor(t=<tf.Tensor 'loop_body/Reshape_4/pfor/Reshape:0' shape=(4, 1, 3, 2, 2) dtype=float64>, is_stacked=True, is_sparse_stacked=False), WrappedTensor(t=<tf.Tensor 'loop_body/PartitionedCall/args_1:0' shape=(4, 1) dtype=float64>, is_stacked=False, is_sparse_stacked=False), WrappedTensor(t=<tf.Tensor 'loop_body/PartitionedCall/args_2:0' shape=(3, 1) dtype=float64>, is_stacked=False, is_sparse_stacked=False), WrappedTensor(t=<tf.Tensor 'loop_body/PartitionedCall/args_3:0' shape=(1, 3, 1) dtype=float64>, is_stacked=False, is_sparse_stacked=False), WrappedTensor(t=<tf.Tensor 'loop_body/PartitionedCall/args_4:0' shape=(1, 3, 1) dtype=float64>, is_stacked=False, is_sparse_stacked=False), WrappedTensor(t=<tf.Tensor 'loop_body/PartitionedCall/args_5:0' shape=(3,) dtype=int32>, is_stacked=False, is_sparse_stacked=False)]. 
Either add a converter or set --op_conversion_fallback_to_while_loop=True, which may run slower

在向量化batch_jacobian计算时遇到异常。可以通过将experimental_use_pfor设置为False来禁用矢量化。 在以下位置忽略了异常: del at 0x0000026FE02C50D8> 追溯(最近一次通话): del 中的第305行的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ function.py” 文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ context.py”,行1663,在remove_function中 文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ context.py”,行865,在remove_function中 TypeError:“ NoneType”对象不可调用 在以下位置忽略了异常: del at 0x0000026FE02C50D8> 追溯(最近一次通话): del 中的第305行的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ function.py” 文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ context.py”,行1663,在remove_function中 文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ context.py”,行865,在remove_function中 TypeError:“ NoneType”对象不可调用 在以下位置忽略了异常: del at 0x0000026FE02C50D8> 追溯(最近一次通话): del 中的第305行的文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ function.py” 文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ context.py”,行1663,在remove_function中 文件“ C:\ Users \ Maks \ Anaconda3 \ envs \ machine_learning \ lib \ site-packages \ tensorflow \ python \ eager \ context.py”,行865,在remove_function中 TypeError:“ NoneType”对象不可调用

1 个答案:

答案 0 :(得分:0)

已通过更新为tensorflow 2.1解决了