基于深度学习模型(1D CNN)实现钓鱼网站检测

一、运行环境

  1. windows10系统
  2. 虚拟环境:Anaconda3
  3. python版本:3.8.8
  4. 框架工具:TensorFlow(tensorflow-gpu2.7.0)
  5. 编译工具IDE:VsCode
  6. 环境安装教程:
    1. https://blog.csdn.net/Gerald_Jones/article/details/121370247
    2. https://blog.csdn.net/Gerald_Jones/article/details/121549127
    3. https://blog.csdn.net/Gerald_Jones/article/details/121512837

二、选题背景

2.1 题目

基于深度学习的钓鱼网站检测

2.2 项目简介

本项目提出了一种基于深度学习的方法,实现对钓鱼网站的高精度检测。所提出的方法利用卷积神经网络(CNN)进行高精度分类,以区分真正的网站和钓鱼网站。

2.3 项目的成果

我们使用具有6,157个真实网站和4,898个钓鱼网站获得的数据集来评估这些模型。通过实验验证,验证集的准确率可达98.2%。

三、知识背景

3.1 卷积神经网络(CNN)

CNN属于人工神经网络家族,它是受生物神经网络特性启发的计算模型。经常应用于图像识别、自然语言处理、灾难气候预测等应用场景中。

卷积层:一般情况下,为了能从神经网络中的每一小块得到更多的抽象特征,卷积层的单元矩阵比上一层的单元矩阵更深。卷积层主要作用于提取最优特征。

池化层:池化层的单元矩阵不会比上一层的单元矩阵更深,但是它能在宽度和高度上缩小矩阵的大小,也可以达到减少整个神经网络中参数的目的。池化层作用于减少卷积层特征的维度。

全连接层:通过卷积层和池化层得到的矩阵特征结果,通过构建几个全连接层,实现分类的效果。

softmax层:通过softmax层,可以得到输出样例所属种类的概率分布。

Note1:由于卷积操作是特殊的线性变化,所以将卷积层结果传递到池化层前,都需要经过去线性化处理,常用的是tf.nn.relu.

Note2:CNN的性能一般受层数和滤波器(内核)数量的影响,在CNN的更深层中提取的抽象特征越来越多,因此,所需的层数取决于被分析数据的复杂性和非线性。此外,每个阶段的过滤器数量决定了提取的特征数量。计算复杂性随着层数和滤波器数量的增加而增加。

3.2 一维卷积神经网络(1D CNN)

1D CNN 可以很好地应用于传感器数据的时间序列分析。例如:时间延迟网络 Time Delay Neural Network;同样也可以很好地用于分析具有固定长度周期的信号数据。例如:音频信号,WaveNet。此外,它还能应用于自然语言处理的任务(由于单词的接近性可能并不总是一个可训练模式的好指标,因此 LSTM 网络在 NLP 中的应用更有前途)

1D CNN在包含矢量化的数据集方面也比较适用,这类数据集一般是用来预测某一分类结果,本项目的数据集很符合1D CNN在此方面的应用,因此采用的方式是1D CNN模型。

下图示是conv1D和conv2D的区别,很形象:

3.3 项目的模型

项目的CNN架构如下:两个卷积层、两个最大池化层、三个全连接层、一个输出层。

其中在卷积层利用ReLU(Rectified Linear Units)激活函数:
φ ( z ) = m a x ( 0 , z ) φ(z) = max(0, z) φ(z)=max(0,z)
RuLU激活函数能够在输入和0之间求最大值的函数。ReLU函数能有助于缓解消失和爆炸梯度问题。

项目的1D CNN模型

四、实验

4.1 框架

项目的模型是通过Python来实现,并使用了TensorFlow自带的Kears库,同时也是用了Numpy、Pandas、Scikit Learn等库。

其中Keras是本项目构建模型的主要的库,这里简要介绍一下Keras:Keras是由纯python编写的基于theano/tensorflow的深度学习框架。

适用范围

  • 简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)

  • 支持CNN和RNN,或二者的结合。

  • 无缝CPU和GPU切换。

优点

  • 用户友好:Keras遵循减少认知困难的最佳实践:Keras提供一致而简洁的API, 能够极大减少一般应用下用户的工作量,同时,Keras提供清晰和具有实践意义的bug反馈。

  • 模块性:模型可理解为一个层的序列或数据的运算图,完全可配置的模块可以用最少的代价自由组合在一起。具体而言,网络层、损失函数、优化器、初始化策略、激活函数、正则化方法都是独立的模块,你可以使用它们来构建自己的模型。

  • 易扩展性:添加新模块容易,只需仿照现有的模块编写新的类或函数即可。创建新模块的便利性使得Keras更适合于先进的研究工作。

  • 与Python协作:Keras没有单独的模型配置文件类型(作为对比,caffe有),模型由python代码描述,使其更紧凑和更易debug,并提供了扩展的便利性。

Keras的模块结构

在这里插入图片描述

Keras搭建一个神经网络

在这里插入图片描述

4.2 数据集

项目的数据集采用UCI网站的基础数据集,kaggle上也有相应的数据集。数据集包括从4,898个钓鱼网站和6,157个合法网站获得的11,055个实例。

下图为数据集:

在这里插入图片描述

数据集中具体指标的属性如下表所示:一共有30个属性,

在这里插入图片描述

此数据集的标签释义:

在这里插入图片描述

4.3 程序设计

整体代码的结构示意图如下:

在这里插入图片描述

主要包括几个函数:

gendatas():对原始数据集的处理(归一化、拆分、reshape),返回训练模型用的数据和标签、验证模型的数据和标签。

create_model():使用Keras库创建模型,根据模型搭建流程,依次是卷积层-1、最大池化层-1、卷积层-2、最大池化层-2、Flatten层-1、Dropout层-1、全连接层-1、全连接层-2、输出层-1。

train_model():实现模型权重的保存,便于下次可以直接调用模型进行训练;实现TensorBoard运行log的保存,便于TensorBoard可视化;实现模型的训练。

model的summary如下:

在这里插入图片描述

主函数:

if __name__ == "__main__":
    stamp = datetime.now().strftime("%Y%m%d-%H-%M-%S")
    model_file_path = os.path.join(CURRENT_DIR, "models\\pWeb-cnn1D-"+stamp)
    log_file_path = os.path.join(CURRENT_DIR, "logs\\pWeb-cnn1D-"+stamp)
   
    inputs_train, outputs_train, inputs_test, outputs_test = gen_datas(train, test)

    # 新建网络模型
    model = create_model()
    # 保存网络模型
    display_cnn1D_structure(model, os.path.join(CURRENT_DIR, "images\\1206cnn1D-structure.png"))
    # 训练网络模型:只保留权重
    train_model(model, inputs_train, outputs_train, inputs_test, outputs_test, model_file_path, log_file_path)
    # 保存模型
    # model_path = os.path.join(CURRENT_DIR, "models")
    
    # 测试集验证
    # 验证其中一个数据
    # test_phWeb = tf.convert_to_tensor([inputs_test[0]])
    # pre = model.predict(test_phWeb)
    # # 输出loss 和 accuracy
    # pre = tf.math.argmax(pre, 1)
    # print("prediction:{}".format(pre))
    
    # 验证数据集
    # pre = prediction(model, model_path, inputs_test)

数据处理函数:

def gen_datas(train, test):
    """生成数据
    参数:
        train: 原始训练数据集
        test: 原始验证数据集
    返回:
        X_train_r: 处理后训练数据集
        y_train: 处理后训练标签
        X_test_r: 处理后验证数据集
        y_test: 处理后验证标签
    """

    label_encoder_train = LabelEncoder().fit(train.Result)
    labels_train = label_encoder_train.transform(train.Result)
    label_encoder_test = LabelEncoder().fit(test.Result)
    labels_test = label_encoder_test.transform(test.Result)    
    classes = list(label_encoder_train.classes_)
    # classes_test = list(label_encoder_test.classes_)

    train = train.drop('Result', axis=1)
    test = test.drop('Result', axis=1)
    
    # 标签的种类 = NB_CLASS
    numb_class = len(classes)
    # 数据的归一化处理
    scaled_train = data_scaler(train)

    # 同一文件内数据集:10%作为测试集,90%作为训练集
    # random_state:随机数种子,和random中的seed种子一样,保证每次抽样到的数据一样,便于调试
    sss = StratifiedShuffleSplit(test_size=0.1, random_state=23)
    for train_index, test_index in sss.split(scaled_train, labels_train):
        X_train, X_test = scaled_train[train_index], scaled_train[test_index]
        y_train, y_test = labels_train[train_index], labels_train[test_index]

    # 不同文件作为训练集和验证集
    # y_train = labels_train
    # X_train = data_scaler(train)
    # y_test = labels_test
    # X_test = data_scaler(test)

    # reshape train data 
    # reshape 30*1
    # 也可以reshape 10*3
    X_train_r = np.zeros((len(X_train), NB_FEATURES, 1))
    X_train_r[:, :, 0] = X_train[:, :NB_FEATURES]
    # X_train_r[:, :, 1] = X_train[:, NB_PER_LAYER: NB_PER_LAYER * 2]
    # X_train_r[:, :, 2] = X_train[:, NB_PER_LAYER * 2:]

    # reshape test data
    X_test_r = np.zeros((len(X_test), NB_FEATURES, 1))
    X_test_r[:, :, 0] = X_test[:, :NB_FEATURES]
    # X_test_r[:, :, 1] = X_test[:, NB_PER_LAYER: NB_PER_LAYER * 2]
    # X_test_r[:, :, 2] = X_test[:, NB_PER_LAYER * 2:]

    y_train = np_utils.to_categorical(y_train, NB_CLASS)
    y_test = np_utils.to_categorical(y_test, NB_CLASS)

    return X_train_r, y_train, X_test_r, y_test

优化函数:

def compile_model(model):
    """神经网络参数配置
    参数:
        model: 神经网络实例
    返回:
        无
    """
    # 使用随机梯度下降优化器
    sgd = SGD(lr=0.01, nesterov=True, decay=1e-6, momentum=0.9)
    model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])

创建模型函数:

def create_model():
    """使用keras新建神经网络
    参数:
        无
    返回:
        model: 神经网络实例
    """
    model = tf.keras.Sequential(name = "phWeb-cnn1D")
    # 卷积层-1
    model.add(
        layers.Conv1D(64, 
        kernel_size = 10,
        padding = 'same', 
        activation='relu', 
        input_shape = (NB_FEATURES, 1), # 输入模型30*1        
        name="conv-1"
        )
    )    
    # 池化层-1
    model.add(
        layers.MaxPool1D(pool_size=2, 
        strides=2,
        name="max-pooling-1"
        )
    )
    # 卷积层-2
    model.add(
        layers.Conv1D(64, 
        kernel_size = 5,
        padding = 'same',  
        activation='relu',     
        name="conv-2"
        )
    ) 
    # 池化层-2
    model.add(
        layers.MaxPool1D(pool_size=2, 
        strides=2,
        name="max-pooling-2"
        )
    )
    # 激活层-1
    # model.add(
    #     layers.Activation('relu', 
    #     name = "activation-1")
    # )
    # 全连接层-1
    model.add(layers.Flatten(name="fullc-1"))
    # DropOut层-1
    model.add(
        layers.Dropout(rate = 0.4, 
        name = "dropout-1")
    )
    # 全连接层-2
    model.add(
        layers.Dense(8,
        activation='relu',
        name="fullc-2")
    )
    # 全连接层-3
    model.add(
        layers.Dense(4,
        activation='relu',
        name="fullc-3")
    )    
    # 全连接层-4
    model.add(
        layers.Dense(NB_CLASS,
        activation='softmax', 
        name="output-1" 
        )
    )

    # 配置损失计算及优化器
    compile_model(model)
    return model

模型训练函数:

def train_model(model, inputs, outputs, inputs_test, outputs_test, model_path, log_path):
    """训练神经网络
    参数:
        model: 神经网络实例
        inputs: 输入数据
        outputs: 输出数据
        model_path: 模型文件路径
        log_path: 日志文件路径
    返回:
        无
    """
    # 回调函数
    ckpt_callback = callback_only_params(model_path)
    # tensorboard回调
    tensorboard_callback = tb_callback(log_path)
   # 保存参数
    model.save_weights(model_path.format(epoch=0))

    numb_epochs = 300
    model.fit(
        inputs, 
        outputs,
        epochs=numb_epochs, 
        validation_data=(inputs_test, outputs_test), 
        batch_size=16, 
        callbacks=[ckpt_callback, tensorboard_callback]
    )

4.4 实验结果

使用的可视化工具是:TensorBoard

通过图示可以看出,在epoch==100左右,accuracy开始趋于收敛,此时在0.97~0.98间震荡,验证集的正确率最高可达98.28%,使用1D CNN构建的模型,能够很好的预测此类钓鱼网站的真与假。

accuracy曲线:

在这里插入图片描述

loss曲线:

[外链图片转存中...(img-EfoliWkw-1638841341978)]

五、问题与思考

5.1 钓鱼网站的实时检测

后续设计一个可视化界面,根据30个属性向量,主要对输入的网址url进行数据处理,并生成[30, 1]的属性向量,依据目前后台1D CNN模型进行预测,返回是否为钓鱼网站,以来验证此模型是否能够具有现实意义。

  • 14
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
卷积神经网络(Convolutional Neural Network, CNN)是一种专门针对图像、视频等结构化数据设计的深度学习模型,它在计算机视觉、语音识别、自然语言处理等多个领域都有广泛应用。CNN的核心设计理念源于对生物视觉系统的模拟,尤其是大脑皮层中视觉信息处理的方式,其主要特点包括局部感知、权重共享、多层级抽象以及空间不变性。以下是CNN技术的详细介绍: ### **1. 局部感知与卷积操作** **卷积层**是CNN的基本构建块,它通过使用一组可学习的滤波器(或称为卷积核)对输入图像进行扫描。每个滤波器在图像上滑动(卷积),并以局部区域(感受野)内的像素值与滤波器权重进行逐元素乘法后求和,生成一个输出值。这一过程强调了局部特征的重要性,因为每个滤波器仅对一小部分相邻像素进行响应,从而能够捕获图像中的边缘、纹理、颜色分布等局部特征。 ### **2. 权重共享** 在CNN中,同一滤波器在整个输入图像上保持相同的权重(参数)。这意味着,无论滤波器在图像的哪个位置应用,它都使用相同的参数集来提取特征。这种权重共享显著减少了模型所需的参数数量,增强了模型的泛化能力,并且体现了对图像平移不变性的内在假设,即相同的特征(如特定形状或纹理)不论出现在图像的哪个位置,都应由相同的滤波器识别。 ### **3. 池化操作** **池化层**通常紧随卷积层之后,用于进一步降低数据维度并引入一定的空间不变性。常见的池化方法有最大池化和平均池化,它们分别取局部区域的最大值或平均值作为输出。池化操作可以减少模型对微小位置变化的敏感度,同时保留重要的全局或局部特征。 ### **4. 多层级抽象** CNN通常包含多个卷积和池化层堆叠在一起,形成深度网络结构。随着网络深度的增加,每一层逐渐提取更复杂、更抽象的特征。底层可能识别边缘、角点等低级特征,中间层识别纹理、部件等中级特征,而高层可能识别整个对象或场景等高级语义特征。这种层级结构使得CNN能够从原始像素数据中自动学习到丰富的表示,无需人工设计复杂的特征。 ### **5. 激活函数与正则化** CNN中通常使用非线性激活函数(如ReLU、sigmoid、tanh等)来引入非线性表达能力,使得网络能够学习复杂的决策边界。为了防止过拟合,CNN常采用正则化技术,如L2正则化(权重衰减)来约束模型复杂度,以及Dropout技术,在训练过程中随机丢弃一部分神经元的输出,以增强模型的泛化性能。 ### **6. 应用场景** CNN在诸多领域展现出强大的应用价值,包括但不限于: - **图像分类**:如识别图像中的物体类别(猫、狗、车等)。 - **目标检测**:在图像中定位并标注出特定对象的位置及类别。 - **语义分割**:对图像中的每个像素进行分类,确定其所属的对象或背景类别。 - **人脸识别**:识别或验证个体身份。 - **图像生成**:通过如生成对抗网络(GANs)等技术创建新的、逼真的图像。 - **医学影像分析**:如肿瘤检测、疾病诊断等。 - **自然语言处理**:如文本分类、情感分析、词性标注等,尽管这些任务通常结合其他类型的网络结构(如循环神经网络)。 ### **7. 发展与演变** CNN的概念起源于20世纪80年代,但其影响力在硬件加速(如GPU)和大规模数据集(如ImageNet)出现后才真正显现。经典模型如LeNet-5用于手写数字识别,而AlexNet、VGG、GoogLeNet、ResNet等现代架构在图像识别竞赛中取得突破性成果,推动了CNN技术的快速发展。如今,CNN已经成为深度学习图像处理领域的基石,并持续创新,如引入注意力机制、残差学习、深度可分离卷积等先进思想。 综上所述,卷积神经网络通过其独特的局部感知、权重共享、多层级抽象等特性,高效地从图像数据中提取特征并进行学习,已成为解决图像和视频处理任务不可或缺的工具,并在众多实际应用中取得了卓越的效果。
卷积神经网络(Convolutional Neural Network, CNN)是一种专门针对图像、视频等结构化数据设计的深度学习模型,它在计算机视觉、语音识别、自然语言处理等多个领域都有广泛应用。CNN的核心设计理念源于对生物视觉系统的模拟,尤其是大脑皮层中视觉信息处理的方式,其主要特点包括局部感知、权重共享、多层级抽象以及空间不变性。以下是CNN技术的详细介绍: ### **1. 局部感知与卷积操作** **卷积层**是CNN的基本构建块,它通过使用一组可学习的滤波器(或称为卷积核)对输入图像进行扫描。每个滤波器在图像上滑动(卷积),并以局部区域(感受野)内的像素值与滤波器权重进行逐元素乘法后求和,生成一个输出值。这一过程强调了局部特征的重要性,因为每个滤波器仅对一小部分相邻像素进行响应,从而能够捕获图像中的边缘、纹理、颜色分布等局部特征。 ### **2. 权重共享** 在CNN中,同一滤波器在整个输入图像上保持相同的权重(参数)。这意味着,无论滤波器在图像的哪个位置应用,它都使用相同的参数集来提取特征。这种权重共享显著减少了模型所需的参数数量,增强了模型的泛化能力,并且体现了对图像平移不变性的内在假设,即相同的特征(如特定形状或纹理)不论出现在图像的哪个位置,都应由相同的滤波器识别。 ### **3. 池化操作** **池化层**通常紧随卷积层之后,用于进一步降低数据维度并引入一定的空间不变性。常见的池化方法有最大池化和平均池化,它们分别取局部区域的最大值或平均值作为输出。池化操作可以减少模型对微小位置变化的敏感度,同时保留重要的全局或局部特征。 ### **4. 多层级抽象** CNN通常包含多个卷积和池化层堆叠在一起,形成深度网络结构。随着网络深度的增加,每一层逐渐提取更复杂、更抽象的特征。底层可能识别边缘、角点等低级特征,中间层识别纹理、部件等中级特征,而高层可能识别整个对象或场景等高级语义特征。这种层级结构使得CNN能够从原始像素数据中自动学习到丰富的表示,无需人工设计复杂的特征。 ### **5. 激活函数与正则化** CNN中通常使用非线性激活函数(如ReLU、sigmoid、tanh等)来引入非线性表达能力,使得网络能够学习复杂的决策边界。为了防止过拟合,CNN常采用正则化技术,如L2正则化(权重衰减)来约束模型复杂度,以及Dropout技术,在训练过程中随机丢弃一部分神经元的输出,以增强模型的泛化性能。 ### **6. 应用场景** CNN在诸多领域展现出强大的应用价值,包括但不限于: - **图像分类**:如识别图像中的物体类别(猫、狗、车等)。 - **目标检测**:在图像中定位并标注出特定对象的位置及类别。 - **语义分割**:对图像中的每个像素进行分类,确定其所属的对象或背景类别。 - **人脸识别**:识别或验证个体身份。 - **图像生成**:通过如生成对抗网络(GANs)等技术创建新的、逼真的图像。 - **医学影像分析**:如肿瘤检测、疾病诊断等。 - **自然语言处理**:如文本分类、情感分析、词性标注等,尽管这些任务通常结合其他类型的网络结构(如循环神经网络)。 ### **7. 发展与演变** CNN的概念起源于20世纪80年代,但其影响力在硬件加速(如GPU)和大规模数据集(如ImageNet)出现后才真正显现。经典模型如LeNet-5用于手写数字识别,而AlexNet、VGG、GoogLeNet、ResNet等现代架构在图像识别竞赛中取得突破性成果,推动了CNN技术的快速发展。如今,CNN已经成为深度学习图像处理领域的基石,并持续创新,如引入注意力机制、残差学习、深度可分离卷积等先进思想。 综上所述,卷积神经网络通过其独特的局部感知、权重共享、多层级抽象等特性,高效地从图像数据中提取特征并进行学习,已成为解决图像和视频处理任务不可或缺的工具,并在众多实际应用中取得了卓越的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值