繁体   English   中英

ValueError: 试图将 'y' 转换为张量并失败。 错误:不支持无值

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

不工作

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, and Keras 2.3.0 via pip, all else via Anaconda 3
  • 根据 DEBUG 1,我注意到pip安装r2.0分支而不是master master手动覆盖本地tensorflow_core.python文件夹会破坏一切 - 但是对于少数文件这样做不会,尽管错误仍然存在

调试 1:文件差异

这适用于我的本地安装,而不是 TF 的 Github 分支masterr2.0 Github 文件由于某种原因缺少api/_v2 _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

查看Optimizer的每个__init__

# [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 ,尽管keras.optimizers中的Optimizer定义确实不同。


调试 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(...)和其他人最终失败。


调试 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.

这是一个错误,我的拉取请求修复已获批准(但尚未合并)。 同时,您可以手动进行更改, 如此处 此外, tf.python.keras并不总是被使用,如果有的话。

更新: 拉取请求现已合并


为什么会这样None in grads中的 None 与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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM