ValueError: Пытался преобразовать y в тензор и потерпел неудачу. Ошибка: значения не поддерживаются.

НЕ РАБОТАЕТ:

from tensorflow.python.keras.layers import Input, Dense
from tensorflow.python.keras.models import Model
from tensorflow.python.keras.optimizers import Nadam
import numpy as np

ipt = Input(shape=(4,))
out = Dense(1, activation='sigmoid')(ipt)

model = Model(ipt, out)
model.compile(optimizer=Nadam(lr=1e-4), loss='binary_crossentropy')

X = np.random.randn(32,4)
Y = np.random.randint(0,2,(32,1))
model.train_on_batch(X,Y)

РАБОТАЕТ: удалить.python сверху импорт.

В чем дело и как исправить?


ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

  • CUDA 10.0.130, cuDNN 7.4.2, Python 3.7.4, Windows 10
  • tensorflow, tensorflow-gpu v2.0.0 и Keras 2.3.0 через pip, все остальное через Anaconda 3
  • В DEBUG 1 я отмечаю pip устанавливает r2.0 филиал, а не master; ручная перезапись локальногоtensorflow_core.python папка с masterломает все, но не делает это для нескольких избранных файлов, хотя ошибка сохраняется

DEBUG 1: разница в файлах

Это справедливо для моей локальной установки, а не для веток Github TF. master или r2.0; Отсутствуют файлы на Githubapi/_v2 по какой-то причине:

from tensorflow import keras
print(keras.__file__)
from tensorflow.python import keras
print(keras.__file__)
[1] D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\keras\api\_v2\keras\__init__.py
[2] D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\keras\__init__.py

Заглядывая в каждую __init__ за Optimizer:

# [1]
from tensorflow.python.keras.optimizer_v2.optimizer_v2 import OptimizerV2 as Optimizer
# [2]
from tensorflow.python.keras import optimizers

# in python.keras.optimizers.py:
# all imports are from tensorflow.python
class Optimizer(object): # <--- does NOT use optimizer_v2 for Optimizer

Похоже, это решает проблему, как показано ниже:

from tensorflow.python.keras.layers import Input, Dense
from tensorflow.python.keras.models import Model
from tensorflow.keras.optimizers import Nadam

Однако это странно, поскольку прямой import keras не использует optimizer_v2 либо, хотя определение Optimizer в keras.optimizers действительно отличается.


DEBUG 2: разница в исполнении

Параллельная отладка, хотя оба используют один и тот же training.py, выполнение расходится довольно быстро:

### TF.KERAS
    if self._experimental_run_tf_function: #  TRUE
### TF.PYTHON.KERAS
    if self._experimental_run_tf_function: #  FALSE

Бывший переходит к звонку training_v2_utils.train_on_batch(...) и возвращается после этого, последний self._standardize_user_data(...) и другие, прежде чем окончательно потерпеть неудачу.


DEBUG 3 (+ решение?): Линия отказа

if None in grads: # <-- in traceback

Вставка print(None in grads) прямо над ним выдает точно такую ​​же ошибку - таким образом, похоже, что это связано с повторяющимися операциями TF2 - это работает:

if any([g is None for g in grads]): # <-- works; similar but not equivalent Python logic

Пока не уверен, что это полное исправление, все еще отлаживается - обновление: запущен запрос на извлечение Github


Полная трассировка ошибки:

  File "<ipython-input-1-2db039c052cf>", line 20, in <module>
    model.train_on_batch(X,Y)
  File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 1017, in train_on_batch
    self._make_train_function()
  File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2116, in _make_train_function
    params=self._collected_trainable_weights, loss=self.total_loss)
  File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\keras\optimizers.py", line 653, in get_updates
    grads = self.get_gradients(loss, params)
  File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\keras\optimizers.py", line 92, in get_gradients
    if None in grads:
  File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\ops\math_ops.py", line 1336, in tensor_equals
    return gen_math_ops.equal(self, other)
  File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\ops\gen_math_ops.py", line 3626, in equal
    name=name)
  File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\framework\op_def_library.py", line 545, in _apply_op_helper
    (input_name, err))

ValueError: Tried to convert 'y' to a tensor and failed. Error: None values not supported.

2 ответа

Решение

Это была ошибка, и мое исправление запроса на перенос было одобрено (но еще не слито). А пока вы можете внести изменения вручную, как здесь. Также,tf.python.kerasне всегда предназначен для использования, если вообще используется.

ОБНОВЛЕНИЕ: запрос на перенос теперь объединен.


Почему это работает:None in grads такой же как any(g == None for g in grads); проблема в том,g может быть tf.Tensor/tf.Variable, у которого есть .__eq__ определены только для работы с тензорами, поэтому is None должен использоваться вместо этого.

from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
import numpy as np

ipt = Input((16,))
out = Dense(16)(ipt)
model = Model(ipt, out)
model.compile('adam', 'mse')

x = y = np.random.randn(32, 16)
model.train_on_batch(x, y)

W = model.optimizer.weights
W[0] == None
>>> ValueError: Attempt to convert a value (None) with an unsupported type 
    (<class 'NoneType'>) to a Tensor.

Проверка исходного кода:

from inspect import getsource
print(getsource(W[0].__eq__))
def __eq__(self, other):
    """Compares two variables element-wise for equality."""
    if ops.Tensor._USE_EQUALITY and ops.executing_eagerly_outside_functions():
        return gen_math_ops.equal(self, other, incompatible_shape_error=False)
    else:
        # In legacy graph mode, tensor equality is object equality
        return self is other

Вероятно, вам следует исправить свой импорт

from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Nadam
Другие вопросы по тегам