3

我对深度学习的世界还比较陌生。我想为图像异常检测创建一个深度学习模型(最好使用 Tensorflow/Keras)。通过异常检测,我的意思是,本质上是一个OneClassSVM.

我已经使用图像中的 HOG 特征尝试了 sklearn 的 OneClassSVM。我想知道是否有一些例子可以说明我如何在深度学习中做到这一点。我查了一下,但找不到一个可以处理这种情况的代码片段。

4

1 回答 1

2

在 Keras中执行此操作的方法是使用KerasRegressor包装器模块(它们包装 sci-kit learn 的回归器接口)。有用的信息也可以在该模块的代码中找到。基本上,您首先必须定义您的网络模型,例如:

def simple_model():
    #Input layer
    data_in = Input(shape=(13,)) 
    #First layer, fully connected, ReLU activation
    layer_1 = Dense(13,activation='relu',kernel_initializer='normal')(data_in)   
    #second layer...etc
    layer_2 = Dense(6,activation='relu',kernel_initializer='normal')(layer_1)  
    #Output, single node without activation
    data_out = Dense(1, kernel_initializer='normal')(layer_2)     
    #Save and Compile model
    model = Model(inputs=data_in, outputs=data_out)   
    #you may choose any loss or optimizer function, be careful which you chose 
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model

然后,将其传递给KerasRegressor构建器并fit使用您的数据:

from keras.wrappers.scikit_learn import KerasRegressor
#chose your epochs and batches 
regressor = KerasRegressor(build_fn=simple_model, nb_epoch=100, batch_size=64)
#fit with your data
regressor.fit(data, labels, epochs=100)

您现在可以对其进行预测或获得其分数:

p = regressor.predict(data_test) #obtain predicted value
score = regressor.score(data_test, labels_test) #obtain test score

在您的情况下,由于您需要从正常的图像中检测异常图像,您可以采取的一种方法1是通过传递标记的异常图像和标记正常的图像来训练您的回归器0

这将使您的模型在输入是异常图像时返回更接近 1 的值,从而使您能够对所需结果进行阈值处理。您可以将此输出视为您训练为 1(完美匹配)的“异常模型”的 R^2 系数。

此外,正如您所提到的,自动编码器是另一种进行异常检测的方法。为此,我建议您查看 Keras 博客文章Building Autoencoders in Keras,其中详细解释了使用 Keras 库实现它们。


值得注意的是,单类分类是回归的另一种说法。

分类尝试在可能的类别中找到概率分布N,您通常选择最可能的类别作为输出(这就是为什么大多数分类网络Sigmoid在其输出标签上使用激活,因为它的范围为 [0, 1])。它的输出是离散的/分类的。

同样,回归尝试通过最小化错误或其他一些指标(如众所周知的 R^2 指标或确定系数)来找到代表您的数据的最佳模型。它的输出是实数/连续的(这也是大多数回归网络不在其输出上使用激活的原因)。我希望这会有所帮助,祝你的编码好运。

于 2017-10-02T20:57:59.750 回答