【发布时间】: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