Конкатенация скрытых юнитов с использованием Keras - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь объединить скрытые юниты. Например, у меня есть 3 единиц, h1,h2,h3, тогда я хочу, чтобы новый слой имел [h1;h1],[h1;h2],[h1;h3],[h2;h1]....

Итак, я попробовал:

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],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,input_shape):
    conc=K.concatenate([x[:, :-1, :], x[:, 1:, :]],axis=1)# help needed here
    uit = K.dot(conc, self.W)# W has input_shape[-1],input_shape[-1]
    return uit

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

Я не уверен, что я должен возвращать для второго аргумента моей формы вывода.

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

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

1 Ответ

0 голосов
/ 05 ноября 2018

Вы можете реализовать описанную выше операцию конкатенации, используя itertools.product , чтобы вычислить декартово произведение индексов временного измерения. Метод вызова может быть закодирован следующим образом:

def call(self, x):
    prod = product(range(nb_timesteps), repeat=2)
    conc_prod = []
    for i, j in prod:
        c = K.concatenate([x[:, i, :], x[:, j, :]], axis=-1)  # Shape=(batch_size, 2*nb_features)
        c_expanded = c[:, None, :]  # Shape=(batch_size, 1, 2*nb_features)
        conc_prod.append(c_expanded)
    conc = K.concatenate(conc_prod, axis=1)  # Shape=(batch_size, nb_timesteps**2, 2*nb_features)
    uit = K.dot(conc, self.W)  # W has shape 2*input_shape[-1], input_shape[-1]
    return uit  # Shape=(batch_size, nb_timesteps**2, nb_features)

В приведенном вами примере значение nb_timesteps будет равно 3. Обратите внимание также, что форма весов должна быть (2*input_shape[-1], input_shape[-1]), чтобы точечный продукт был действительным.

Отказ от ответственности : Я не уверен, чего вы хотите достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...