Умножение настраиваемого обучаемого параметра на скрытые единицы - PullRequest
0 голосов
/ 22 октября 2018

Я хочу взять квадрат разницы между тензорами / выводом после слоя LSTM и умножить его на обучаемый параметр.

Как указал @rvinas, я попытался написать свой собственный слой дляцель,

class MyLayer(Layer):
    def __init__(self,W_regularizer=None,W_constraint=None, **kwargs):
        self.init = initializers.get('glorot_uniform')
        self.W_regularizer = regularizers.get(W_regularizer)
        self.W_constraint = constraints.get(W_constraint)
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        assert len(input_shape) == 3
        # Create a trainable weight variable for this layer.
        self.W = self.add_weight((input_shape[-1],),
                                 initializer=self.init,
                                 name='{}_W'.format(self.name),
                                 regularizer=self.W_regularizer,
                                 constraint=self.W_constraint,
                                trainable=True)
        super(MyLayer, self).build(input_shape)  

Функция вызова умножает только те тензоры и вес, которые я инициализировал.Тем не менее мне нужно найти, как взять попарную разницу и возвести ее в квадрат.

    def call(self, x):
        uit = K.dot(x, self.W)
        return uit

    def compute_output_shape(self, input_shape):
        return input_shape[0], input_shape[-1]

Но тогда я получаю AssertionError при assert len(input_shape) >= 3.

Я хочу выполнить:

from keras.layers import Input, Lambda, LSTM
from keras.models import Model
import keras.backend as K
from keras.layers import Lambda

lstm=LSTM(128, return_sequences=True)(input)
something=MyLayer()(lstm)

1 Ответ

0 голосов
/ 23 октября 2018

Пожалуйста, исправьте меня, если я ошибаюсь, но я верю, что вы намерены это сделать:

def call(self, x):
    diff = K.square(x[:, 1:, :] - x[:, :-1, :])  # Shape=(batch_size, nb_timesteps-1, hidden_dim)
    uit = K.dot(diff, self.W[:, None])  # Shape=(batch_size, nb_timesteps-1, 1)
    uit = K.squeeze(uit, axis=-1)  # Shape=(batch_size, nb_timesteps-1)
    return uit

ПРИМЕЧАНИЕ : не проверено.

...