Я нашел (в другом посте: поэлементное умножение с трансляцией в пользовательском слое 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?)