正在创建异常行为检测模型,因此为此目的,使用vgg16预训练模块提取特征,因此使用fc2
层来获取我得到的特征(1,4096)作为这些特征的形状,< / p>
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)
,这里使用双向LSTM解决顺序分类问题,这是这类探针的常规方法,但是根据keras文档,LSTM采取三维训练样本,以适合(224, 224, 3)
这样的样本,但是仅获得一维特征,因此可以在上述提取特征的维度上训练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'])