将多个输入传递给 CNN 模型
Passing multiple inputs to CNN model
我有代表域名中每个字符的整数向量和另一个代表时间线信息的整数向量。我需要将这两个向量作为 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'])
谢谢!
您可以使用 Keras 的函数 API 构建多输入网络。每个输入维度分别有一个一维卷积网络。然后连接每个网络的输出,并将连接后的向量传递到位于其他两个网络之上的一些共享的全连接层。
https://keras.io/getting-started/functional-api-guide/#multi-input-and-multi-output-models
In convolutions, you need a "length" dimension and a "channels" dimension.
(在 2D 中,它们将是 "width"、"height" 和 "channels")。
现在,我想不出任何方法将 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, ....)
我有代表域名中每个字符的整数向量和另一个代表时间线信息的整数向量。我需要将这两个向量作为 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'])
谢谢!
您可以使用 Keras 的函数 API 构建多输入网络。每个输入维度分别有一个一维卷积网络。然后连接每个网络的输出,并将连接后的向量传递到位于其他两个网络之上的一些共享的全连接层。
https://keras.io/getting-started/functional-api-guide/#multi-input-and-multi-output-models
In convolutions, you need a "length" dimension and a "channels" dimension.
(在 2D 中,它们将是 "width"、"height" 和 "channels")。
现在,我想不出任何方法将 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, ....)