为了完成笔者的异常检测目标,在前期使用了传统的机器学习算法后,对“玩具数据集”进行异常检测,此处罗列了计算sklearn算法。笔者准备测试oneclass network 来使用神经网络实践。
自编码器autoencoder是一个BP神经网络,网络输入层和输出层是一样,中间层数可以有多层,中间层的节点个数比输出入层少,最简单的情况就是中间只有一个隐藏层。由于中间层的节点数较少,这样中间层相当于是对数据进行了压缩和抽象,实现无监督的方式学习数据的抽象特征。
在现实中只有正样本数据,没有负样本数据,或者说只关注学习正样本的规律,那么利用正样本训练一个自编码器,编码器就相当于单分类的模型,对全量数据进行预测时,通过比较输入层和输出层的相似度就可以判断记录是否属于正样本。
下面就是案例探索过程:
1、MNIST数据集划为训练、验证、测试

2、定义评价指标函数rounded_accuracy
指标需要自己定义,作为神经网络的训练指标。keras.metrics.binary_accuracy计算预测与二进制标签匹配的频率,适用于二分类。

3、创建堆叠式的自动编码器2 stacked Autoencoders:stacked_encoder、stacked_decoder,3 hidden layers and 1 output layer。

4、绘制学习曲线

5、在测试集上测试

6、绘制重建的图形,对比原始图像和重建后图像

可以看到重建后的图像基本和原始图像差不多,但是损失函数loss值较大。我们可以让训练模型更久一点,或者编码器和解码器更深。但是,现在我们将解码器层的权重与编码器层的权重绑定起来,这样就可以将模型中的权重数量减少一半,加快训练速度并降低过拟合的风险。
7、定义类DenseTranspose复制权重

8、再次训练,在decoder发现明显快很多

网友评论