我有一个问题。我已经训练了一个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
1条答案
按热度按时间neekobn81#
从概念上讲,第一个输入
inp
是嵌入的,并通过以x
作为输出的所有层传递。extra_inp
是一组原始输入,它们与卷积的inp
一起传递到Concatenate
层,以返回单个输入集Concatenate
合并了两个输入,一个是“预处理”的输入,另一个是未更改的输入。您可以在keras documentation中查看更多详细信息这里有一个玩具模型,可以作为一个例子:
模型概述:
卷积层获取一批32维向量,并返回形状为
batch_size, new_input_dimension, filters
的Tensor。在本例中,模型配置为padding = 'same'
,因此维度保持不变。Conv1d
层的输出随后由Flatten
层展开,以使其具有正确的形状,从而将其与额外的输入相连接最后,该扩展Tensor被传递到最终的Dense
层以返回模型的输出。下图非常直观:
希望对您有所帮助!