将多个输入传递给CNN模型

AKS*_*HAN 4 python convolution keras tensorflow

我有代表域名中每个字符的整数向量,还有代表时间轴信息的另一个整数向量。我需要将这两个向量都作为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'])
Run Code Online (Sandbox Code Playgroud)

谢谢!

Dan*_*ler 5

在卷积中,您需要一个“长度”维和一个“通道”维。

(在2D中,它们是“宽度”,“高度”和“通道”)。

现在,我想不出任何办法将75个字符与1440分钟联系起来。(也许可以,如果可以说明如何做,也许我们可以做得更好)

这是我所假设的:

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

因此,我们将有两个输入:

from keras.layers import *

input1 = Input((75,))
input2 = Input((1440,))
Run Code Online (Sandbox Code Playgroud)

仅域名应通过嵌入层:

name = Embedding(max_features, 8, input_length=maxlen)(input1)
Run Code Online (Sandbox Code Playgroud)

现在,重塑形状以适合卷积输入(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    
Run Code Online (Sandbox Code Playgroud)

并行卷积:

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)
Run Code Online (Sandbox Code Playgroud)

串联的-由于它们的形状完全不同,也许我们应该简单地将两者扁平化(或者您可以考虑使用花哨的操作来匹配它们)

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

out = add your extra layers

out = Dense(2,activation='softmax')(out)
Run Code Online (Sandbox Code Playgroud)

最后,我们创建模型:

from keras.models import Model
model = Model([input1,input2], out)
Run Code Online (Sandbox Code Playgroud)

像这样训练它:

model.fit([xName,xMails], Y, ....)
Run Code Online (Sandbox Code Playgroud)