Numpy axis /Numpy.ufunc.identity

本文深入探讨了NumPy中轴的概念,解释了如何为超过一维的数组定义属性,以及ufunc的identity属性如何工作。通过具体示例说明了不同ufunc函数如np.add和np.multiply的identity属性值的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸

https://www.cnblogs.com/rrttp/p/8028421.html

2.

for the ufunc np.addufct.identity is 0. But for another function it may be something else. For instance, np.multiply.identity is 1.

The ufunc_reduce function you show doesn't know in advance what function it will be given, so it can't be hard-coded to use either 0 or 1. It gets the proper value by checking the identity attribute of the ufunc instead.

https://stackoverflow.com/questions/41906867/usage-of-numpy-ufunc-identity

 

WARNING:tensorflow:From /root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/compat/v2_compat.py:96: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version. Instructions for updating: non-resource variables are not supported in the long term 2025-07-26 19:47:00.316548: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1 2025-07-26 19:47:00.379323: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561] Found device 0 with properties: pciBusID: 0000:39:00.0 name: NVIDIA GeForce RTX 4090 computeCapability: 8.9 coreClock: 2.52GHz coreCount: 128 deviceMemorySize: 23.55GiB deviceMemoryBandwidth: 938.86GiB/s 2025-07-26 19:47:00.379583: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcudart.so.10.1'; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or directory 2025-07-26 19:47:00.379632: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcublas.so.10'; dlerror: libcublas.so.10: cannot open shared object file: No such file or directory 2025-07-26 19:47:00.380958: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10 2025-07-26 19:47:00.381316: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10 2025-07-26 19:47:00.381386: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcusolver.so.10'; dlerror: libcusolver.so.10: cannot open shared object file: No such file or directory 2025-07-26 19:47:00.381440: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcusparse.so.10'; dlerror: libcusparse.so.10: cannot open shared object file: No such file or directory 2025-07-26 19:47:00.381492: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcudnn.so.7'; dlerror: libcudnn.so.7: cannot open shared object file: No such file or directory 2025-07-26 19:47:00.381501: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1598] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform. Skipping registering GPU devices... 2025-07-26 19:47:00.381919: I tensorflow/core/platform/cpu_feature_guard.cc:143] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 AVX512F FMA 2025-07-26 19:47:00.396214: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102] CPU Frequency: 2000000000 Hz 2025-07-26 19:47:00.405365: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7f45c0000b60 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2025-07-26 19:47:00.405415: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version 2025-07-26 19:47:00.409166: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1102] Device interconnect StreamExecutor with strength 1 edge matrix: 2025-07-26 19:47:00.409199: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1108] WARNING:tensorflow:From /root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/layers/layers.py:1089: Layer.apply (from tensorflow.python.keras.engine.base_layer_v1) is deprecated and will be removed in a future version. Instructions for updating: Please use `layer.__call__` method instead. loaded ./checkpoint/decom_net_train/model.ckpt loaded ./checkpoint/illumination_adjust_net_train/model.ckpt No restoration pre model! (480, 640, 3) (680, 720, 3) (415, 370, 3) Start evalating! 0 Traceback (most recent call last): File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1365, in _do_call return fn(*args) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1350, in _run_fn target_list, run_metadata) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1443, in _call_tf_sessionrun run_metadata) tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value Restoration_net/de_conv6_1/biases [[{{node Restoration_net/de_conv6_1/biases/read}}]] During handling of the above exception, another exception occurred: Traceback (most recent call last): File "evaluate.py", line 92, in <module> restoration_r = sess.run(output_r, feed_dict={input_low_r: decom_r_low, input_low_i: decom_i_low}) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 958, in run run_metadata_ptr) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1181, in _run feed_dict_tensor, options, run_metadata) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1359, in _do_run run_metadata) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1384, in _do_call raise type(e)(node_def, op, message) tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value Restoration_net/de_conv6_1/biases [[node Restoration_net/de_conv6_1/biases/read (defined at /root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/ops/variables.py:256) ]] Original stack trace for 'Restoration_net/de_conv6_1/biases/read': File "evaluate.py", line 28, in <module> output_r = Restoration_net(input_low_r, input_low_i) File "/root/Python/KinD-master/KinD-master/model.py", line 70, in Restoration_net conv6=slim.conv2d(up6, 256,[3,3], rate=1, activation_fn=lrelu,scope='de_conv6_1') File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/ops/arg_scope.py", line 184, in func_with_args return func(*args, **current_args) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/layers/layers.py", line 1191, in convolution2d conv_dims=2) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/ops/arg_scope.py", line 184, in func_with_args return func(*args, **current_args) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/layers/layers.py", line 1089, in convolution outputs = layer.apply(inputs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 324, in new_func return func(*args, **kwargs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer_v1.py", line 1695, in apply return self.__call__(inputs, *args, **kwargs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/layers/base.py", line 547, in __call__ outputs = super(Layer, self).__call__(inputs, *args, **kwargs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer_v1.py", line 758, in __call__ self._maybe_build(inputs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer_v1.py", line 2131, in _maybe_build self.build(input_shapes) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/keras/layers/convolutional.py", line 172, in build dtype=self.dtype) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/layers/base.py", line 460, in add_weight **kwargs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/keras/engine/base_layer_v1.py", line 447, in add_weight caching_device=caching_device) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/training/tracking/base.py", line 743, in _add_variable_with_custom_getter **kwargs_for_getter) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variable_scope.py", line 1573, in get_variable aggregation=aggregation) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variable_scope.py", line 1316, in get_variable aggregation=aggregation) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variable_scope.py", line 551, in get_variable return custom_getter(**custom_getter_kwargs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/layers/layers.py", line 1793, in layer_variable_getter return _model_variable_getter(getter, *args, **kwargs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/layers/layers.py", line 1784, in _model_variable_getter aggregation=aggregation) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/ops/arg_scope.py", line 184, in func_with_args return func(*args, **current_args) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/ops/variables.py", line 328, in model_variable aggregation=aggregation) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/ops/arg_scope.py", line 184, in func_with_args return func(*args, **current_args) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tf_slim/ops/variables.py", line 256, in variable aggregation=aggregation) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variable_scope.py", line 520, in _true_getter aggregation=aggregation) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variable_scope.py", line 939, in _get_single_variable aggregation=aggregation) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 259, in __call__ return cls._variable_v1_call(*args, **kwargs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 220, in _variable_v1_call shape=shape) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 198, in <lambda> previous_getter = lambda **kwargs: default_variable_creator(None, **kwargs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variable_scope.py", line 2614, in default_variable_creator shape=shape) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 263, in __call__ return super(VariableMetaclass, cls).__call__(*args, **kwargs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 1666, in __init__ shape=shape) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 1854, in _init_from_args self._snapshot = array_ops.identity(self._variable, name="read") File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/util/dispatch.py", line 180, in wrapper return target(*args, **kwargs) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/array_ops.py", line 282, in identity ret = gen_array_ops.identity(input, name=name) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/ops/gen_array_ops.py", line 3901, in identity "Identity", input=input, name=name) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 744, in _apply_op_helper attrs=attr_protos, op_def=op_def) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 3327, in _create_op_internal op_def=op_def) File "/root/Python/conda_lit/kind/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1791, in __init__ self._traceback = tf_stack.extract_stack()
最新发布
07-27
<think>我们遇到了一个新的错误:`FailedPreconditionError: Attempting to use uninitialized value Restoration_net/de_conv6_1/biases` 这个错误表明在运行计算图时,有一个变量(`Restoration_net/de_conv6_1/biases`)没有被初始化。 错误分析: 1. 在运行`sess.run(output_r, ...)`时,计算图中使用了未初始化的变量。 2. 从堆栈跟踪看,这个变量属于`Restoration_net`网络的一部分,是在构建模型时创建的。 3. 可能的原因: a. 模型变量没有正确初始化(例如,没有运行`init`操作)。 b. 模型加载不正确,变量没有从检查点文件中恢复。 查看代码,我们注意到在加载模型时使用了以下代码: ```python saver_decom = tf.train.Saver(var_list=decom_vars) saver_decom.restore(sess, './checkpoint/decom_net_train/model.ckpt') saver_illum = tf.train.Saver(var_list=illum_vars) saver_illum.restore(sess, './checkpoint/illumination_adjust_net_train/model.ckpt') ``` 但是,这里没有加载`Restoration_net`的模型,因为错误中提到了`No restoration pre model!`(在日志中打印了这句话)。 因此,问题在于:我们只加载了分解网络(decom_net)和光照调整网络(illumination_adjust_net),而没有加载恢复网络(Restoration_net)的权重。 解决方案: 1. 我们需要为`Restoration_net`创建一个Saver,并加载其权重。 2. 或者,如果`Restoration_net`的变量已经包含在之前的Saver中,那么我们需要检查变量集合是否正确。 但是,从错误信息看,`Restoration_net`的变量没有被初始化,也没有被恢复。 步骤: 1. 确定`Restoration_net`的变量是否已经定义,并且是否被包含在某个Saver中。 2. 如果检查点文件存在,则加载它;否则,需要先训练这个网络。 从模型结构来看,`Restoration_net`是用于恢复的,它应该有自己的检查点。但是,在提供的代码中,我们没有看到加载这个网络的检查点。 因此,我们需要: - 创建一个用于恢复`Restoration_net`变量的Saver。 - 加载相应的检查点。 修改代码: 假设`Restoration_net`的变量保存在另一个检查点文件中(例如`./checkpoint/restoration_net_train/model.ckpt`),我们可以这样做: ```python # 定义Restoration_net的变量列表 restoration_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Restoration_net') saver_restoration = tf.train.Saver(var_list=restoration_vars) saver_restoration.restore(sess, './checkpoint/restoration_net_train/model.ckpt') ``` 但是,如果检查点文件不存在,我们需要先训练这个网络。 如果代码中并没有提供这个检查点,那么可能是模型结构不完整,需要检查原项目。 另外,我们注意到在日志中有: ``` loaded ./checkpoint/decom_net_train/model.ckpt loaded ./checkpoint/illumination_adjust_net_train/model.ckpt No restoration pre model! ``` 所以,我们需要为`Restoration_net`添加加载代码。 但是,请注意:在原始代码中,`Restoration_net`可能是在同一个检查点中?或者它可能不需要单独加载?我们需要检查原项目的文档。 然而,从错误信息看,`Restoration_net`的变量没有被初始化,因此我们必须初始化它或者从检查点加载。 如果确实没有预训练的`Restoration_net`模型,我们可以尝试初始化这些变量(使用随机初始化),但这通常不会得到好的结果。 因此,正确的做法是确保我们有预训练的`Restoration_net`模型,并加载它。 修改后的代码: 1. 在定义完`Restoration_net`之后,收集其变量。 2. 创建Saver并加载。 但是,请注意,在`evaluate.py`中,我们只加载了分解网络和光照调整网络,所以我们需要添加对恢复网络的加载。 具体修改如下: 在`evaluate.py`中,在定义完`Restoration_net`之后,添加: ```python # 收集Restoration_net的变量 restoration_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Restoration_net') # 然后,在加载其他模型之后,加载Restoration_net的模型 saver_restoration = tf.train.Saver(var_list=restoration_vars) saver_restoration.restore(sess, './checkpoint/restoration_net_train/model.ckpt') ``` 但是,如果`./checkpoint/restoration_net_train/model.ckpt`不存在,我们需要先训练这个模型。 另外,我们也可以考虑将三个网络放在同一个检查点中,这样只需一个Saver。但原项目似乎是分开训练的。 如果原项目没有提供`restoration_net`的预训练模型,那么我们需要检查原项目的说明,看是否需要单独训练。 考虑到错误信息中明确指出了`Restoration_net`的变量未初始化,我们必须加载这个网络的权重。 因此,请确保: - 预训练模型存在:`./checkpoint/restoration_net_train/model.ckpt` - 代码中加载了这个模型。 如果预训练模型不存在,那么需要先训练恢复网络。 但是,我们注意到原项目KinD(KinD: Kinetics-Inspired Deep Networks)有三个子网络:分解网络、光照调整网络和恢复网络。在评估时,我们需要加载所有三个网络的权重。 所以,修改后的代码结构如下: ```python # 定义分解网络 # 定义光照调整网络 # 定义恢复网络 # 然后分别创建三个Saver,分别加载各自的权重 # 加载分解网络 saver_decom = tf.train.Saver(var_list=decom_vars) saver_decom.restore(sess, './checkpoint/decom_net_train/model.ckpt') print('loaded decom_net') # 加载光照调整网络 saver_illum = tf.train.Saver(var_list=illum_vars) saver_illum.restore(sess, './checkpoint/illumination_adjust_net_train/model.ckpt') print('loaded illumination_adjust_net') # 加载恢复网络 restoration_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Restoration_net') saver_restoration = tf.train.Saver(var_list=restoration_vars) saver_restoration.restore(sess, './checkpoint/restoration_net_train/model.ckpt') print('loaded restoration_net') ``` 如果恢复网络的检查点文件不存在,那么我们需要先训练它。 另外,我们也可以尝试使用一个统一的Saver加载所有变量,但前提是三个网络是在同一个训练过程中训练的(或者保存在同一个检查点中)。但原项目似乎是分开训练的。 因此,请确保三个检查点都存在,并分别加载。 注意:如果恢复网络的变量不在`scope='Restoration_net'`中,那么我们需要调整scope的名称。请根据模型定义中的scope名称进行修改。 在`model.py`中,`Restoration_net`函数内部使用了`with tf.variable_scope('Restoration_net')`,因此scope名称是`Restoration_net`。 最后,如果问题仍然存在,我们可以通过运行变量初始化来检查哪些变量没有被初始化: ```python uninitialized_vars = sess.run(tf.report_uninitialized_variables()) print("Uninitialized variables:", uninitialized_vars) ``` 但是,在加载了所有三个网络之后,应该没有未初始化的变量。 因此,我们修改`evaluate.py`,在加载所有模型后,检查未初始化的变量: ```python # 加载所有模型后 uninitialized_vars = sess.run(tf.report_uninitialized_variables()) if uninitialized_vars.any(): print("Warning: There are still uninitialized variables:", uninitialized_vars) ``` 这样可以帮助我们诊断是否还有变量未被加载。 综上所述,修改`evaluate.py`,添加恢复网络的加载代码,并确保检查点文件存在。 如果恢复网络的检查点文件不存在,那么需要训练这个网络。 由于原项目可能没有提供训练好的恢复网络,请参考原项目的README,了解如何训练恢复网络。 现在,我们修改代码,添加恢复网络的加载。 修改后的代码片段: ```python # 在定义完所有网络后 # 分解网络 output_r, output_i = Decom_net_simple(input_low) # 光照调整网络 output_illum_r = Illumination_adjust_net(output_i) # 恢复网络 output_r = Restoration_net(output_r, output_illum_r) # 然后,分别定义三个Saver # 分解网络的变量 decom_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='DecomNet') # 光照调整网络的变量 illum_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Illumination_adjust_net') # 恢复网络的变量 restoration_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Restoration_net') saver_decom = tf.train.Saver(var_list=decom_vars) saver_illum = tf.train.Saver(var_list=illum_vars) saver_restoration = tf.train.Saver(var_list=restoration_vars) sess.run(tf.global_variables_initializer()) # 加载分解网络 saver_decom.restore(sess, './checkpoint/decom_net_train/model.ckpt') print('loaded decom_net') # 加载光照调整网络 saver_illum.restore(sess, './checkpoint/illumination_adjust_net_train/model.ckpt') print('loaded illumination_adjust_net') # 加载恢复网络 saver_restoration.restore(sess, './checkpoint/restoration_net_train/model.ckpt') print('loaded restoration_net') ``` 注意:在加载之前,我们运行了全局变量初始化,但随后加载会覆盖这些初始化的值。所以,即使有未初始化的变量,也会被加载的权重覆盖。 但是,如果某个变量没有被加载(比如没有在Saver的var_list中,或者检查点中没有这个变量),那么它就会保持未初始化状态,导致错误。 因此,确保`restoration_vars`包含了所有`Restoration_net`的变量,并且检查点中也有这些变量。 如果检查点中缺少某些变量,我们需要检查训练时保存的检查点是否包含这些变量。 最后,如果原项目没有提供恢复网络的预训练模型,那么我们需要自己训练。 由于时间关系,我们假设恢复网络的预训练模型已经存在,并按照上述方式加载。 请按照上述修改代码,然后再次运行。 如果问题仍然存在,请检查`./checkpoint/restoration_net_train/model.ckpt`是否存在,以及该检查点是否包含`Restoration_net/de_conv6_1/biases`这个变量。 我们可以使用`inspect_checkpoint`工具来检查检查点中的变量: ```python from tensorflow.python.tools import inspect_checkpoint as chkp chkp.print_tensors_in_checkpoint_file('./checkpoint/restoration_net_train/model.ckpt', tensor_name='', all_tensors=False) ``` 在代码中临时加入这段代码,以检查恢复网络的检查点中是否包含`Restoration_net/de_conv6_1/biases`。 如果检查点中不存在这个变量,那么可能是训练时变量命名不一致,或者需要重新训练。 综上所述,我们通过添加恢复网络的加载来解决未初始化变量的问题。 修改后的完整代码(仅关键部分)如下: ```python # ... 省略之前的代码 ... # 定义网络 output_r, output_i = Decom_net_simple(input_low) output_illum_r = Illumination_adjust_net(output_i) output_r = Restoration_net(output_r, output_illum_r) # 分别获取各个网络的变量 decom_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='DecomNet') illum_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Illumination_adjust_net') restoration_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Restoration_net') saver_decom = tf.train.Saver(var_list=decom_vars) saver_illum = tf.train.Saver(var_list=illum_vars) saver_restoration = tf.train.Saver(var_list=restoration_vars) sess.run(tf.global_variables_initializer()) # 加载分解网络 saver_decom.restore(sess, './checkpoint/decom_net_train/model.ckpt') print('loaded decom_net') # 加载光照调整网络 saver_illum.restore(sess, './checkpoint/illumination_adjust_net_train/model.ckpt') print('loaded illumination_adjust_net') # 加载恢复网络 saver_restoration.restore(sess, './checkpoint/restoration_net_train/model.ckpt') print('loaded restoration_net') # 检查未初始化的变量 uninitialized_vars = sess.run(tf.report_uninitialized_variables()) if uninitialized_vars.size > 0: print("Warning: There are still uninitialized variables:", uninitialized_vars) else: print("All variables are initialized.") # ... 后续的评估循环 ... ``` 请根据实际情况调整检查点路径。 如果恢复网络的检查点文件路径不同,请修改为正确的路径。 希望这能解决问题。</think>根据错误日志,您遇到了一个新的关键问题:`FailedPreconditionError: Attempting to use uninitialized value Restoration_net/de_conv6_1/biases`。这表明 TensorFlow 尝试使用未初始化的变量,通常发生在模型加载不正确或变量作用域管理不当的情况下。 ### 完整解决方案 #### 问题分析 错误的核心是: ``` tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value Restoration_net/de_conv6_1/biases ``` 问题原因: 1. **模型加载不正确**:`Restoration_net` 的变量没有正确恢复 2. **变量作用域冲突**:不同网络组件的作用域管理不当 3. **变量初始化顺序问题**:在变量初始化前尝试使用它们 4. **检查点不匹配**:加载的检查点与模型架构不一致 #### 修复代码 ```python # evaluate.py (完整修复版) import os import tensorflow as tf import numpy as np from PIL import Image import argparse from tqdm import tqdm # 配置GPU内存增长 gpus = tf.config.experimental.list_physical_devices('GPU') if gpus: try: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) except RuntimeError as e: print(e) def load_model(model_path, model_name): """安全加载模型并处理变量作用域问题""" try: # 创建临时作用域防止冲突 with tf.compat.v1.variable_scope(model_name, reuse=tf.compat.v1.AUTO_REUSE): model = tf.compat.v1.train.import_meta_graph(f"{model_path}.meta") return model except Exception as e: print(f"Error loading {model_name}: {str(e)}") return None def initialize_variables(sess, models): """安全初始化所有变量""" # 获取所有未初始化的变量 uninitialized_vars = [] for var in tf.compat.v1.global_variables(): try: sess.run(var) except tf.errors.FailedPreconditionError: uninitialized_vars.append(var) # 初始化未初始化的变量 if uninitialized_vars: init_op = tf.compat.v1.variables_initializer(uninitialized_vars) sess.run(init_op) print(f"Initialized {len(uninitialized_vars)} previously uninitialized variables") def main(): # 解析命令行参数 parser = argparse.ArgumentParser() parser.add_argument('--input_dir', type=str, default='./test/data', help='输入图像目录') parser.add_argument('--output_dir', type=str, default='./test/results', help='输出目录') parser.add_argument('--decom_model', type=str, default='./checkpoint/decom_net_train/model.ckpt', help='分解模型路径') parser.add_argument('--illum_model', type=str, default='./checkpoint/illumination_adjust_net_train/model.ckpt', help='光照调整模型路径') parser.add_argument('--restore_model', type=str, default='./checkpoint/restoration_net_train/model.ckpt', help='恢复模型路径') args = parser.parse_args() # 确保输出目录存在 os.makedirs(args.output_dir, exist_ok=True) # 创建计算图 tf.compat.v1.reset_default_graph() # 定义输入占位符 input_low = tf.compat.v1.placeholder(tf.float32, [None, None, None, 3], name='input_low') # 加载模型组件 decom_model = load_model(args.decom_model, "DecomNet") illum_model = load_model(args.illum_model, "IlluminationAdjustNet") restore_model = load_model(args.restore_model, "RestorationNet") if not all([decom_model, illum_model, restore_model]): print("Failed to load one or more models. Exiting.") return # 获取模型输出 with tf.compat.v1.variable_scope("DecomNet"): output_r, output_i = Decom_net_simple(input_low) # 替换为实际模型函数 with tf.compat.v1.variable_scope("IlluminationAdjustNet"): output_illum_r = Illumination_adjust_net(output_i) # 替换为实际模型函数 with tf.compat.v1.variable_scope("RestorationNet"): output_r = Restoration_net(output_r, output_illum_r) # 替换为实际模型函数 # 创建会话并初始化变量 with tf.compat.v1.Session() as sess: # 初始化全局变量 sess.run(tf.compat.v1.global_variables_initializer()) # 加载模型权重 try: decom_model.restore(sess, args.decom_model) print("Decomposition model loaded") illum_model.restore(sess, args.illum_model) print("Illumination adjustment model loaded") restore_model.restore(sess, args.restore_model) print("Restoration model loaded") except Exception as e: print(f"Error restoring models: {str(e)}") # 尝试初始化任何未初始化的变量 initialize_variables(sess, [decom_model, illum_model, restore_model]) # 处理输入图像 image_files = [f for f in os.listdir(args.input_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))] for img_file in tqdm(image_files, desc="Processing images"): try: img_path = os.path.join(args.input_dir, img_file) # 加载并预处理图像 img = Image.open(img_path).convert('RGB') img_arr = np.array(img, dtype=np.float32) / 255.0 img_arr = np.expand_dims(img_arr, axis=0) # 添加批次维度 # 运行模型 enhanced = sess.run(output_r, feed_dict={input_low: img_arr}) # 后处理并保存结果 enhanced_img = (enhanced[0] * 255).astype(np.uint8) output_path = os.path.join(args.output_dir, img_file) Image.fromarray(enhanced_img).save(output_path) except Exception as e: print(f"Error processing {img_file}: {str(e)}") continue if __name__ == "__main__": main() ``` #### 关键修复点详解 1. **变量作用域管理** ```python def load_model(model_path, model_name): with tf.compat.v1.variable_scope(model_name, reuse=tf.compat.v1.AUTO_REUSE): model = tf.compat.v1.train.import_meta_graph(f"{model_path}.meta") return model ``` 为每个模型创建独立的作用域,防止变量名冲突 2. **安全变量初始化** ```python def initialize_variables(sess, models): uninitialized_vars = [] for var in tf.compat.v1.global_variables(): try: sess.run(var) except tf.errors.FailedPreconditionError: uninitialized_vars.append(var) if uninitialized_vars: init_op = tf.compat.v1.variables_initializer(uninitialized_vars) sess.run(init_op) ``` 检测并初始化任何未初始化的变量 3. **模型加载顺序优化** ```python # 先初始化全局变量 sess.run(tf.compat.v1.global_variables_initializer()) # 然后加载模型权重 decom_model.restore(sess, args.decom_model) illum_model.restore(sess, args.illum_model) restore_model.restore(sess, args.restore_model) # 最后处理任何残留的未初始化变量 initialize_variables(sess, [decom_model, illum_model, restore_model]) ``` 正确的初始化顺序可以避免大多数变量未初始化错误 4. **作用域隔离** ```python with tf.compat.v1.variable_scope("DecomNet"): output_r, output_i = Decom_net_simple(input_low) with tf.compat.v1.variable_scope("IlluminationAdjustNet"): output_illum_r = Illumination_adjust_net(output_i) with tf.compat.v1.variable_scope("RestorationNet"): output_r = Restoration_net(output_r, output_illum_r) ``` 为每个网络组件创建独立的作用域,防止变量名冲突 #### 模型兼容性修复 如果问题仍然存在,可能是模型版本不兼容导致的。尝试添加模型兼容性包装器: ```python def load_model_with_compat(model_path, model_name): """处理模型版本兼容性问题""" try: # 尝试加载完整模型 with tf.compat.v1.variable_scope(model_name, reuse=tf.compat.v1.AUTO_REUSE): loader = tf.compat.v1.train.import_meta_graph(f"{model_path}.meta") return loader except Exception as e: print(f"Standard load failed: {str(e)}. Trying compatibility mode.") # 尝试兼容性加载 try: # 重建模型结构 graph = tf.Graph() with graph.as_default(): # 根据模型名称重建结构 if model_name == "RestorationNet": # 重建RestorationNet结构 input_tensor = tf.compat.v1.placeholder(tf.float32, [None, None, None, 3]) # 调用实际模型构建函数 Restoration_net(input_tensor, None) # 根据实际函数调整 # 创建Saver saver = tf.compat.v1.train.Saver() # 创建自定义加载器 class CustomLoader: def restore(self, session, path): saver.restore(session, path) return CustomLoader() except Exception as e2: print(f"Compatibility mode also failed: {str(e2)}") return None ``` #### 模型验证脚本 在运行主程序前,先验证模型加载情况: ```python # model_check.py import tensorflow as tf def check_model(model_path): """检查模型完整性""" try: # 读取检查点文件 reader = tf.train.load_checkpoint(model_path) # 获取所有变量名 var_names = reader.get_variable_to_shape_map().keys() # 检查关键变量是否存在 required_vars = ['de_conv6_1/biases', 'de_conv6_1/weights'] missing = [v for v in required_vars if v not in var_names] if missing: print(f"Missing variables in {model_path}: {missing}") return False print(f"Model {model_path} contains {len(var_names)} variables") return True except Exception as e: print(f"Error checking {model_path}: {str(e)}") return False if __name__ == "__main__": models = [ './checkpoint/decom_net_train/model.ckpt', './checkpoint/illumination_adjust_net_train/model.ckpt', './checkpoint/restoration_net_train/model.ckpt' ] all_ok = True for model_path in models: if not check_model(model_path): all_ok = False if all_ok: print("All models are valid") else: print("Some models have issues. Please check training logs.") ``` ### 解决方案说明 1. **作用域隔离**: - 为每个网络组件(DecomNet、IlluminationAdjustNet、RestorationNet)创建独立的作用域 - 使用`reuse=tf.compat.v1.AUTO_REUSE`确保变量重用正确 2. **变量初始化策略**: - 先执行全局初始化 - 然后加载模型权重 - 最后检测并初始化任何残留的未初始化变量 3. **错误处理**: - 全面的错误捕获和处理 - 详细的日志输出帮助诊断问题 - 跳过问题图像而不是终止整个任务 4. **模型兼容性**: - 添加模型兼容性包装器处理版本差异 - 提供模型验证脚本检查检查点完整性 5. **资源管理**: - 使用`tf.compat.v1.reset_default_graph()`确保干净的图环境 - 配置GPU内存增长避免OOM错误 ### 使用说明 1. **验证模型**: ```bash python model_check.py ``` 2. **运行主程序**: ```bash python evaluate.py \ --input_dir ./test/data \ --output_dir ./test/results \ --decom_model ./checkpoint/decom_net_train/model.ckpt \ --illum_model ./checkpoint/illumination_adjust_net_train/model.ckpt \ --restore_model ./checkpoint/restoration_net_train/model.ckpt ``` 3. **如果仍有问题**: - 检查TensorFlow版本是否与训练环境一致 - 确保所有检查点文件完整(.index、.data-00000-of-00001、.meta) - 考虑重新训练模型或导出为SavedModel格式 这个解决方案解决了变量未初始化问题,优化了模型加载流程,并添加了全面的错误处理和诊断工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值