Керас полиномиальный векторный слой - PullRequest
0 голосов
/ 09 июня 2019

Я хочу, чтобы слой, который создает полиномиальные объекты, умножается на X.T * X:

class QuadraticLayer(Layer):

def __init__(self, **kwargs):
    super(QuadraticLayer, self).__init__(**kwargs)

def build(self, input_shape):
    assert isinstance(input_shape, tuple)
    print(input_shape)
    self.in_shape = input_shape[1]
    self.out_shape = input_shape[1] ** 2
    super(QuadraticLayer, self).build(input_shape)  # Be sure to call this at the end

def call(self, x):
    print(x.shape)
    tf.reshape(x, (self.in_shape, 1, -1), name=None)
    x = tf.matmul(x, x, transpose_a=True)
    return tf.reshape(x, (-1, self.out_shape))

def compute_output_shape(self, input_shape):
    return (None, self.out_shape)

Моя проблема в том, что в call тензор x это пакетный тензор - как написать слой, который будет работать для каждого примера обучения вместо того, чтобы работать с целыми пакетными тензорами?

1 Ответ

0 голосов
/ 09 июня 2019

это одна идея:

def call(self, x):
    x = K.backend.batch_dot(tf.reshape(x, (-1, 1, self.in_shape)), tf.reshape(x, (-1, self.in_shape, 1)), axes=[1,2])
    return tf.reshape(x, (-1, self.out_shape))

но вопрос в том, есть ли лучшие решения?

...