TensorFlow repeat function fails with ValueError: None values not supported
TensorFlow repeat function fails with ValueError: None values not supported
我已经实现了以下自定义 Layer
,它根据输入 x
的大小使用函数 repeat
在调用时修改可学习参数 seed_vectors
的大小.
import tensorflow as tf
from tensorflow.keras.layers import Dense
from tensorflow import repeat
from tensorflow.keras.layers import LayerNormalization
class PoolingMultiHeadAttention(tf.keras.layers.Layer):
def __init__(self, d, k, h):
"""
Arguments:
d: an integer, input dimension.
k: an integer, number of seed vectors.
h: an integer, number of heads.
"""
super(PoolingMultiHeadAttention, self).__init__()
self.seed_vectors = self.add_weight(initializer='uniform',
shape=(1, k, d),
trainable=True)
def call(self, z):
"""
Arguments:
z: a float tensor with shape [b, n, d].
Returns:
a float tensor with shape [b, k, d]
"""
b = z.shape[0]
s = self.seed_vectors
s = repeat(s, (b), axis=0, name='rep') # shape [b, k, d]
return s*z
# Dimensionality test
z = tf.random.normal(shape=(10, 2, 9))
pma = PoolingMultiHeadAttention(d=9, k=2, h=3)
pma(z)
我在单元测试中测试了维数 input/output,它工作正常,但不幸的是,如果我在模型中使用这个层,它会失败并出现错误:
<ipython-input-4-89023d123369>:110 call *
s = repeat(s, (b), axis=0, name='rep') # shape [b, k, d]
/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/array_ops.py:5616 repeat **
return repeat_with_axis(input, repeats, axis, name)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/array_ops.py:5478 repeat_with_axis
repeats = convert_to_int_tensor(repeats, name="repeats")
/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/array_ops.py:5388 convert_to_int_tensor
tensor = ops.convert_to_tensor(tensor, name=name, preferred_dtype=dtype)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py:1341 convert_to_tensor
ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py:317 _constant_tensor_conversion_function
return constant(v, dtype=dtype, name=name)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py:258 constant
allow_broadcast=True)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py:296 _constant_impl
allow_broadcast=allow_broadcast))
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/tensor_util.py:439 make_tensor_proto
raise ValueError("None values not supported.")
ValueError: None values not supported.
此错误似乎与缺少输出有关(或输出为 None)[我知道情况并非如此,因为我已经在 eager 模式下测试了该功能并且它有效] 或由于某些原因,backprop 不适用于此操作 (repeat
)。
我不知道在运行时修改该参数大小的任何替代方法+(几乎)相同的代码使用 Pytorch 工作正常(https://github.com/TropComplique/set-transformer/blob/master/blocks.py)
谢谢
修复应该非常简单:改用 b = tf.shape(z)[0]
。说明:
问题是您试图重复 b
次,这(我想)是可变批量大小。当不是 运行ning 处于急切模式时,这由形状中的值 None
表示。因此,您试图重复 "None times" 导致崩溃。
重要的是 Tensor.shape
returns 张量的 static 形状,即编译时已知的任何形状。这包括 None
如上所述的未知维度。
tf.shape(tensor)
而不是 returns 动态 形状,即仅当模型为 运行 时才会对其进行评估。此时,批量大小当然是已知的(因为你将一些东西放入模型中)所以这将是一个可以放入 repeat
的具体值,而不是 None
我们得到了以上。
我已经实现了以下自定义 Layer
,它根据输入 x
的大小使用函数 repeat
在调用时修改可学习参数 seed_vectors
的大小.
import tensorflow as tf
from tensorflow.keras.layers import Dense
from tensorflow import repeat
from tensorflow.keras.layers import LayerNormalization
class PoolingMultiHeadAttention(tf.keras.layers.Layer):
def __init__(self, d, k, h):
"""
Arguments:
d: an integer, input dimension.
k: an integer, number of seed vectors.
h: an integer, number of heads.
"""
super(PoolingMultiHeadAttention, self).__init__()
self.seed_vectors = self.add_weight(initializer='uniform',
shape=(1, k, d),
trainable=True)
def call(self, z):
"""
Arguments:
z: a float tensor with shape [b, n, d].
Returns:
a float tensor with shape [b, k, d]
"""
b = z.shape[0]
s = self.seed_vectors
s = repeat(s, (b), axis=0, name='rep') # shape [b, k, d]
return s*z
# Dimensionality test
z = tf.random.normal(shape=(10, 2, 9))
pma = PoolingMultiHeadAttention(d=9, k=2, h=3)
pma(z)
我在单元测试中测试了维数 input/output,它工作正常,但不幸的是,如果我在模型中使用这个层,它会失败并出现错误:
<ipython-input-4-89023d123369>:110 call *
s = repeat(s, (b), axis=0, name='rep') # shape [b, k, d]
/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/array_ops.py:5616 repeat **
return repeat_with_axis(input, repeats, axis, name)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/array_ops.py:5478 repeat_with_axis
repeats = convert_to_int_tensor(repeats, name="repeats")
/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/array_ops.py:5388 convert_to_int_tensor
tensor = ops.convert_to_tensor(tensor, name=name, preferred_dtype=dtype)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py:1341 convert_to_tensor
ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py:317 _constant_tensor_conversion_function
return constant(v, dtype=dtype, name=name)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py:258 constant
allow_broadcast=True)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py:296 _constant_impl
allow_broadcast=allow_broadcast))
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/tensor_util.py:439 make_tensor_proto
raise ValueError("None values not supported.")
ValueError: None values not supported.
此错误似乎与缺少输出有关(或输出为 None)[我知道情况并非如此,因为我已经在 eager 模式下测试了该功能并且它有效] 或由于某些原因,backprop 不适用于此操作 (repeat
)。
我不知道在运行时修改该参数大小的任何替代方法+(几乎)相同的代码使用 Pytorch 工作正常(https://github.com/TropComplique/set-transformer/blob/master/blocks.py)
谢谢
修复应该非常简单:改用 b = tf.shape(z)[0]
。说明:
问题是您试图重复 b
次,这(我想)是可变批量大小。当不是 运行ning 处于急切模式时,这由形状中的值 None
表示。因此,您试图重复 "None times" 导致崩溃。
重要的是 Tensor.shape
returns 张量的 static 形状,即编译时已知的任何形状。这包括 None
如上所述的未知维度。
tf.shape(tensor)
而不是 returns 动态 形状,即仅当模型为 运行 时才会对其进行评估。此时,批量大小当然是已知的(因为你将一些东西放入模型中)所以这将是一个可以放入 repeat
的具体值,而不是 None
我们得到了以上。