У меня есть вход x следующей формы [?, M, n], и я хотел бы создать новый слой формы x w + b, который сохранил бы исходную форму x.так что в основном x w должно быть поэлементным умножением.
, но поскольку размер пакета неизвестен, я не совсем уверен, как сохранить 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