Создание слоя Keras с обучаемыми весами - PullRequest
0 голосов
/ 03 мая 2018

изменить см. Внизу, как я это исправил

Я написал свой собственный слой Keras, метод сборки которого следующий:

class Multed_Weights(Layer):

def __init__(self, input_dim, output_dim, **kwargs):
    self.output_dim = output_dim
    self.input_dim = input_dim

    super(Multed_Weights, self).__init__(**kwargs)

def build(self, input_shape):
    # Create a trainable weight variable for this layer.
    self.kernel = self.add_weight(name='kernel',
                                  shape=(self.input_dim, self.output_dim),
                                  initializer=RandomNormal(mean=0., stddev = 0.05, seed = None),
                                  trainable=True)
    super(Multed_Weights, self).build(input_shape)  # Be sure to call this somewhere!
    print("mult kernel has shape " + str(K.int_shape(self.kernel)))

def call(self, x, **kwargs):
    return Dot(axes = [1,0])([x, self.kernel])

def compute_output_shape(self, input_shape):
    output_shape = (None, self.output_dim)
    print("the output shape of multed weights is "+ str(output_shape))
    return output_shape

Вот что я пытаюсь сделать. После https://arxiv.org/pdf/1503.08895.pdf (см. Чуть выше цитату (3) на странице 2) я исправил свою предыдущую проблему, но теперь у меня есть другая.

"InvalidArgumentError (см. Выше для отслеживания): несовместимые фигуры: [150,128] против [150,10000] [[Узел: обучение / SGD / градиенты / multed__weights_1 / dot_2 / Mul_grad / BroadcastGradientArgs = BroadcastGradientArgs [T = DT_INT32, _class = ["loc: @ multed__weights_1 / dot_2 / Mul"], _device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0 "] (обучение / SGD / градиенты / multed__weights_1 / dot_2 / Mul_grad / Shape, обучение / SGD / градиенты / multed__weights_1 / dot_2 / Mul_grad / Shape_1)]]" 1012 *

Так что все еще этот класс вызывает проблему. Мой размер пакета 128, так что, похоже, ошибка исходит из этой матрицы весов, не имеющей размер пакета. Но это не позволит мне создать его с помощью shape = (None, ..., ...), поэтому я не знаю, что делать.

обновление Я был слишком зациклен на наличии динамического размера пакета в этом слое. Как только я жестко запрограммировал форму (128, self.input_dim, self.output_dim), заранее зная, что размер пакета равен 128, он работал нормально. Хотя я понял, что этот метод будет иметь разные веса в каждой из 128 партий, поэтому, возможно, мне следует установить форму, как раньше, а затем выполнить RepeatVector 128 раз. Я подозреваю, что каждый из 128 будет содержать ссылки на одни и те же веса, а не на новые, но я не уверен.

...