【问题标题】:How to create a trainable linear layer for input with unknown batch size? (Keras/Tensorflow)如何为未知批量大小的输入创建可训练的线性层? (Keras/张量流)
【发布时间】:2019-09-28 19:56:11
【问题描述】:

我有一个如下形状的输入 x [?, m, n],我想创建一个形式为 xw + b 的新层,以保留 x 的原始形状。 所以基本上 xw 应该是元素乘法。

但由于批量大小未知,我不太确定如何将 w 保持为与 x 相同的维度。

我不能强制 w 为 [?, m, n],如果 w 为 [m, n] 则尝试在 3D 和 2D 之间进行乘法时会出错

已解决:

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

    def build(self, input_shape):
        self.w = self.add_weight(name='w',
                                      shape=(input_shape[1], input_shape[2]),
                                      initializer=RandomNormal(),
                                      trainable=True)
        self.b = self.add_weight(name='b',
                                      shape=(input_shape[1], input_shape[2]),
                                      initializer=RandomNormal(),
                                      trainable=True)
        super(LinearLayer, self).build(input_shape)

    def call(self, x, **kwargs):
        batch_size = tf.shape(x)[0]
        w_expand = tf.expand_dims(self.w, axis=0)
        w_tile = tf.tile(w_expand, multiples=[batch_size, 1, 1])
        return tf.multiply(x, w_tile) + self.b

    def compute_output_shape(self, input_shape):
        return input_shape

【问题讨论】:

  • 您对样品中的每个元素使用相同的参数吗?否则,您创建了一个模型,其参数化取决于输入,这可能不是您想要的?顺便说一句,请注意用 xw 表示逐元素乘法是不标准的;这几乎总是表示矩阵乘法。
  • @fuglede 我不希望模型参数化取决于样本数量。但我也不想改变输入的形状。因此,如果我从形状 [?, m, n] 开始,我最终想要相同的形状,只需为其添加可训练的权重

标签: tensorflow keras deep-learning matrix-multiplication keras-layer


【解决方案1】:

使w 为 [1,m,n],然后与 [?,m,n] 张量的乘法应该很简单。

更好的是,如果您可以使用 Tensorflow 操作而不是纯 Keras,x*self.W(或更明确地说是 tf.math.multiply(x,self.W))应该可以正常工作(Tensorflow 的广播不如 Keras 的那么蹩脚)。

【讨论】:

    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2018-09-17
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多