将多个输入传递到CNN模型

时间:2017-09-05 15:05:48

标签: python tensorflow keras convolution

我有代表域名中每个字符的整数向量和另一个表示时间轴信息的整数向量。我需要将这两个向量作为CNN模型的输入,将域名分类为好或垃圾邮件。

例如,

代表域名的矢量 - > 1 x 75向量。向量中的每个元素表示域名中的每个字符。如果有1000个域名,那么它将是一个形状为1000 x 75的矩阵

表示时间线信息的矢量 - > 1 x 1440向量。每个元素表示每分钟从特定域发送的邮件数。如果有1000个域名,那么它将是一个形状为1000 x 1440

的矩阵

如何将这两个向量输入单个CNN模型?

我的当前模型仅提供域名作为输入,

def build_model(max_features, maxlen):
"""Build CNN model"""
model = Sequential()
model.add(Embedding(max_features, 8, input_length=maxlen))
model.add(Convolution1D(6, 4, border_mode='same'))
model.add(Convolution1D(4, 4, border_mode='same'))
model.add(Convolution1D(2, 4, border_mode='same'))
model.add(Flatten())
#model.add(Dropout(0.2))
#model.add(Dense(2,activation='sigmoid'))
#model.add(Dense(180,activation='sigmoid'))
#model.add(Dropout(0.2))
model.add(Dense(2,activation='softmax'))
sgd = optimizers.SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['categorical_accuracy', 'f1score', 'precision', 'recall'])

谢谢!

2 个答案:

答案 0 :(得分:5)

  

在卷积中,你需要一个"长度"维度和渠道"尺寸。

(在2D中,它们将是"宽度","高度"和#34;频道")。

现在,我无法想办法将75个字符与1440分钟联系起来。 (也许你可以,如果你能说明如何,也许我们可以更好地工作)

以下是我假设:

  • 域名的序列,包含长度75.
  • 域名将有8个频道(因为您的嵌入层有8个输出)
  • 1440分钟的另一个序列。
  • 每分钟只有一个电子邮件渠道

所以,我们有两个输入:

from keras.layers import *

input1 = Input((75,))
input2 = Input((1440,))

只有域名应该通过嵌入层:

name = Embedding(max_features, 8, input_length=maxlen)(input1)

现在,重新整形以适应卷积输入(None,length,channels)

# the embedding output is already (Batch, 75, 8) -- See: https://keras.io/layers/embeddings/    

mails = Reshape((1440,1))(input2) #adding 1 channel at the end    

平行卷积:

name = Conv1D( feel free to customize )(name)
name = Conv1D( feel free to customize )(name)

mails = Conv1D( feel free to customize )(mails)
mails = Conv1D( feel free to customize )(mails)

连接 - 由于它们具有完全不同的形状,也许我们应该简单地展平它们(或者你可以想到花哨的操作来匹配它们)

name = Flatten()(name)
mails = Flatten()(mails)
out = Concatenate()([name,mails])

out = add your extra layers

out = Dense(2,activation='softmax')(out)

最后我们创建了模型:

from keras.models import Model
model = Model([input1,input2], out)

像这样训练:

model.fit([xName,xMails], Y, ....)

答案 1 :(得分:2)

您可以使用Keras'建立一个多输入网络。功能API。为每个输入维度单独设置一维卷积网络。然后连接每个网络的输出,并将该连接的矢量传递到位于两个其他网络之上的一些共享的完全连接的层。

https://keras.io/getting-started/functional-api-guide/#multi-input-and-multi-output-models