加密流量分类torch实践5:TrafficClassificationPandemonium项目更新3
更新日志
代码已经推送开源至露露云的github,如果能帮助你,就给鼠鼠点一个star吧!!!
我的CSDN博客
我的Github Page博客
3/23日更新(此部分上节已经介绍)
当前更新对运行项目是无影响的,也就是说如果你是仅仅使用项目而不进行扩展的话,此处更新是透明的,对当前仓库版本的代码可以不进行同步。
代码已经推送开源至露露云的github,如果能帮助你,就给鼠鼠点一个star吧!!!
模型结构更新
简要:由原先各个模型独立抽象出了一个
base_model
模型基类,由该基类继承nn.Module
类,定义抽象方法forward
与data_trans
,方便不同模型进行各自的数据变换
-
为什么要改?
dataloader
给模型输入的数据格式是固定死的,给每一个模型设定不同的dataloader
违背了项目多个模型统一代码
原则,而不同模型对于数据的输入样式是不同的,为了适用于之后会加入项目的模型,抽象出一个基类,设定一个data_trans
抽象方法,每一个模型都根据模型的输入去实现该方法即可,这样做到了不更改dataloader
的目的,做到代码复用 -
dataloader
给定的数据样式?分析日志可以给出以下各个维度下
dataloader
给定的数据shape
[2024-03-23 17:19:38,802 INFO] 是否使用 GPU 进行训练, cuda [2024-03-23 17:19:44,781 INFO] 成功初始化模型. [2024-03-23 17:19:44,814 INFO] pcap 文件大小, torch.Size([404, 1, 1024]); seq文件大小:torch.Size([404, 128, 1]); sta文件大小: torch.Size([404, 1024]); label 文件大小: torch.Size([404]) [2024-03-23 17:19:44,851 INFO] pcap 文件大小, torch.Size([404, 1, 1024]); seq文件大小:torch.Size([404, 128, 1]); sta文件大小: torch.Size([404, 1024]); label 文件大小: torch.Size([404]) [2024-03-23 17:19:44,851 INFO] 成功加载数据集.
负载pay: [batch_size,1,m*n]
包长seq: [batch_size,seq_len,1]
统计sta: [batch_size,sta_len]
- m*n是预处理的前m个包的前n个字节,这里目前写的是4*256也就是1024
- seq_len是预处理的前ip_length个包长,这里目前是128
- sta_len是预处理的统计维度,在10号更新的数据下是26
3/28日更新
增加模型二维卷积神经网络CNN2d
-
由于前期中的使用
继承
改善了模型结构,这里只需要写一个py文件就可以了""" @Description: 二维卷积神经网络 """ from math import sqrt import torch import torch.nn as nn from models.base_model import BaseModel class Cnn2d(BaseModel): def __init__(self, num_classes=12): super(Cnn2d, self).__init__() # 卷积层+池化层 self.features = nn.Sequential( nn.Conv2d(kernel_size=5,in_channels=1,out_channels=32,stride=1,padding=2), # b,32,32,32 nn.MaxPool2d(kernel_size=2), # b,32,16,16 nn.Conv2d(kernel_size=5,in_channels=32,out_channels=64,stride=1,padding=2), # b,64,16,16 nn.MaxPool2d(kernel_size=2), # b,64,8,8 ) # 全连接层 self.classifier = nn.Sequential( # 29*64 nn.Flatten(), nn.Linear(in_features=64 * 64, out_features=1024), # 1024:64*64 nn.Dropout(0.5), nn.Linear(in_features=1024, out_features=num_classes) ) def forward(self, pay, seq, sta): pay, seq, sta = self.data_trans(pay, seq, sta) pay = self.features(pay) # 卷积层, 提取特征 pay = self.classifier(pay) # 分类层, 用来分类 return pay, None def data_trans(self, x_payload, x_sequence, x_sta): # 转换 x_0,x_1,x_2 = x_payload.shape[0],x_payload.shape[1],x_payload.shape[2] x_payload = x_payload.reshape(x_0,x_1,int(sqrt(x_2)),int(sqrt(x_2))) return x_payload, x_sequence, x_sta def cnn2d(model_path, pretrained=False, **kwargs): """ CNN 1D model architecture Args: pretrained (bool): if True, returns a model pre-trained model """ model = Cnn2d(**kwargs) if pretrained: checkpoint = torch.load(model_path) model.load_state_dict(checkpoint['state_dict']) return model def main(): a = sqrt(1024) x_pay = torch.rand(8,1,1024) cnn = Cnn2d() x = cnn(x_pay,x_pay,x_pay) if __name__=="__main__": main()
模型结构:
两个卷积+池化的组合,卷积核大小都是5X5,池化层的核大小都是2X2
-
在
train_test_model.py
中,改动from utils.set_config import setup_config # from models.cnn1d import cnn1d as train_model # from models.app_net import app_net as train_model from models.cnn2d import cnn2d as train_model
即可!
-
开始训练!
[2024-03-28 21:20:53,317 INFO] Epoch: [47][2/4], Loss 0.0001 (0.0005), Prec@1 100.000 (100.000) [2024-03-28 21:20:53,345 INFO] Epoch: [47][3/4], Loss 0.0000 (0.0005), Prec@1 100.000 (100.000) [2024-03-28 21:20:53,544 INFO] * Prec@1 100.000 [2024-03-28 21:20:53,716 INFO] Epoch: [48][1/4], Loss 0.0001 (0.0002), Prec@1 100.000 (100.000) [2024-03-28 21:20:53,723 INFO] Epoch: [48][3/4], Loss 0.0000 (0.0003), Prec@1 100.000 (100.000) [2024-03-28 21:20:54,066 INFO] Epoch: [48][0/4], Loss 0.0000 (0.0000), Prec@1 100.000 (100.000) [2024-03-28 21:20:54,105 INFO] Epoch: [48][1/4], Loss 0.0014 (0.0007), Prec@1 100.000 (100.000) [2024-03-28 21:20:54,146 INFO] Epoch: [48][2/4], Loss 0.0001 (0.0005), Prec@1 100.000 (100.000) [2024-03-28 21:20:54,153 INFO] Epoch: [48][3/4], Loss 0.0000 (0.0005), Prec@1 100.000 (100.000) [2024-03-28 21:20:54,331 INFO] * Prec@1 100.000 [2024-03-28 21:20:54,537 INFO] Epoch: [49][1/4], Loss 0.0080 (0.0055), Prec@1 99.219 (99.609) [2024-03-28 21:20:54,558 INFO] Epoch: [49][3/4], Loss 0.0000 (0.0058), Prec@1 100.000 (99.505) [2024-03-28 21:20:54,880 INFO] Epoch: [49][0/4], Loss 0.0000 (0.0000), Prec@1 100.000 (100.000) [2024-03-28 21:20:54,929 INFO] Epoch: [49][1/4], Loss 0.0001 (0.0001), Prec@1 100.000 (100.000) [2024-03-28 21:20:54,970 INFO] Epoch: [49][2/4], Loss 0.0013 (0.0005), Prec@1 100.000 (100.000) [2024-03-28 21:20:54,982 INFO] Epoch: [49][3/4], Loss 0.0000 (0.0005), Prec@1 100.000 (100.000) [2024-03-28 21:20:55,147 INFO] * Prec@1 100.000
-
修改测试文件相应的配置项,并且切换为测试模式
Model Classification report: [2024-03-28 21:26:19,166 INFO] ------------------------------ [2024-03-28 21:26:19,172 INFO] precision recall f1-score support qq 1.00 1.00 1.00 90 微信 1.00 1.00 1.00 206 淘宝 1.00 1.00 1.00 108 accuracy 1.00 404 macro avg 1.00 1.00 1.00 404 weighted avg 1.00 1.00 1.00 404 [2024-03-28 21:26:19,175 INFO] Prediction Confusion Matrix: [2024-03-28 21:26:19,175 INFO] ------------------------------ [2024-03-28 21:26:19,845 INFO] Predicted: qq 微信 淘宝 Actual: qq 90 0 0 微信 0 206 0 淘宝 0 0 108