Как создать обучаемый линейный слой для ввода с неизвестным размером партии?(Keras / Tensorflow) - PullRequest
2 голосов
/ 28 сентября 2019

У меня есть вход 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

1 Ответ

0 голосов
/ 29 сентября 2019

Сделайте w равным [1, m, n], а затем умножение с тензором [?, M, n] должно быть простым.

Еще лучше, если вы можете использовать операции Tensorflow вместо чистых Keras, x*self.W (или, точнее, tf.math.multiply(x,self.W)) должно работать очень хорошо (трансляция Tensorflow менее медленная, чем в Keras ').

...