tensorflow CNN和普通要素之间的串联是如何工作的

nnsrf1az  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(132)

我有一个问题。我已经训练了一个CNN模型来解决NLP分类问题,并将其与其他特征相结合。我正在使用Concatenate来连接这两个层。
我的问题是这种链接是如何工作的?这是如何想到的?

class CNN_1D:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def forward(self):
            # filter_sizes = [1,2,3,5]
            # num_filters = 32
            extra_nb_features = df_train.shape[1]

            inp = Input(shape=(maxlen, ))
            extra_inp = Input(shape=(extra_nb_features, ))

            x = Embedding(embedding_matrix.shape[0], 300, weights=[embedding_matrix], trainable=False)(inp)
            x = SpatialDropout1D(0.4)(x)

            x = Conv1D(256, 7, activation='relu')(x)
            x = MaxPooling1D()(x)

            x = Dropout(0.2)(x)  
            x = Flatten()(x)
            combined = Concatenate(axis=-1)([x, extra_inp])

            combined = Dropout(0.15)(combined)

            outp = Dense(numbmer, activation="softmax")(combined)

            model = Model(inputs=[inp, extra_inp] , outputs=outp)
            model.summary()
            return model
neekobn8

neekobn81#

从概念上讲,第一个输入inp是嵌入的,并通过以x作为输出的所有层传递。extra_inp是一组原始输入,它们与卷积的inp一起传递到Concatenate层,以返回单个输入集Concatenate合并了两个输入,一个是“预处理”的输入,另一个是未更改的输入。您可以在keras documentation中查看更多详细信息
这里有一个玩具模型,可以作为一个例子:

from tensorflow.keras.layers import Input, Conv1D, Flatten, Concatenate, Dense
from tensorflow.keras import Model

inputs = Input(shape= (32,1))
h = Conv1D(filters= 16, kernel_size= 5, activation= 'relu', padding= 'same')(inputs)
h = Flatten()(h)
aux_inputs = Input(shape= (12,))
h = Concatenate()([h, aux_inputs])
output = Dense(20, activation= 'sigmoid')(h)

model = Model(inputs= [inputs, aux_inputs], outputs= output)

模型概述:

卷积层获取一批32维向量,并返回形状为batch_size, new_input_dimension, filters的Tensor。在本例中,模型配置为padding = 'same',因此维度保持不变。Conv1d层的输出随后由Flatten层展开,以使其具有正确的形状,从而将其与额外的输入相连接最后,该扩展Tensor被传递到最终的Dense层以返回模型的输出。
下图非常直观:

希望对您有所帮助!

相关问题