Как разделить вес, а не смещения в слоях Keras Dense - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь создать модель для порядковой регрессии, как описано в этой статье . Основная часть этого делится весами в последнем слое, но не смещением для получения монотонности ранга (в основном, чтобы P [Y> N] всегда было больше, чем P [Y> N-1] для любого такого N) , Это очень желательно для меня, так как у меня есть пара значений, для которых очень мало значений, но я все же предпочел бы получить их вероятности. На данный момент я реализовал способ кодирования чисел без монотонности ранга, а иногда с вероятностью P (Y> 5)> P (Y> 4).

Как именно я могу выполнить sh распределение веса, но не распределение смещения в Keras? Я знаю, что у функционального API есть способ поделиться весами и отклонениями, но это не помогает в этом сценарии. Спасибо всем, кто может помочь.

Редактировать: Либо разделение весов, но не смещений в пределах одного слоя с N нейронами и между N слоями решит проблему. Также я думаю, что установка аргумента use_bias в Dense () на false и создание какого-либо пользовательского слоя смещения также может решить проблему, но я не уверен, как это сделать

Уравнение для шести нейронов и пяти входов Я думаю, что это будет

op1 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b1
op2 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b2
op3 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b3
op4 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b4
op5 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b5
op6 = w1z1 + w2z2 + w3z3 + w4z4 + w5z5 + b6

, где от w1 до w5 - веса, от z1 до z5 - входные значения, а от b1 до b6 - члены смещения

1 Ответ

1 голос
/ 09 января 2020

Один из способов добиться этого - определить собственный слой bias, и вот как вы можете это сделать. PS: Изменить входные формы / инициализатор в соответствии с вашими потребностями.

import tensorflow as tf
print('TensorFlow:', tf.__version__)

class BiasLayer(tf.keras.layers.Layer):
    def __init__(self, units, *args, **kwargs):
        super(BiasLayer, self).__init__(*args, **kwargs)
        self.bias = self.add_weight('bias',
                                    shape=[units],
                                    initializer='zeros',
                                    trainable=True)

    def call(self, x):
        return x + self.bias

z1 = tf.keras.Input(shape=[1])
z2 = tf.keras.Input(shape=[1])
z3 = tf.keras.Input(shape=[1])
z4 = tf.keras.Input(shape=[1])
z5 = tf.keras.Input(shape=[1])

dense_layer = tf.keras.layers.Dense(units=10, use_bias=False)


op1 = BiasLayer(units=10)(dense_layer(z1))
op2 = BiasLayer(units=10)(dense_layer(z2))
op3 = BiasLayer(units=10)(dense_layer(z3))
op4 = BiasLayer(units=10)(dense_layer(z4))
op5 = BiasLayer(units=10)(dense_layer(z5))

model = tf.keras.Model(inputs=[z1, z2, z3, z4, z5], outputs=[op1, op2, op3, op4, op5])
model.summary()

Вывод:

TensorFlow: 2.1.0-dev20200107
Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            [(None, 1)]          0                                            
__________________________________________________________________________________________________
input_2 (InputLayer)            [(None, 1)]          0                                            
__________________________________________________________________________________________________
input_3 (InputLayer)            [(None, 1)]          0                                            
__________________________________________________________________________________________________
input_4 (InputLayer)            [(None, 1)]          0                                            
__________________________________________________________________________________________________
input_5 (InputLayer)            [(None, 1)]          0                                            
__________________________________________________________________________________________________
dense (Dense)                   (None, 10)           10          input_1[0][0]                    
                                                                 input_2[0][0]                    
                                                                 input_3[0][0]                    
                                                                 input_4[0][0]                    
                                                                 input_5[0][0]                    
__________________________________________________________________________________________________
bias_layer (BiasLayer)          (None, 10)           10          dense[0][0]                      
__________________________________________________________________________________________________
bias_layer_1 (BiasLayer)        (None, 10)           10          dense[1][0]                      
__________________________________________________________________________________________________
bias_layer_2 (BiasLayer)        (None, 10)           10          dense[2][0]                      
__________________________________________________________________________________________________
bias_layer_3 (BiasLayer)        (None, 10)           10          dense[3][0]                      
__________________________________________________________________________________________________
bias_layer_4 (BiasLayer)        (None, 10)           10          dense[4][0]                      
==================================================================================================
Total params: 60
Trainable params: 60
Non-trainable params: 0
__________________________________________________________________________________________________
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...