我正在创建异常行为检测模型,所以为此我使用vgg16预训练模块来提取特征,所以使用 fc2 层来获取我得到的特征(1,4096)作为这些特征的形状,

base_model = VGG16(weights=weights, include_top=include_top)
base_model.compile(optimizer=SGD(), loss='categorical_crossentropy', metrics=['accuracy'])
model = Model(input=base_model.input, output=base_model.get_layer('fc2').output)
print(model.summary())
image_size = (224, 224)

这是我如何定义vgg16模型,并获得功能,使用前一个softmax激活层之前的预测 .

img = np.array(cv2.resize(image, image_size))
x = img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
feature = model.predict(x)

并且,当寻找特征的形状时,

print feature.shape

我得到:,(1,4096)

这里使用Bidirectional-LSTM进行顺序分类问题,这是这类探测的常规方法,但根据keras文档,LSTM采用三维训练样本,以适应 (224, 224, 3) ,但我只获得1D功能,因此可以在上面提取的特征的维度上训练LSTM,或者是否有任何替代解决方案,例如将特征重塑为3D通道,但由于特征长度而不可能,并且需要更多的特征长度来重塑它到 (224, 224, 3) .

model = Sequential()
model.add(Bidirectional(LSTM(units=HIDDEN_UNITS, return_sequences=True),
                        input_shape=(self.expected_frames, self.num_input_tokens)))
model.add(Bidirectional(LSTM(10)))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))

model.add(Dense(self.nb_classes))

model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])