слабый объект исчез - что это значит? - PullRequest
0 голосов
/ 31 октября 2019

Я использую tenorflow для задачи, в которой есть функция, которая вызывается один раз и работает правильно, но во второй раз она называется ошибкой «слабый объект исчез», и я не понимаю, что это значити где проблема может быть.

Полный трекбек выглядит следующим образом:

----------------------------------------------------------------------
TypeError                            Traceback (most recent call last)
~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in _hash_fix(self, elem)
    108     try:
--> 109       hash(elem)
    110     except TypeError:

TypeError: weak object has gone away

During handling of the above exception, another exception occurred:

AttributeError                       Traceback (most recent call last)
<ipython-input-23-f1a95ac20255> in <module>
----> 1 default_settings['sur_model'].predict_with_grad(np.atleast_2d(xx))

<ipython-input-5-7e554cb74b1d> in predict_with_grad(self, x)
    127 
    128         with tf.GradientTape() as t:
--> 129             m, v = self.predict(x)
    130             dmdx = t.gradient(m, x)
    131         with tf.GradientTape() as t:

<ipython-input-5-7e554cb74b1d> in predict(self, X)
    116         """
    117 
--> 118         X_embed = self.embedding_model(X)
    119         #print('X_embed',X_embed)
    120         m, v = self.Pr_model.predict_y(X_embed)

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/base_layer.py in __call__(self, inputs, *args, **kwargs)
    889           with base_layer_utils.autocast_context_manager(
    890               self._compute_dtype):
--> 891             outputs = self.call(cast_inputs, *args, **kwargs)
    892           self._handle_activity_regularization(inputs, outputs)
    893           self._set_mask_metadata(inputs, outputs, input_masks)

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/def_function.py in __call__(self, *args, **kwds)
    455 
    456     tracing_count = self._get_tracing_count()
--> 457     result = self._call(*args, **kwds)
    458     if tracing_count == self._get_tracing_count():
    459       self._call_counter.called_without_tracing()

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/def_function.py in _call(self, *args, **kwds)
    492       # In this case we have not created variables on the first call. So we can
    493       # run the first trace but we should fail if variables are created.
--> 494       results = self._stateful_fn(*args, **kwds)
    495       if self._created_variables:
    496         raise ValueError("Creating variables on a non-first call to a function"

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in __call__(self, *args, **kwargs)
   1820   def __call__(self, *args, **kwargs):
   1821     """Calls a graph function specialized to the inputs."""
-> 1822     graph_function, args, kwargs = self._maybe_define_function(args, kwargs)
   1823     return graph_function._filtered_call(args, kwargs)  # pylint: disable=protected-access
   1824 

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in _maybe_define_function(self, args, kwargs)
   2117 
   2118     with self._lock:
-> 2119       graph_function = self._function_cache.primary.get(cache_key, None)
   2120       if graph_function is not None:
   2121         return graph_function, args, kwargs

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in __eq__(self, other)
    115 
    116   def __eq__(self, other):
--> 117     return self._fields_safe == other._fields_safe  # pylint: disable=protected-access
    118 
    119 

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in _fields_safe(self)
     91   def _fields_safe(self):
     92     """Hash & equality-safe version of all the namedtuple fields."""
---> 93     return (self._hash_fix(self.input_signature), self.parent_graph,
     94             self.device_functions, self.colocation_stack,
     95             self.in_cross_replica_context)

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in _hash_fix(self, elem)
     99     # Descend into tuples
    100     if isinstance(elem, tuple):
--> 101       return tuple(self._hash_fix(i) for i in elem)
    102 
    103     if isinstance(elem, set):

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in <genexpr>(.0)
     99     # Descend into tuples
    100     if isinstance(elem, tuple):
--> 101       return tuple(self._hash_fix(i) for i in elem)
    102 
    103     if isinstance(elem, set):

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in _hash_fix(self, elem)
     99     # Descend into tuples
    100     if isinstance(elem, tuple):
--> 101       return tuple(self._hash_fix(i) for i in elem)
    102 
    103     if isinstance(elem, set):

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in <genexpr>(.0)
     99     # Descend into tuples
    100     if isinstance(elem, tuple):
--> 101       return tuple(self._hash_fix(i) for i in elem)
    102 
    103     if isinstance(elem, set):

~/.local/share/virtualenvs/tf-tRAPLeXL/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py in _hash_fix(self, elem)
    110     except TypeError:
    111       v = elem()
--> 112       return (v.__class__, tensor_spec.TensorSpec(v.shape, v.dtype))
    113 
    114     return elem

AttributeError: 'NoneType' object has no attribute 'shape'

Я нахожу это довольно странным и не нашел подсказки, чтобы узнать, откуда мне это исправить.

1 Ответ

1 голос
/ 31 октября 2019

Я предполагаю, что вы используете tf.function /@tf.function где-то в вашем коде, и вы, возможно, пытаетесь переопределить объект, в результате чего @tf.function не восстанавливает ваш график. Это связано с тем, что два объекта совместно используют одну и ту же трассировку и что даже использование разных параметров не имеет никакого эффекта. следующий фрагмент воспроизводит поведение, описанное выше

import tensorflow as tf
@tf.function
def square(x):
    return x**2

a = square(tf.Variable(2))
print(a)
a = square(tf.Variable(3))
print(a)

Однако, если вы хотите, чтобы разные объекты имели разные следы. То есть не делить следы, вы можете использовать разные @tf.function объекты, как показано ниже;

@tf.function
def square1(x):
    return x**2

@tf.function
def square2(x):
    return x**2

print(square1(tf.Variable(2)))
print(square2(tf.Variable(3)))

Для получения более подробной информации, ознакомьтесь с official_documentation . Надеюсь, это поможет

...