Сделать «не полностью подключенную» (односвязную?) Нейронную сеть в керасе - PullRequest
1 голос
/ 30 июня 2019

Я не знаю название того, что я ищу, но я хочу сделать слой в кератах, где каждый вход умножается на свой собственный, независимый вес и смещение. Например. если бы было 10 входов, было бы 10 весов и 10 смещений, и каждый вход умножался бы на его вес и суммировался с его смещением, чтобы получить 10 выходов.

Например, вот простая плотная сеть:

from keras.layers import Input, Dense
from keras.models import Model
N = 10
input = Input((N,))
output = Dense(N)(input)
model = Model(input, output)
model.summary()

Как видите, эта модель имеет 110 параметров, поскольку она полностью подключена:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         (None, 10)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                110       
=================================================================
Total params: 110
Trainable params: 110
Non-trainable params: 0
_________________________________________________________________

Я хочу заменить output = Dense(N)(input) на что-то вроде output = SinglyConnected()(input), чтобы у модели теперь было 20 параметров: 10 весов и 10 смещений.

1 Ответ

2 голосов
/ 30 июня 2019

Создание пользовательского слоя:

class SingleConnected(Layer):

    #creator
    def __init__(self, **kwargs):
        super(SingleConnected, self).__init__(**kwargs)

   #creates weights
   def build(self, input_shape):

       weight_shape = (1,) * (len(input_shape) - 1)
       weight_shape = weight_shape + (input_shape[-1]) #(....., input)

       self.kernel = self.add_weight(name='kernel', 
                                  shape=weight_shape,
                                  initializer='uniform',
                                  trainable=True)

       self.bias = self.add_weight(name='bias', 
                                   shape=weight_shape,
                                   initializer='zeros',
                                   trainable=True)

       self.built=True

   #operation:
   def call(self, inputs):
       return (inputs * self.kernel) + self.bias

   #output shape
   def compute_output_shape(self, input_shape):
       return input_shape

   #for saving the model - only necessary if you have parameters in __init__
   def get_config(self):
       config = super(SingleConnected, self).get_config()
       return config

Используйте слой:

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