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