(Keras-Tensorflow) Как обрезать выходной тензор в зависимости от значения другого выхода? - PullRequest
0 голосов
/ 16 ноября 2018

Я делаю приложение keras, которое предсказывает группу координат из 3D Input Input.Моя архитектура следующая:

img_input = keras.layers.Input((96,64,64,1))

x = keras.layers.Conv3D(32, (3, 3 ,3), activation='relu', padding='same', name='block1_conv1',trainable=True)(img_input)
x = keras.layers.Conv3D(32, (3, 3 ,3), activation='relu', padding='same', name='block1_conv2',trainable=True)(x)
x = keras.layers.MaxPooling3D((2, 2, 2),  name='block1_pool')(x)

# Block 2
x = keras.layers. Conv3D(64, (3, 3 ,3), activation='relu', padding='same', name='block2_conv1',trainable=True)(x)
x = keras.layers.Conv3D(64, (3, 3 ,3), activation='relu', padding='same', name='block2_conv2',trainable=True)(x)
x = keras.layers.MaxPooling3D((2, 2 ,2),  name='block2_pool')(x)

# Block 3
x = keras.layers.Conv3D(128, (3, 3 ,3), activation='relu', padding='same', name='block3_conv1',trainable=True)(x)
x = keras.layers.Conv3D(128, (3, 3 , 3), activation='relu', padding='same', name='block3_conv2',trainable=True)(x)
x = keras.layers.MaxPooling3D((2, 2 ,2),  name='block3_pool')(x)

# Block 3
x = keras.layers.Conv3D(128, (3, 3 ,3), activation='relu', padding='same', name='block4_conv1',trainable=True)(x)
x = keras.layers.Conv3D(128, (3, 3 , 3), activation='relu', padding='same', name='block4_conv2',trainable=True)(x)
x = keras.layers.MaxPooling3D((2, 2 ,2),  name='block4_pool')(x)

x = keras.layers.Flatten(name='flatten')(x)

x = keras.layers.Dense(4096,activation='relu',name="fc7",trainable=True)(x)

x = keras.layers.Dense(4096,activation='relu',name="fc8",trainable=True)(x)

x = keras.layers.Dense(288,activation='linear',name="fc10",trainable=True)(x)

Дело в том, что на самом деле выходные данные не имеют размера 288, все они имеют переменную длину, но я обнулил их все, чтобы иметь фиксированнуюsize output.

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

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

Возможно ли это на кератах?Или не могли бы вы дать мне совет, как выполнить эту задачу (предсказать правильные координаты с правильной длиной)?

Большое спасибо

...