【问题标题】:How to use batch size to create a tensor within a custom TensorFlow Layer如何使用批量大小在自定义 TensorFlow 层中创建张量
【发布时间】:2020-12-19 00:52:55
【问题描述】:

我正在创建一个自定义 TF 层,我需要在其中创建一个张量,其中包含类似的东西

class MyLayer(Layer):
  def __init__(self, config, **kwargs):
    super(MyLayer, self).__init__(**kwargs)
    ....

  def call(self, x):
    B, T, C = x.shape.as_list()
    ...
    ones = tf.ones((B, T, C))
    ...
    # output projection
    y = ...
    return y

现在问题是在评估层时B(批量大小)为 None,这导致 tf.ones 失败并出现以下错误:


ValueError: in user code:

    <ipython-input-69-f3322a54c05c>:29 call  *
        ones = tf.ones((B, T, C))
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/util/dispatch.py:201 wrapper  **
        return target(*args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/array_ops.py:3080 ones
        shape = ops.convert_to_tensor(shape, dtype=dtypes.int32)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/profiler/trace.py:163 wrapped
        return func(*args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py:1535 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:356 _tensor_shape_tensor_conversion_function
        "Cannot convert a partially known TensorShape to a Tensor: %s" % s)

    ValueError: Cannot convert a partially known TensorShape to a Tensor: (None, 8, 128)

我怎样才能让它工作?

【问题讨论】:

  • 试试ones = tf.ones(tf.shape(x).numpy())。如果它不起作用,还可以添加一个独立代码以更好地调试问题。
  • 看起来很有趣,试试看!

标签: python tensorflow tensorflow2.0 keras-layer tf.keras


【解决方案1】:

如果你只想得到一个与x 形状相同的张量,那么你可以使用tf.ones_like。像这样的:

class MyLayer(Layer):

  ....

  def call(self, x):
    ones = tf.ones_like(x)

    ...

    # output projection
    y = ...
    return y

直到运行时才需要知道x的形状。

然而,一般来说,我们可能需要在运行前知道输入的形状,在这种情况下,我们可以在我们的层中实现 build() 方法,该方法将 input_shape 作为参数并在我们编译模型时调用.

从文档here复制的示例:

class Linear(keras.layers.Layer):
    def __init__(self, units=32):
        super(Linear, self).__init__()
        self.units = units

    def build(self, input_shape):
        self.w = self.add_weight(
            shape=(input_shape[-1], self.units),
            initializer="random_normal",
            trainable=True,
        )
        self.b = self.add_weight(
            shape=(self.units,), initializer="random_normal", trainable=True
        )

    def call(self, inputs):
        return tf.matmul(inputs, self.w) + self.b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 2018-02-21
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多