Я работаю с некоторыми пользовательскими слоями и у меня возникают проблемы с их формой, когда я работаю с ним отдельно, он работает, но когда я загружаю модель для использования в другом в качестве слоя, он больше не работает.Вот мое определение слоев:
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
в лямбда-слое?