【问题标题】:Tesnorflow custom layer that loops over ragged tensor cannot be built无法构建在不规则张量上循环的 TensorFlow 自定义层
【发布时间】:2020-06-05 20:16:43
【问题描述】:

我正在尝试在 tensorflow 中自定义一个层。该层必须将具有未知长度的参差不齐的张量作为输入。但是在尝试构建层时代码被卡住了。即使是下面附加的简单代码也无法正常工作。

import tensorflow as tf
class myLayer(tf.keras.layers.Layer):
    def __init__(self):
        super(myLayer, self).__init__()
        self._supports_ragged_inputs = True


    def call(self, inputs):
        # Try to loop over ragged tensor
        for x in inputs:
            pass
        return tf.constant(0)

# Input is ragged tensor
inputs = tf.keras.layers.Input(shape=(None, 1), ragged=True)

layer1 = myLayer()
output = layer1(inputs)

【问题讨论】:

    标签: python tensorflow recurrent-neural-network layer ragged


    【解决方案1】:

    当我在 Tensorflow version 2.2.0 中运行您的代码时,我在 for 循环中收到以下错误 -

    错误 -

    ValueError: in user code:
    
        <ipython-input-24-1681d59017fc>:10 call  *
            for x in inputs:
        /usr/local/lib/python3.6/dist-packages/tensorflow/python/autograph/operators/control_flow.py:359 for_stmt
            iter_, extra_test, body, get_state, set_state, symbol_names, opts)
        /usr/local/lib/python3.6/dist-packages/tensorflow/python/autograph/operators/control_flow.py:491 _tf_ragged_for_stmt
            opts)
        /usr/local/lib/python3.6/dist-packages/tensorflow/python/autograph/operators/control_flow.py:885 _tf_while_stmt
            aug_test, aug_body, init_vars, **opts)
        /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/control_flow_ops.py:2688 while_loop
            back_prop=back_prop)
        /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/while_v2.py:104 while_loop
            maximum_iterations)
        /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/while_v2.py:1258 _build_maximum_iterations_loop_var
            maximum_iterations, dtype=dtypes.int32, name="maximum_iterations")
        /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py:1317 convert_to_tensor
            (dtype.name, value.dtype.name, value))
    
        ValueError: Tensor conversion requested dtype int32 for Tensor with dtype int64: <tf.Tensor 'my_layer_15/strided_slice:0' shape=() dtype=int64>
    

    所以我只是做了下面的实验来了解for循环和enumerate在使用inputs时产生的数据类型。 for 循环生成一个tensor 类,而enumerate 生成一个int 类。

    实验代码 -

    inputs = tf.keras.layers.Input(shape=(None, 1), ragged=True)
    
    for x in inputs:
      print(type(x))
      break
    
    for i,x in enumerate(inputs):
      print(type(i))
      break
    

    输出 -

    <class 'tensorflow.python.framework.ops.Tensor'>
    <class 'int'>
    

    所以我修改了你的代码如下,它运行良好 -

    固定代码 -

    import tensorflow as tf
    class myLayer(tf.keras.layers.Layer):
        def __init__(self):
            super(myLayer, self).__init__()
            self._supports_ragged_inputs = True
    
    
        def call(self, inputs):
            # Try to loop over ragged tensor
            # for x in inputs:  # Throws Error
            for i,x in enumerate(inputs): #Enumerate Works fine
              break                       #Using break as pass will go into loop 
            return tf.constant(0)
    
    # Input is ragged tensor
    inputs = tf.keras.layers.Input(shape=(None, 1), ragged=True)
    
    layer1 = myLayer()
    output = layer1(inputs)
    print(output)
    

    输出 -

    Tensor("my_layer_17/Identity:0", shape=(), dtype=int32)
    

    希望这能回答您的问题。快乐学习。

    【讨论】:

    • @Jing - 希望我们已经回答了您的问题。如果您对答案感到满意,请您接受并投票。
    猜你喜欢
    • 1970-01-01
    • 2019-04-28
    • 2020-12-19
    • 2020-02-05
    • 2011-09-22
    • 1970-01-01
    • 2021-05-21
    • 2020-11-19
    • 2020-09-05
    相关资源
    最近更新 更多