Пользовательский слой Keras для поэлементного разделения - PullRequest
0 голосов
/ 21 февраля 2020

Я нашел (в другом посте: поэлементное умножение с трансляцией в пользовательском слое keras ) код, который - кажется - делает то, что я хочу, но я не думаю, что результат дает любое чувство. Я пытаюсь реализовать слой поэлементного деления с LEARNABLE весами. Поэтому этот слой должен иметь ту же форму, что и мои входные данные: вектор размером 4, скажем, в качестве примера. Поэтому я ожидаю иметь 4 параметра, но результат будет:

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
my_layer_3 (MyLayer)         (None, '4', '4')          16
=================================================================
Total params: 16
Trainable params: 16
Non-trainable params: 0
_________________________________________________________________

Что означает этот вывод ?? Почему для поэлементного умножения / деления 16, как и должно быть 4 (т.е. одинаковое количество весов / параметров)? Это похоже на плотный слой, но это не то, что я хочу ...

Код следующий:

from keras import backend as K
from keras.engine.topology import Layer
import tensorflow as tf
from keras.models import Sequential
import numpy as np

class MyLayer(Layer):

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

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

    def build(self, input_shape):
        # Create a trainable weight variable for this layer.
        output_shape = self.compute_output_shape(input_shape)
        self.kernel = self.add_weight(name='kernel',
                                      shape=(1,) + output_shape[1:],
                                      initializer='ones',
                                      trainable=True)


        super(MyLayer, self).build(input_shape)  # Be sure to call this somewhere!

    def call(self, x):

        return tf.multiply(x, self.kernel)

    def compute_output_shape(self, input_shape):
        return (input_shape[0],self.output_dim)+input_shape[1:]

net = Sequential()
inShape = '4'
outShape = '4'
l1 = MyLayer(outShape, input_shape= inShape)
net.add(l1)
net.compile(loss='mean_absolute_error', optimizer='adam', metrics=['accuracy'])
net.summary()

Может кто-нибудь помочь!?

PS I позже планируем заменить tf.multiply на tf.divide или тот, который соответствует поэлементному div (truedivide?)

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