Как правильно наложить булев слой в керасе? - PullRequest
0 голосов
/ 22 ноября 2018

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

def signumTransform(x):
    """
    SIGNUM function
    if positive 1
    if negative -1
    """
    import keras.backend
    return keras.backend.sign(x)

def logical_or_layer(x):
    """Processing an OR operation"""
    import keras.backend
    #normalized to 0,1 
    aux_array = keras.backend.sign(x)
    aux_array = keras.backend.relu(aux_array)
    # OR operation
    aux_array = keras.backend.any(aux_array)
    # casting back the True/False to 1,0
    aux_array = keras.backend.cast(aux_array, dtype='float32')
    return aux_array


#this is the input tensor
inputs = Input(shape=(inputSize,), name='input')

#this is the Neurule layer
x = Dense(neurulesQt, activation='softsign', name='neurules')(inputs)
#after each neuron layer, the outputs need to be put into SIGNUM (-1 or 1)
x = Lambda(signumTransform, output_shape=lambda x:x, name='signumAfterNeurules')(x)

#separating into 2 (2 possible outputs)
layer_split0 = Lambda( lambda x: x[:, :11], output_shape=[11], name='layer_split0')(x)
layer_split1 = Lambda( lambda x: x[:, 11:20], output_shape=[9], name='layer_split1')(x)
#this is the OR layer
y_0 = Lambda(logical_or_layer, output_shape=[1], name='or0')(layer_split0)
y_1 = Lambda(logical_or_layer, output_shape=[1], name='or1')(layer_split1)

y = Lambda(lambda x: K.stack([x[0], x[1]]),output_shape=[2],  name="output")([y_0, y_1])

До тех пор, пока layer_split все не будет работать правильно, но в моих y_0 и y_1 мне нужно выполнить операцию ИЛИ с keras.backend.any(), в качестве возврата яполучить логическое значение, поэтому я приведу его обратно с keras.backend.cast().

Если я использую модель, как описано здесь, она работает ... она компилируется, может быть проверена и так далее, но если я пытаюсьсохраните его и загрузите, он просто теряет одно измерение, размер пакета (None).Вывод в сводке отображается как (None, 2), но при использовании в качестве слоя и объединении с другим он показывает (2,) и выдается ошибка:

InvalidArgumentError: Shape must be rank 2 but is rank 1 for 'merging_layer_10/concat' (op: 'ConcatV2') with input shapes: [?,16], [2], [].

Как мне правильно привести его в функцию logical_or_layer?Должен ли я изменить output_shape в лямбда-слое?

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