使用Keras的时空自动编码器在视频中的异常事件检测

时间:2017-04-19 19:29:59

标签: deep-learning keras lstm autoencoder

我试图提高我使用keras库根据本研究论文( https://arxiv.org/abs/1701.01546 )实现的异常事件检测模型的准确性(AUC)。使用的数据仅为着名的 UCSDped1 。 模型AUC最初为50%,在 COnvLSTM 层之间移除批量标准化后,AUC变为63%,经过多次尝试后,不同的损失和优化器以及更改参数,没有似乎增加了它。 我怀疑问题是该模型没有正确的时间学习。

我理解模型的方式如下:在训练阶段,结果将是学习的权重,并且使用这些权重,具有高重建误差的帧(原始帧 - 重建帧)将被认为是异常的。 训练阶段的损失约为0.0013。 那可能是什么错?

任何反馈都会非常感激。

这里是代码:

model = Sequential()

#2 convolution layers
model.add(TimeDistributed(Convolution2D(128, 11, 11 , border_mode='valid',activation = 'tanh', subsample = (4,4)), input_shape=(None,227, 227, 1)))
model.add(TimeDistributed(Convolution2D(64, 5, 5, border_mode='valid',activation = 'tanh', subsample = (2,2))))
#3 ConvLSTM layers
model.add(ConvLSTM2D(nb_filter=64, nb_row=3, nb_col=3,
                   border_mode='same', return_sequences=True))
#model.add(BatchNormalization())
model.add(ConvLSTM2D(nb_filter=32, nb_row=3, nb_col=3,
                   border_mode='same', return_sequences=True))
#model.add(BatchNormalization())
model.add(ConvLSTM2D(nb_filter=64, nb_row=3, nb_col=3,
                   border_mode='same', return_sequences=True))
#model.add(BatchNormalization())
#2 Deconvolution layers
model.add(TimeDistributed(Deconvolution2D(128, 5, 5,border_mode='valid',activation = 'tanh', output_shape=(None,55, 55, 128), subsample = (2,2))))
model.add(TimeDistributed(Deconvolution2D(1, 11, 11,border_mode='valid',activation = 'tanh', output_shape=(None,227, 227, 1), subsample = (4,4))))

model.compile(optimizer='adam', loss='mse')
model.fit(train_data,train_data, batch_size=64,nb_epoch=10)
reconstructed = model.predict(test_data)

e = (test_data-reconstructed)**2

ex = []
for i in e:
    ex.append(np.sqrt(np.sum(i)))

e_min = min(ex)
e_max = max(ex)
abnormality_score = (ex-e_min)/(e_max-e_min)

from sklearn import metrics
#y_test contains 1's for abnormal frame and 0's for normal frame 
fpr, tpr, thresholds = metrics.roc_curve(y_test, abnormality_score )
roc_auc = metrics.auc(fpr, tpr)

print fpr,tpr,thresholds

import matplotlib.pyplot as plt
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()

0 个答案:

没有答案