Как убедиться, что часть ввода не участвует в обучении нейронной сети? - PullRequest
0 голосов
/ 25 января 2020

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

Моя входная форма [100,3] ([нет образцов, нет объектов]).
Моя выходная форма [100,3] ([нет образцов, нет выходов]) .

Я хочу передать 4-мерные данные вместе с каждой входной выборкой (форма этих данных будет [100,4]), чтобы я мог получить к ней доступ для написания пользовательской функции потерь. Я не хочу, чтобы это вовлекалось в процесс обучения.

Примерно так:

def wrapper(input_tensor):
    def custom_loss(y_true, y_pred):
        return binary_crossentropy(y_true, y_pred) + mean(last 4 elements of the input_tensor)
    return custom_loss

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

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

Может кто-нибудь помочь мне решить эту проблему? Пожалуйста, дайте мне знать, если понадобится какая-либо дополнительная информация.

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

1 Ответ

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

Это легко сделать с помощью функционального API Keras. Например:

from tensorflow.keras import Model
from tensorflow.keras.layers import *

input_1 = Input((3,))
input_2 = Input((4,))

output = Dense(100)(input_1)
output = Dense(100)(output)

model = Model(inputs=[input_1, input_2], outputs=[output, input_2])
model.summary()

Обратите внимание, что я определяю input_2, но не использую его в качестве параметра для любого слоя. Я напрямую передаю его параметру outputs Model.

. Сводка для этой модели:

Model: "model_1"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_3 (InputLayer)            [(None, 3)]          0                                            
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 100)          400         input_3[0][0]                    
__________________________________________________________________________________________________
dense_2 (Dense)                 (None, 100)          10100       dense_1[0][0]                    
__________________________________________________________________________________________________
input_4 (InputLayer)            [(None, 4)]          0                                            
==================================================================================================
Total params: 10,500
Trainable params: 10,500
Non-trainable params: 0
__________________________________________________________________________________________________
...