简体   繁体   English

Keras 屏蔽输出层

[英]Keras Masking Output Layer

I have the following Model in Keras:我在 Keras 中有以下模型:

main_input = Input(shape=(None, 2, 100, 100), dtype='float32', name='input')

hidden = ConvLSTM2D(filters=16, 
                    kernel_size=(5, 5),  
                    padding='same', 
                    return_sequences=False, 
                    data_format='channels_first')(main_input)

output = Conv2D(filters=1, 
                kernel_size=(1, 1), 
                padding='same',
                activation='sigmoid',
                kernel_initializer='glorot_uniform',
                data_format='channels_first',
                name='output')(hidden)

sgd = SGD(lr=0.002, momentum=0.0, decay=0.0, nesterov=False)

I want to multiply the output, which is a 2d array, by a mask (there is a separate mask for each example).我想将输出(二维数组)乘以掩码(每个示例都有一个单独的掩码)。 How can I do this in Keras?我怎么能在 Keras 中做到这一点?

I think you should input the mask of each sample to the model at the same time.我认为您应该同时将每个样本的掩码输入模型。

Here is the suggested code:这是建议的代码:

from keras.layers import Multiply

main_input = Input(shape=(None, 2, 100, 100), dtype='float32', name='input')

mask=Input(shape=(1, 100, 100), dtype='float32', name='mask')

hidden = ConvLSTM2D(filters=16, 
                    kernel_size=(5, 5),  
                    padding='same', 
                    return_sequences=False, 
                    data_format='channels_first')(main_input)

output = Conv2D(filters=1, 
                kernel_size=(1, 1), 
                padding='same',
                activation='sigmoid',
                kernel_initializer='glorot_uniform',
                data_format='channels_first',
                name='output')(hidden)
output_with_mask=Multiply()([output, mask])

model=Model([main_input, mask], output_with_mask)

The summary is as follow:总结如下:

    __________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input (InputLayer)              (None, None, 2, 100, 0                                            
__________________________________________________________________________________________________
conv_lst_m2d_7 (ConvLSTM2D)     (None, 16, 100, 100) 28864       input[0][0]                      
__________________________________________________________________________________________________
output (Conv2D)                 (None, 1, 100, 100)  17          conv_lst_m2d_7[0][0]             
__________________________________________________________________________________________________
mask (InputLayer)               (None, 1, 100, 100)  0                                            
__________________________________________________________________________________________________
multiply_7 (Multiply)           (None, 1, 100, 100)  0           output[0][0]                     
                                                                 mask[0][0]                       
==================================================================================================
Total params: 28,881
Trainable params: 28,881
Non-trainable params: 0
__________________________________________________________________________________________________

Making this work with tensorflow 2.0 and tf.keras.使用 tensorflow 2.0 和 tf.keras 进行这项工作。

import tensorflow as tf
from tensorflow.keras.layers import Multiply, Conv2D, ConvLSTM2D, Input

main_input = Input(shape=(None, 2, 100, 100), dtype='float32', name='input')

mask=Input(shape=(1, 100, 100), dtype='float32', name='mask')

hidden = ConvLSTM2D(filters=16, 
                    kernel_size=(5, 5),  
                    padding='same', 
                    return_sequences=False, 
                    data_format='channels_first')(main_input)

output = Conv2D(filters=1, 
                kernel_size=(1, 1), 
                padding='same',
                activation='sigmoid',
                kernel_initializer='glorot_uniform',
                data_format='channels_first',
                name='output')(hidden)
output_with_mask=Multiply()([output, mask])

Creating an new output and use your old output as second hiden layer.创建一个新输出并将旧输出用作第二个隐藏层。

You want to make an second convolution (with an spécial mask) on your "old output" to get your new output您想在“旧输出”上进行第二次卷积(使用特殊掩码)以获得新输出

Hope it will help you希望它会帮助你

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM