ValueError:无法将dtype资源的张量转换为NumPy数组 [英] ValueError: Cannot convert a Tensor of dtype resource to a NumPy array
问题描述
我正在尝试通过具有参数矩阵来隔离一些用户特定的参数,其中每个数组将学习该用户特定的参数.
I'm trying to isolate some user specific parameters by having matrix of parameters where each array would learn parameters specific to that user.
我想使用用户ID为矩阵建立索引,并将参数连接到其他功能.
I want to index the matrix using the user id, and concatenate the parameters to the other features.
最后,有一些完全连接的图层才能获得理想的结果.
Lastly, have some fully-connected layers to get desirable outcome.
但是,我在代码的最后一行不断收到此错误.
However, I keep getting this error on the last line of the code.
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-1-93de3591ccf0> in <module>
20 # combined = tf.keras.layers.Concatenate(axis=-1)([le_param, le])
21
---> 22 net = tf.keras.layers.Dense(128)(combined)
~/anaconda3/envs/tam-env/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/base_layer.py in __call__(self, inputs, *args, **kwargs)
793 # framework.
794 if build_graph and base_layer_utils.needs_keras_history(inputs):
--> 795 base_layer_utils.create_keras_history(inputs)
796
797 # Clear eager losses on top level model call.
~/anaconda3/envs/tam-env/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/base_layer_utils.py in create_keras_history(tensors)
182 keras_tensors: The Tensors found that came from a Keras Layer.
183 """
--> 184 _, created_layers = _create_keras_history_helper(tensors, set(), [])
185 return created_layers
186
~/anaconda3/envs/tam-env/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/base_layer_utils.py in _create_keras_history_helper(tensors, processed_ops, created_layers)
229 constants[i] = backend.function([], op_input)([])
230 processed_ops, created_layers = _create_keras_history_helper(
--> 231 layer_inputs, processed_ops, created_layers)
232 name = op.name
233 node_def = op.node_def.SerializeToString()
~/anaconda3/envs/tam-env/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/base_layer_utils.py in _create_keras_history_helper(tensors, processed_ops, created_layers)
229 constants[i] = backend.function([], op_input)([])
230 processed_ops, created_layers = _create_keras_history_helper(
--> 231 layer_inputs, processed_ops, created_layers)
232 name = op.name
233 node_def = op.node_def.SerializeToString()
~/anaconda3/envs/tam-env/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/base_layer_utils.py in _create_keras_history_helper(tensors, processed_ops, created_layers)
227 else:
228 with ops.init_scope():
--> 229 constants[i] = backend.function([], op_input)([])
230 processed_ops, created_layers = _create_keras_history_helper(
231 layer_inputs, processed_ops, created_layers)
~/anaconda3/envs/tam-env/lib/python3.6/site-packages/tensorflow_core/python/keras/backend.py in __call__(self, inputs)
3746 return nest.pack_sequence_as(
3747 self._outputs_structure,
-> 3748 [x._numpy() for x in outputs], # pylint: disable=protected-access
3749 expand_composites=True)
3750
~/anaconda3/envs/tam-env/lib/python3.6/site-packages/tensorflow_core/python/keras/backend.py in <listcomp>(.0)
3746 return nest.pack_sequence_as(
3747 self._outputs_structure,
-> 3748 [x._numpy() for x in outputs], # pylint: disable=protected-access
3749 expand_composites=True)
3750
ValueError: Cannot convert a Tensor of dtype resource to a NumPy array.
重现该错误的代码:
import tensorflow as tf
num_uids = 50
input_uid = tf.keras.layers.Input(shape=(1,), dtype=tf.int32)
params = tf.Variable(tf.random.normal((num_uids, 9)), trainable=True)
param = tf.gather_nd(params, input_uid)
input_shared_features = tf.keras.layers.Input(shape=(128,), dtype=tf.float32)
combined = tf.concat([param, input_shared_features], axis=-1)
net = tf.keras.layers.Dense(128)(combined)
我尝试了几件事:
- 我尝试使用tf.keras.layers.Lambda封装tf.gather_nd和tf.concat.
- 我尝试用tf.keras.layers.Concatenate替换tf.concat.
奇怪的是,如果我指定项目数并将Input替换为tf.Variable,代码将按预期工作:
Oddly enough if I specify the number of items and replace Input with tf.Variable, the code would work as expected:
import tensorflow as tf
num_uids = 50
input_uid = tf.Variable(tf.ones((32, 1), dtype=tf.int32))
params = tf.Variable(tf.random.normal((num_uids, 9)), trainable=True)
param = tf.gather_nd(params, input_uid)
input_shared_features = tf.Variable(tf.ones((32, 128), dtype=tf.float32))
combined = tf.concat([param, input_shared_features], axis=-1)
net = tf.keras.layers.Dense(128)(combined)
我正在将Tensorflow 2.1与Python 3.6.10结合使用
I'm using Tensorflow 2.1 with Python 3.6.10
推荐答案
在TensorFlow 2中尝试使用TensorFlow表查找( tf.lookup.StaticHashTable
)时,我遇到了类似的问题.X.最后,我将其保留在自定义Keras图层中,从而解决了该问题.相同的解决方案似乎也适用于此问题,至少直到问题中提到的版本为止.(我尝试使用TensorFlow 2.0、2.1和2.2,并且在所有这些版本中都可以使用.)
I faced a similar issue when I was trying to use a TensorFlow table lookup (tf.lookup.StaticHashTable
) in TensorFlow 2.x. I ended up solving it by keeping it inside a Custom Keras Layer. The same solution seems to have worked for this problem as well—at least until to the version that's mentioned in the question. (I tried using TensorFlow 2.0, 2.1, and 2.2 and it worked in all of these versions.)
import tensorflow as tf
num_uids = 50
input_uid = tf.keras.Input(shape=(1,), dtype=tf.int32)
input_shared_features = tf.keras.layers.Input(shape=(128,), dtype=tf.float32)
class CustomLayer(tf.keras.layers.Layer):
def __init__(self,num_uids):
super(CustomLayer, self).__init__(trainable=True,dtype=tf.int64)
self.num_uids = num_uids
def build(self,input_shape):
self.params = tf.Variable(tf.random.normal((num_uids, 9)), trainable=True)
self.built=True
def call(self, input_uid,input_shared_features):
param = tf.gather_nd(self.params, input_uid)
combined = tf.concat([param, input_shared_features], axis=-1)
return combined
def get_config(self):
config = super(CustomLayer, self).get_config()
config.update({'num_uids': self.num_uids})
return config
combined = CustomLayer(num_uids)(input_uid,input_shared_features)
net = tf.keras.layers.Dense(128)(combined)
model = tf.keras.Model(inputs={'input_uid':input_uid,'input_shared_features':input_shared_features},outputs=net)
model.summary()
这是模型摘要的样子:
Model: "model"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 1)] 0
__________________________________________________________________________________________________
input_2 (InputLayer) [(None, 128)] 0
__________________________________________________________________________________________________
custom_layer (CustomLayer) (None, 137) 450 input_1[0][0]
__________________________________________________________________________________________________
dense (Dense) (None, 128) 17664 custom_layer[0][0]
==================================================================================================
Total params: 18,114
Trainable params: 18,114
Non-trainable params: 0
有关更多信息,您可以参考 tf.keras.layers.Layer
文档.
For more info you can refer to the tf.keras.layers.Layer
documentation.
如果要参考表查找问题和解决方案,请参见以下链接:
In case you want to refer to the table lookup problem and solution, here are the links:
这篇关于ValueError:无法将dtype资源的张量转换为NumPy数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!