Как я могу добавить смещение и функцию активации непосредственно к моему входному слою в TensorFlow? - PullRequest
0 голосов
/ 21 апреля 2020

Я хотел бы создать нейронную сеть без скрытых слоев, но каждый вход суммируется со смещением и проходит через функцию relu перед переходом к выходному слою softmax. Вес, связанный со смещением каждого входа, должен быть обучаемым. В качестве альтернативы вы можете думать об этом как о нейронной сети с одним скрытым слоем, однако каждый узел в скрытом слое связан только с одним входным объектом. То, чего я хочу добиться, - это простейшая возможная архитектура, которая позволяет запоминать пороговую функцию для каждого входа (что достигается комбинацией смещения значения relu). Каждый из этих пороговых значений затем суммируется в выходных узлах, которые используют softmax для мультиклассовая классификация. Я подумал о добавлении плотного связного скрытого слоя, а затем о добавлении функции регуляризации, которая устанавливает все веса в ноль, кроме одного для каждого узла - но тогда проблема этого подхода заключается в том, что он все равно будет пытаться обучить все веса, которые установлены в ноль после каждого обновления: помимо неэффективности это будет мешать тренировке веса, который не установлен на ноль? Я знаю, что Keras автоматически добавит смещения к моему выходному слою (это нормально).

Ниже мой код в TensorFlow:

   inputs = tf.keras.layers.Input(shape=(input_dim,))
   outputs = tf.keras.layers.Dense(output_dim, activation='softmax')(inputs)
   model = tf.keras.models.Model(inputs=inputs, outputs=outputs)

эскиз желаемой архитектуры нейронной сети ниже

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Взглянув на очень полезное решение, предложенное Забиром Аль-Наци, я предлагаю эту модификацию, чтобы функция активизации реул применялась к сумме смещения и входных данных (и не применялась только к смещению):

n = 3
ip = Input(shape=(n))

# branch 1
d1 = Dense(n, trainable = False, use_bias = False, kernel_initializer = 'zeros')(ip)
d2 = Dense(n, trainable = True, use_bias = True)(d1)

# branch 2
add = Add()([ip, d2])
add = Activation('relu')(add)
act = Activation('softmax')(add)

model = Model(ip, act)

model.summary()

Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            [(None, 3)]          0                                            
__________________________________________________________________________________________________
dense (Dense)                   (None, 3)            9           input_1[0][0]                    
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 3)            12          dense[0][0]                      
__________________________________________________________________________________________________
add (Add)                       (None, 3)            0           input_1[0][0]                    
                                                                 dense_1[0][0]                    
__________________________________________________________________________________________________
activation (Activation)         (None, 3)            0           add[0][0]                        
__________________________________________________________________________________________________
activation_1 (Activation)       (None, 3)            0           activation[0][0]                 
==================================================================================================
Total params: 21
Trainable params: 12
Non-trainable params: 9
0 голосов
/ 22 апреля 2020

Ваша идея будет очень неэффективной в Keras, так как большинство современных библиотек фокусируются на весовой матрице умножения. Либо вы можете написать собственный слой, либо использовать какой-нибудь хак.

Итак, скажем, у вас есть входы с размером n, вы хотите добавить смещение к каждому входу, применить relu и обучить его таким образом.

Один хакерский подход будет использовать промежуточную ветвь.

  1. вход будет передан в две ветви

  2. в первой В ответвлении мы просто передаем входные данные в не_тренируемую плотность, инициализированную 0 и без смещения.

  3. поэтому мы получаем группу нулей, которые затем передаются в другой обучаемый массив с уклоном = True

  4. наконец, мы используем Add () с предыдущими неизменными входами, чтобы добавить тензоры и применить softmax.

from tensorflow.keras.layers import Input, Dense, Add, Activation
from tensorflow.keras.models import Model

n = 3

ip = Input(shape=(n))

# branch 1
d1 = Dense(n, trainable = False, use_bias = False, kernel_initializer = 'zeros')(ip)
d2 = Dense(n, trainable = True, use_bias = True)(d1)
d2 = Activation('relu')(d2)

# branch 2

add = Add()([ip, d2])
act = Activation('softmax')(add)

model = Model(ip, act)

model.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            [(None, 3)]          0                                            
__________________________________________________________________________________________________
dense (Dense)                   (None, 3)            9           input_1[0][0]                    
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 3)            12          dense[0][0]                      
__________________________________________________________________________________________________
add (Add)                       (None, 3)            0           input_1[0][0]                    
                                                                 dense_1[0][0]                    
__________________________________________________________________________________________________
activation (Activation)         (None, 3)            0           add[0][0]                        
==================================================================================================
Total params: 21
Trainable params: 12
Non-trainable params: 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...