TensorFlow基于CICIDS实现流量识别

介绍

​ 要通过 TensorFlow Decision Forests (TF-DF)CICIDS 数据集训练决策树模型,我们需要先准备数据集,并进行必要的预处理。然后,我们使用 TF-DF 训练模型并进行评估。以下是一个逐步的指南:

模型训练

步骤 1:安装必要的库

首先,您需要安装 TensorFlow Decision Forestspandas(如果还没有安装):

1
pip install tensorflow-decision-forests pandas

步骤 2:准备数据集

CICIDS 数据集包含许多网络流量特征,可以直接用于分类任务。假设您已经下载并准备了 CICIDS 2017 数据集中的 CSV 文件,接下来我们将进行数据加载、预处理并准备 TensorFlow 数据集。

步骤 3:加载和预处理 CICIDS 数据集

假设您已经下载了 CICIDS 2017 的数据集,并且文件名为 cicids_2017.csv。我们将使用 pandas 来加载数据并进行一些简单的预处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd

# 加载CICIDS数据集(此处假设文件名为 'cicids_2017.csv')
data = pd.read_csv("cicids_2017.csv")

# 查看数据结构
print(data.head())

# 可以选择特征列和标签列进行训练,假设 'label' 列是目标变量
# 删除可能不需要的列,例如数据集中的 ID 或时间戳等
data = data.drop(columns=["ID", "Timestamp", "some_other_unwanted_column"])

# 检查是否存在缺失值
print(data.isnull().sum())

# 填充缺失值(如有的话)
data = data.fillna(0)

# 确保目标列为字符串类型(分类任务)
data['label'] = data['label'].astype(str)

步骤 4:将数据转换为 TensorFlow 数据集

TensorFlow Decision Forests 需要将数据转换为 TensorFlow 数据集格式。我们可以使用 pd_dataframe_to_tf_dataset 函数进行转换。

1
2
3
4
5
6
7
import tensorflow_decision_forests as tfdf

# 将 pandas DataFrame 转换为 TensorFlow 数据集
dataset = tfdf.keras.pd_dataframe_to_tf_dataset(data, task=tfdf.keras.Task.CLASSIFICATION, label="label")

# 查看数据集格式
print(dataset)

步骤 5:训练决策树模型

在数据集准备好后,我们可以使用 TensorFlow Decision Forests 来训练模型。可以选择 随机森林梯度提升决策树(GBDT)。在这里,我们将使用 RandomForestModel

1
2
3
4
5
6
# 创建并训练随机森林模型
model = tfdf.keras.RandomForestModel(task=tfdf.keras.Task.CLASSIFICATION)
model.fit(dataset)

# 打印模型概述
model.summary()

步骤 6:评估模型

训练完成后,我们可以在同一数据集或单独的测试集上评估模型的表现。

1
2
3
# 评估模型性能
evaluation = model.evaluate(dataset)
print("Model Evaluation:", evaluation)

步骤 7:使用模型进行推理

您可以使用训练好的模型进行推理,给定新的输入数据进行分类预测。

1
2
3
4
5
6
7
8
9
10
# 假设有一个新的测试数据集 'new_data'
new_data = pd.read_csv("new_cicids_data.csv")
new_dataset = tfdf.keras.pd_dataframe_to_tf_dataset(new_data, task=tfdf.keras.Task.CLASSIFICATION, label="label")

# 使用训练好的模型进行预测
predictions = model.predict(new_dataset)

# 输出预测结果
for prediction in predictions:
print(prediction)

步骤 8:导出模型

如果您希望将训练好的模型保存并在其他平台(如 TensorFlow Lite 或 ONNX)上使用,您可以将其保存为 SavedModel 格式:

1
2
# 导出模型
model.save("cicids_random_forest_model")

总结

通过使用 TensorFlow Decision Forests(TF-DF),您可以非常方便地在 CICIDS 数据集 上训练一个决策树模型。此方法适用于网络流量识别任务,并且可以利用 随机森林梯度提升树(GBDT) 等先进的决策树算法。

如果您有更多需求,可以根据需要调整模型的配置、数据预处理和评估方式。

模型部署

要在 C++ 中调用 TensorFlow Lite Micro 进行推理,您需要设置 TensorFlow Lite Micro 库并进行必要的代码集成。以下是如何使用 TensorFlow Lite Micro(TFLite Micro)进行推理的详细步骤。

1. 准备工作

在 C++ 中使用 TensorFlow Lite Micro 进行推理时,首先确保您已安装和配置好 TensorFlow Lite Micro 库。您可以通过以下几种方式获取 TFLite Micro

  • 官方 TensorFlow GitHub 仓库:可以从 TensorFlow GitHub 获取源码并编译。
  • 直接编译:根据平台(如嵌入式设备)选择合适的编译方法。

2. 创建项目

创建一个 C++ 项目,并确保将 TensorFlow Lite Micro 库的路径添加到项目中。

3. 下载或准备模型

您可以使用 TensorFlow Lite 模型,并将其转换为 TFLite 格式。如果您有一个预训练的 TensorFlow 模型,可以使用 tflite_convert 工具将其转换为 .tflite 格式。

1
tflite_convert --saved_model_dir=/path/to/saved_model --output_file=model.tflite

4. C++ 代码实现

以下是一个 C++ 示例代码,演示如何使用 TensorFlow Lite Micro 加载 .tflite 模型并进行推理。

代码步骤:

  • 加载 TFLite 模型。
  • 分配输入和输出张量。
  • 执行推理并获取结果。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <fstream>
#include <vector>
#include "tensorflow/lite/model.h"
#include "tensorflow/lite/interpreter.h"
#include "tensorflow/lite/kernels/register.h"
#include "tensorflow/lite/string_util.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/micro/micro_tensor.h"

// 你可以根据需要调整输入和输出的尺寸
#define INPUT_SIZE 784 // 例如 28x28 的图片输入

// 读取tflite模型的文件
std::vector<char> ReadModelFile(const std::string& model_path) {
std::ifstream model_file(model_path, std::ios::binary);
if (!model_file) {
std::cerr << "Failed to open model file: " << model_path << std::endl;
exit(-1);
}
std::vector<char> model_data((std::istreambuf_iterator<char>(model_file)),
std::istreambuf_iterator<char>());
return model_data;
}

int main() {
// 加载模型文件
std::string model_path = "model.tflite"; // 替换为你的模型路径
std::vector<char> model_data = ReadModelFile(model_path);

// 解析模型
const tflite::Model* model = tflite::GetModel(model_data.data());
if (model == nullptr) {
std::cerr << "Failed to map model data!" << std::endl;
return -1;
}

// 创建 TensorFlow Lite interpreter
tflite::ops::micro::OpResolver resolver;
tflite::MicroInterpreter interpreter(model, resolver, tensor_arena, kTensorArenaSize);

// 分配张量
interpreter.AllocateTensors();

// 获取输入张量
float* input = interpreter.input(0)->data.f; // 获取输入数据(根据模型的输入类型调整)

// 设置输入数据(以 MNIST 为例,28x28 的图像)
// 这里你可以用你的输入数据来替换
for (int i = 0; i < INPUT_SIZE; i++) {
input[i] = 0.0f; // 设置为适当的输入数据
}

// 执行推理
if (interpreter.Invoke() != kTfLiteOk) {
std::cerr << "Error during inference!" << std::endl;
return -1;
}

// 获取输出
float* output = interpreter.output(0)->data.f; // 获取输出数据

// 输出推理结果(示例为分类问题的输出)
std::cout << "Inference results:" << std::endl;
for (int i = 0; i < 10; i++) { // 假设是分类任务,有 10 类输出
std::cout << "Class " << i << ": " << output[i] << std::endl;
}

return 0;
}

5. 重要说明

  • TensorFlow Lite Micro 需要嵌入式设备支持:对于 嵌入式设备(例如 ARM、Raspberry Pi 或其他单片机),需要配置相应的硬件平台和工具链。
  • 输入和输出张量:输入和输出张量的类型及尺寸应该与您的模型匹配。在代码中,我们假设输入是一个 28x28 的图像(如 MNIST),输出是一个 10 类的分类问题。根据您的模型,您需要调整输入和输出数据。
  • 内存管理:在嵌入式设备上,内存管理非常重要。tensor_arena 是用来存储所有中间数据(张量)的位置。您需要为该张量区域分配足够的内存。这里的 kTensorArenaSize 是分配的内存大小,您需要根据模型的要求来设置。

6. 编译和运行

确保您的编译器能够链接到 TensorFlow Lite Micro 库,并根据目标平台设置适当的编译选项。例如,您可能需要为 ARM 架构配置交叉编译工具链。

1
2
g++ -o tflite_inference tflite_inference.cpp -ltensorflowlite_micro -std=c++11 -I/path/to/tensorflow/lite -L/path/to/tensorflow/lite/libs
./tflite_inference

总结

通过 TensorFlow Lite Micro,您可以在嵌入式设备上执行推理。上面的代码展示了如何在 C++ 中加载 .tflite 模型并进行推理,适用于小型设备或资源受限环境。要确保正确配置内存和硬件资源,以确保推理过程能够顺利进行。如果您的平台支持硬件加速(如通过 Arm NeonDSP),也可以配置相应的加速选项来提高推理效率。

TensorFlow Lite 和 TensorFlow Lite for Microcontrollers 之间的区别在于它们的目标平台。TFLite针对移动用例,如Android和iOS设备。顾名思义,TFLite-Micro 针对嵌入式用例的低功耗微控制器和数字信号处理器。这些甚至可以是裸机用例,因为 TFLM 不依赖于操作系统。

TFLM 支持与 TFLite 相同的 .tflite 模型格式。但是,有一些运算符未实现。在大多数情况下,这些可以根据需要从 TFLite 移植,并且有有关如何执行此操作的指南。


TensorFlow基于CICIDS实现流量识别
http://blog.uanet.cn/NETWORK/TensorFlow基于CICIDS实现流量识别.html
作者
dnsnat
发布于
2025年2月13日
许可协议