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)
谢谢!
在卷积中,您需要一个“长度”维和一个“通道”维。
(在2D中,它们是“宽度”,“高度”和“通道”)。
现在,我想不出任何办法将75个字符与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)