【问题标题】:How to multiply two input of different dimensions (keras_tensor element) in CNN keras model?如何在 CNN keras 模型中将两个不同维度的输入(keras_tensor 元素)相乘?
【发布时间】:2022-08-17 19:30:01
【问题描述】:

假设在向 2d-CNN 提供输入后,作为第 i 层的输出,我有一个 Output Shape: (None, 1, 3, 1)。我还有另一个输入,形状为(None, 50, 27, 1),我想将第 1-9 列的每个元素与 (None, 1, 3, 1) 的第一个元素相乘,第 10-18 列的每个元素与第二个元素相乘(None, 1, 3, 1) 和第 19-27 列的每个元素与 (None, 1, 3, 1) 的第三个元素。总而言之,我想做的事情如下:

但是,使用列表执行此操作并不困难,我想在我的 keras 模型中执行此操作。因此,我输入的类型是 \'keras.engine.keras_tensor.KerasTensor\'。你知道如何做到这一点吗?

    标签: python tensorflow keras


    【解决方案1】:

    如果您的输入是ab

    c = tf.keras.layers.Lambda(
        lambda x: tf.concat(
            [a*b for a, b in zip(
                tf.split(x[1], 3, axis=-2), 
                tf.split(x[0], 3, axis=-2)
                )
            ], axis=-2
            )
        )([a,b])
    

    【讨论】:

      【解决方案2】:

      另一种类似于previous answer 但使用tf.repeat 的解决方案:

      import tensorflow as tf
      
      x = tf.random.normal((2, 50, 27, 1))
      y = tf.random.normal((2, 1, 3, 1))
      
      repeated = tf.concat([tf.repeat(y[:, :, i:i+1, :], 9, axis=2) for i in range(3)], axis=2) # shape = [2, 1, 27, 1]
      res = x * repeated # shape = [2, 50, 27, 1]
      

      并使用 Keras 模型:

      x = tf.keras.layers.Input((50, 27, 1))
      y = tf.keras.layers.Input((1, 3, 1))
      
      res = tf.keras.layers.Lambda(
          lambda x: x[0] * tf.concat([tf.repeat(x[1][:, :, i:i+1, :], 9, axis=2) for i in range(3)], axis=2) 
      )([x, y])
      
      model = tf.keras.models.Model([x, y], res)
      

      【讨论】:

        猜你喜欢
        • 2012-04-27
        • 2023-03-30
        • 2020-12-06
        • 2020-11-12
        • 1970-01-01
        • 2020-09-18
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        相关资源
        最近更新 更多