【Golang星辰图】Go语言的机器学习之旅:从基础知识到实际应用的综合指南

news/2024/7/27 8:18:02/文章来源:https://blog.csdn.net/qq_42531954/article/details/136610271

Go与机器学习的完美结合:构建智能应用的高效方式

前言

在过去几年中,机器学习和人工智能已经成为技术界的热门话题。这些技术在许多领域都有广泛应用,包括自然语言处理、图像识别和推荐系统。随着 Go 语言的不断发展,Go 中的机器学习和人工智能生态系统也在不断扩展。在这篇文章中,我们将探索 Go 中的机器学习和人工智能,介绍一些最新的技术、工具和实践。

欢迎订阅专栏:Golang星辰图

文章目录

  • Go与机器学习的完美结合:构建智能应用的高效方式
    • 前言
      • 1. Gorgonia
        • 1.1 简介
        • 1.2 张量和计算图
        • 1.3 模型训练和推断
      • 2. Go-TensorFlow
        • 2.1 简介
        • 2.2 TensorFlow基础知识和概念
        • 2.3 在Go中使用TensorFlow进行模型训练和推断
      • 3. Go-ONNX
        • 3.1 简介
        • 3.2 ONNX基础知识和概念
        • 3.3 在Go中使用ONNX进行模型推断
      • 4. Golearn
        • 4.1 简介
        • 4.2 机器学习基础知识和概念
        • 4.3 在Go中使用golearn进行数据预处理和模型训练
      • 5. Deeplearning4go
        • 5.1 简介
        • 5.2 深度学习基础知识和概念
        • 5.3 在Go中使用deeplearning4go进行深度学习任务
      • 6. Goml
        • 6.1 简介
        • 6.2 机器学习基础知识和概念
        • 6.3 在Go中使用goml进行机器学习任务
    • 总结:

1. Gorgonia

1.1 简介

Gorgonia 是一个用于自动微分的 Go 库,类似于 TensorFlow 和 PyTorch。它使您能够动态构建计算图,并自动计算梯度,这对于机器学习和优化任务非常有用。

1.2 张量和计算图

在 Gorgonia 中,您使用的是张量,它们是数字的多维数组。您可以在这些张量上执行操作以构建计算图。库然后使用此图自动计算操作的梯度。

以下是一个简单的例子,演示如何使用 Gorgonia 计算两个张量的和:

package mainimport ("log""gorgonia.org/gorgonia""gorgonia.org/tensor"
)func main() {g := gorgonia.NewGraph()a := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(2, 3), gorgonia.WithValue(1, 2, 3, 4, 5, 6))b := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(2, 3), gorgonia.WithValue(6, 5, 4, 3, 2, 1))c := gorgonia.Must(gorgonia.Add(a, b))if err := g.Run(); err != nil {log.Fatal(err)}log.Printf("Result: %v", c.Value())
}

在这个例子中,我们首先创建一个新的计算图。然后,我们创建两个 2x3 的矩阵 ab,并计算它们的和 c。最后,我们运行计算图,并打印结果。

1.3 模型训练和推断

一旦构建了计算图,您可以使用它来训练机器学习模型。这涉及到调整模型的参数以最小化损失函数。训练后,您可以使用模型进行推断,即对新数据做出预测。

以下是一个简单的线性回归示例:

package mainimport ("log""gorgonia.org/gorgonia""gorgonia.org/tensor"
)func main() {g := gorgonia.NewGraph()xData := tensor.New(tensor.WithBacking([]float64{1, 2, 3, 4}), tensor.Of(tensor.Float64), tensor.WithShape(4, 1))yData := tensor.New(tensor.WithBacking([]float64{3, 5, 7, 9}), tensor.Of(tensor.Float64), tensor.WithShape(4, 1))x := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(4, 1), gorgonia.WithValue(xData.Data().([]float64)))y := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(4, 1), gorgonia.WithValue(yData.Data().([]float64)))a := gorgonia.NewScalar(g, tensor.Float64, gorgonia.WithName("a"))b := gorgonia.NewScalar(g, tensor.Float64, gorgonia.WithName("b"))yPred := gorgonia.Must(gorgonia.Add(gorgonia.Must(gorgonia.Mul(a, x)), b))loss := gorgonia.Must(gorgonia.Mean(gorgonia.Must(gorgonia.Square(gorgonia.Must(gorgonia.Sub(y, yPred))))))grads, err := gorgonia.Gradient(loss, a, b)if err != nil {log.Fatal(err)}// 使用梯度下降进行训练learningRate := 0.01for i := 0; i < 1000; i++ {if err := g.Run(); err != nil {log.Fatal(err)}aVal := a.Value().(tensor.Tensor)bVal := b.Value().(tensor.Tensor)a.Assign(gorgonia.Must(gorgonia.Sub(a, gorgonia.Must(gorgonia.Mul(grads[0], gorgonia.NewScalar(g, tensor.Float64, gorgonia.WithValue(learningRate)))))))b.Assign(gorgonia.Must(gorgonia.Sub(b, gorgonia.Must(gorgonia.Mul(grads[1], gorgonia.NewScalar(g, tensor.Float64, gorgonia.WithValue(learningRate)))))))if i%100 == 0 {log.Printf("Step %d: a = %f, b = %f, loss = %f", i, aVal.Data().([]float64)[0], bVal.Data().([]float64)[0], loss.Value().(tensor.Tensor).Data().([]float64)[0])}}
}

在这个例子中,我们使用梯度下降法训练了一个简单的线性回归模型。我们定义了一个损失函数,并计算了关于模型参数的梯度。然后,我们使用这些梯度更新了模型参数。

2. Go-TensorFlow

2.1 简介

Go-TensorFlow 是 TensorFlow 的 Go 绑定,TensorFlow 是一个由 Google 开发的流行的机器学习库。使用 Go-TensorFlow,您可以在 Go 程序中使用 TensorFlow 的功能。

2.2 TensorFlow基础知识和概念

TensorFlow 使用数据流图来表示计算。图中的节点表示数学操作,边表示流经它们的多维数据数组(张量)。

2.3 在Go中使用TensorFlow进行模型训练和推断

以下是一个使用 Go-TensorFlow 进行线性回归的示例:

package mainimport ("fmt"tf "github.com/tensorflow/tensorflow/tensorflow/go""github.com/tensorflow/tensorflow/tensorflow/go/op"
)func main() {root := op.NewScope()X := op.Placeholder(root.SubScope("input"), tf.Float, op.PlaceholderShape(tf.MakeShape(tf.Dim{Size: -1}, tf.Dim{Size: 1})))Y := op.Placeholder(root.SubScope("output"), tf.Float, op.PlaceholderShape(tf.MakeShape(tf.Dim{Size: -1}, tf.Dim{Size: 1})))W := op.Variable(root.SubScope("weights"), tf.Float)b := op.Variable(root.SubScope("bias"), tf.Float)op.Add(root.SubScope("model"), op.Mul(root, X, W), b)loss := op.ReduceMean(root.SubScope("loss"), op.Square(root, op.Sub(root, Y, op.Add(root, op.Mul(root, X, W), b))))trainStep := op.GradientDescent(root.SubScope("train"), loss, 0.01)graph, err := root.Finalize()if err != nil {panic(err)}sess, err := tf.NewSession(graph, &tf.SessionOptions{})if err != nil {panic(err)}defer sess.Close()xData := [][]float32{{1}, {2}, {3}, {4}}yData := [][]float32{{3}, {5}, {7}, {9}}for i := 0; i < 1000; i++ {if _, err := sess.Run(map[tf.Output]*tf.Tensor{X: tensorFrom2DFloat32(xData), Y: tensorFrom2DFloat32(yData)}, []tf.Output{trainStep}, nil); err != nil {panic(err)}if i%100 == 0 {w, b, lossValue, err := sess.Run(map[tf.Output]*tf.Tensor{X: tensorFrom2DFloat32(xData), Y: tensorFrom2DFloat32(yData)}, []tf.Output{W, b, loss}, nil)if err != nil {panic(err)}fmt.Printf("Step %d: W = %v, b = %v, loss = %v\n", i, w, b, lossValue)}}
}func tensorFrom2DFloat32(data [][]float32) *tf.Tensor {t, err := tf.NewTensor(data)if err != nil {panic(err)}return t
}

在这个例子中,我们创建了一个线性回归模型,并使用梯度下降法进行训练。我们定义了一个损失函数,并创建了一个训练步骤。然后,我们运行了一个训练循环,在每个步骤中计算梯度并更新模型参数。

请注意,这个例子假设您已经安装了 TensorFlow 和 Go-TensorFlow。如果您还没有安装,请按照这些说明进行操作。

接下来,我们将讨论 Go-ONNX。

3. Go-ONNX

3.1 简介

Go-ONNX 是 Open Neural Network Exchange (ONNX) 格式的 Go 绑定。ONNX 是一个用于表示机器学习模型的开放格式。使用 Go-ONNX,您可以在 Go 程序中使用 ONNX 模型。

3.2 ONNX基础知识和概念

ONNX 提供了一个可扩展的计算图模型定义,以及内置操作符和标准数据类型的定义。这使得 AI 框架能够使用来自其他框架的模型。

3.3 在Go中使用ONNX进行模型推断

以下是一个使用 Go-ONNX 进行模型推断的示例:

package mainimport ("fmt""github.com/cdipaolo/onnx-go/onnx"
)func main() {model, err := onnx.LoadModel("model.onnx")if err != nil {panic(err)}defer model.Close()session, err := model.NewSession()if err != nil {panic(err)}defer session.Close()inputNames := session.InputNames()outputNames := session.OutputNames()inputData := []float32{1, 2, 3, 4}inputTensor, err := onnx.NewTensorFromData("input", inputData)if err != nil {panic(err)}outputs, err := session.Run([]*onnx.Tensor{inputTensor}, outputNames...)if err != nil {panic(err)}outputData := outputs[0].Data().([]float32)fmt.Printf("Input: %v\n", inputData)fmt.Printf("Output: %v\n", outputData)
}

在这个例子中,我们从磁盘加载了一个 ONNX 模型,并创建了一个新的会话。然后,我们创建了一个输入张量,并使用模型对其进行推断。最后,我们打印了输出。

请注意,这个例子假设您已经安装了 Go-ONNX。如果您还没有安装,请按照这些说明进行操作。

接下来,我们将讨论 Golearn。

4. Golearn

4.1 简介

Golearn 是一个 Go 机器学习库。它提供了各种机器学习算法,包括决策树、随机森林和支持向量机。

4.2 机器学习基础知识和概念

机器学习涉及在数据集上训练模型,然后使用该模型对新数据进行预测。有许多不同类型的机器学习,包括监督学习、无监督学习和强化学习。

4.3 在Go中使用golearn进行数据预处理和模型训练

以下是一个使用 Golearn 进行数据预处理和模型训练的示例:

package mainimport ("fmt""github.com/sjwhitworth/golearn/base""github.com/sjwhitworth/golearn/evaluation""github.com/sjwhitworth/golearn/knn"
)func main() {// 创建一个新的数据集dataSet := base.NewBaseDataSet(base.ClassificationData)// 添加几个示例dataSet.AddExample([]float64{1, 2}, []float64{0})dataSet.AddExample([]float64{2, 3}, []float64{1})dataSet.AddExample([]float64{3, 4}, []float64{1})dataSet.AddExample([]float64{4, 5}, []float64{0})// 创建一个新的 k-近邻分类器classifier := knn.NewClassifier("knn", dataSet, 2)// 对数据集进行训练classifier.Train(dataSet)// 对新数据进行预测predicted, err := classifier.Predict([]float64{5, 6})if err != nil {panic(err)}fmt.Printf("Predicted: %v\n", predicted)// 对分类器进行评估confusionMatrix, err := evaluation.GetConfusionMatrix(classifier, dataSet)if err != nil {panic(err)}fmt.Printf("Confusion Matrix:\n%v\n", confusionMatrix)
}

在这个例子中,我们创建了一个新的数据集,并添加了一些示例。然后,我们创建了一个新的 k-近邻分类器,并使用数据集对其进行了训练。接下来,我们使用分类器对新数据进行了预测。最后,我们对分类器进行了评估。

请注意,这个例子假设您已经安装了 Golearn。如果您还没有安装,请按照这些说明进行操作。

接下来,我们将讨论 deeplearning4go。

5. Deeplearning4go

5.1 简介

Deeplearning4go 是一个 Go 深度学习库。它提供了构建和训练神经网络的工具。

5.2 深度学习基础知识和概念

深度学习是一种机器学习,它涉及训练人工神经网络。这些网络可以学习表示数据中的复杂模式。

5.3 在Go中使用deeplearning4go进行深度学习任务

以下是一个使用 Deeplearning4go 进行深度学习任务的示例:

package mainimport ("fmt""github.com/goki/mat32""github.com/goki/mat32/randmat""github.com/nlpodyssey/spago/pkg/mat""github.com/nlpodyssey/spago/pkg/ml/ag""github.com/nlpodyssey/spago/pkg/ml/nn""github.com/nlpodyssey/spago/pkg/nlp/corpus/text"
)func main() {// 创建一个新的文本数据集corpus := text.NewCorpus()// 添加几个示例corpus.AddExample("hello world")corpus.AddExample("deep learning is fun")// 创建一个新的词汇表vocab := corpus.Vocab()// 创建一个新的神经网络model := nn.NewSequential()model.Add(nn.NewEmbedding(nn.WithVocabSize(len(vocab)), nn.WithEmbeddingSize(10)))model.Add(nn.NewLinear(nn.WithInputSize(10), nn.WithOutputSize(2)))// 编译模型model.Compile(ag.WithLoss(nn.NewCrossEntropyLoss()))// 对数据集进行训练model.Train(corpus.TrainIterator())// 对新数据进行预测input := mat.NewVecDense([]float64{1, 0, 0, 0, 0, 0, 0, 0, 0, 0})output := model.Predict(input)fmt.Printf("Predicted: %v\n", output)
}

在这个例子中,我们创建了一个新的文本数据集,并添加了一些示例。然后,我们创建了一个新的词汇表。接下来,我们创建了一个新的神经网络,并编译了模型。然后,我们使用数据集对模型进行了训练。接下来,我们使用模型对新数据进行了预测。

请注意,这个例子假设您已经安装了 Deeplearning4go。如果您还没有安装,请按照这些说明进行操作。

接下来,我们将讨论 goml。

6. Goml

6.1 简介

Goml 是另一个 Go 机器学习库。它提供了各种机器学习算法,包括线性回归、逻辑回归和 k-近邻。

6.2 机器学习基础知识和概念

Goml 涵盖了广泛的机器学习概念,从基本的线性回归到更高级的技术,如集成方法。

6.3 在Go中使用goml进行机器学习任务

以下是一个使用 Goml 进行机器学习任务的示例:

package mainimport ("fmt""github.com/cdipaolo/goml/base""github.com/cdipaolo/goml/linear"
)func main() {// 创建一个新的数据集dataSet := base.NewDataSet(base.ClassificationData)// 添加几个示例dataSet.AddExample([]float64{1, 2}, []float64{0})dataSet.AddExample([]float64{2, 3}, []float64{1})dataSet.AddExample([]float64{3, 4}, []float64{1})dataSet.AddExample([]float64{4, 5}, []float64{0})// 创建一个新的逻辑回归分类器classifier := linear.NewLogisticRegression()// 对数据集进行训练classifier.Train(dataSet)// 对新数据进行预测predicted, err := classifier.Predict([]float64{5, 6})if err != nil {panic(err)}fmt.Printf("Predicted: %v\n", predicted)
}

在这个例子中,我们创建了一个新的数据集,并添加了一些示例。然后,我们创建了一个新的逻辑回归分类器。接下来,我们使用数据集对分类器进行了训练。接下来,我们使用分类器对新数据进行了预测。

请注意,这个例子假设您已经安装了 Goml。如果您还没有安装,请按照这些说明进行操作。

这就结束了我们对 Go 中机器学习和人工智能的探索。我希望您发现这些信息有用,并且能够在您自己的项目中应用这些概念。

总结:

在这篇文章中,我们探索了 Go 中的机器学习和人工智能生态系统。我们介绍了 Gorgonia、Go-TensorFlow、Go-ONNX、Golearn、Deeplearning4go 和 Goml 这些库,并提供了详细的介绍和完整的 Go 实例代码。我们还介绍了这些库的基础知识和概念,以及如何使用这些库进行数据预处理、模型训练和推断。我们希望这篇文章对您了解 Go 中的机器学习和人工智能有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1006691.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Three 材质纹理 (总结三)

THREE.MeshLambertMaterial&#xff08;网格 Lambert 材质&#xff09; 该材质使用基于非物理的Lambertian模型来计算反射率。可以用来创建暗淡的并不光亮的表面&#xff0c;该材质非常易用&#xff0c;而且会与场景中的光源产生反应。 MeshLambertMaterial属性 # .color : …

STM32/GD32——电源管理单元PWU

芯片选型 Ciga Device — GD32F470系列 PWU介绍 PMU全称Power Management Unit&#xff0c;电源管理单元。 电源域 总共有三大电源域&#xff0c;包括VDD / VDDA域&#xff0c;1.2V域和备份域。 VDD/VDDA 域 提供PMU 常规电源供应以下模块的供电&#xff1a; 看门狗主频晶…

ASP.NET Core Web API 流式返回,逐字显示

Websocket、SSE&#xff08;Server-Sent Events&#xff09;和长轮询&#xff08;Long Polling&#xff09;都是用于网页和服务端通信的技术。 Websocket是一种全双工通信协议&#xff0c;能够实现客户端和服务端之间的实时通信。它基于TCP协议&#xff0c;并且允许服务器主动向…

OpenCV读取tensorflow神经网络模型:SavedModel格式转为frozen graph的方法

本文介绍基于Python的tensorflow库&#xff0c;将tensorflow与keras训练好的SavedModel格式神经网络模型转换为frozen graph格式&#xff0c;从而可以用OpenCV库在C 等其他语言中将其打开的方法。 如果我们需要训练并使用一个神经网络模型&#xff0c;一般情况下都是首先借助Py…

Linux:好用的Linux指令

进程的Linux指令 1.查看进程信息 ​​​​ps ajx | head -1 && ps ajx | grep 进程名创建一个进程后输入上述代码&#xff0c;会打印进程信息&#xff0c;当我们在code.exe中写入打印pid&#xff0c;ppid&#xff0c;这里也和进程信息一致。 while :; do ps ajx | he…

国内新闻媒体排行,如何邀约媒体现场造势?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 国内新闻媒体排行可以根据多个维度进行&#xff0c;例如影响力、发行量、网站流量等。以下是一些常见的国内新闻媒体排名方式&#xff1a; 综合影响力排名&#xff1a;人民日报、新华社、…

如何在idea中配置tomcat服务器,然后部署一个项目

文章目录 前言第一步 先新建一个空项目第二步 添加框架支持第三步 添加配置及如何部署最后一步 运行及检查有没有问题总结 前言 本章学习的是在idea中配置tomcat服务器&#xff0c;然后部署一个项目 如果没有下载Tomcat服务器的可以在上一个博客观看下载及手动部署&#xff0c;…

小红书春日流行,提炼爆款3大打造方向

迈入春季&#xff0c;万物焕新&#xff0c;市场将迎来消费焕活的新周期&#xff0c;小红书会诞生怎样的种草趋势&#xff1f;品牌应该如何把握春季营销的内核&#xff1f; 本期&#xff0c;千瓜将通过数据分析与趋势解构&#xff0c;帮助品牌找准春日营销新视角&#xff0c;乘上…

virtual-pc环境安装

由于微软早已停止对virtual pc的支持&#xff0c;所以vitrual pc找到的版本只能运行在32位机器上&#xff0c;例如win7。 在vm上虚出来一个win7&#xff0c;然后再在win7上安装virtual pc 2007。 virtual pc 声称支持所有的x86的操作系统。 所需资源&#xff1a;链接&#x…

【Redis】Redis常用命令一

1.keys&#xff1a;返回所有满足条件的key&#xff0c;比如&#xff1a; KEYS pattern时间复杂度&#xff1a;O(N)&#xff0c;返回值&#xff1a;匹配pattern的所有key。 • h?llo 匹配 hello , hallo 和 hxllo • h*llo 匹配 hllo 和 heeeello • h[ae]llo 匹配 hello 和 …

STM32OLED调试工具

OLED介绍 4个引脚的oled &#xff1a; GND引脚接地&#xff0c;VCC接3.3v的电源 SCL与SDA是I2C通信的引脚 使用OLED显示屏驱动函数模块 接线图 将oled函数调试的代码引入到工程项目中 oled工程代码 OLED.C文件代码 #include "stm32f10x.h" #include "OLED_Font…

Restormer: Efficient Transformer for High-Resolution Image Restoration

Abstract 由于卷积神经网络&#xff08;CNN&#xff09;在从大规模数据中学习可概括的图像先验方面表现良好&#xff0c;因此这些模型已广泛应用于图像恢复和相关任务。最近&#xff0c;另一类神经架构 Transformer 在自然语言和高级视觉任务上表现出了显着的性能提升。虽然 T…

人工智能迷惑行为大赏——需求与科技的较量

目录 前言 一、 机器行为学 二、人工智能迷惑行为的现象 三、产生迷惑行为的技术原因 四、社会影响分析 五、解决措施 总结 前言 随着ChatGPT热度的攀升&#xff0c;越来越多的公司也相继推出了自己的AI大模型&#xff0c;如文心一言、通义千问等。各大应用也开始内置…

C/C++程序设计实验报告2 | 循环结构实验

本文整理自博主学校大一&#xff08;2021级&#xff09;C/C专业课的课程实验报告&#xff0c;适合学弟妹或C语言初学者入门C语言学习、练习。 编译器&#xff1a;gcc 10.3.0 ---- 注&#xff1a; 1.虽然课程名为C程序设计&#xff0c;但实际上当时校内该课的内容大部分其实都是…

运动想象 (MI) 迁移学习系列 (4) : EEGNet-Fusion-V2

运动想象迁移学习系列:EEGNet-Fusion-V2 0. 引言1. 主要贡献2. 网络结构3. 实验结果3.1 不同参数的评估3.2 不同参数的评估3.3 与基准模型比较 4. 总结欢迎来稿 论文地址&#xff1a;https://www.mdpi.com/1424-8220/23/18/7908 论文题目&#xff1a;Excellent fine-tuning: F…

FPGA - 时钟Buffer的探究

1、IBUF : FPGA上所有的输入信号必须进过IBUF,vivado会自动给所有输入信号分配IBUF OBUF&#xff1a;FPGA上所有的输入信号必须进过IBUF,vivado会自动给所有输入信号分配OBUF BUFG:专用时钟的资源&#xff0c;目的是减少时钟抖动、增强时钟的驱动能力&#xff0c;vivado不会给信…

24计算机考研调剂 | 东北石油大学

东北石油大学智能物探团队招生宣传 考研调剂招生信息 学校:东北石油大学 专业:工学->地质资源与地质工程->矿产普查与勘探 年级:2024 招生人数:2 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 团队介绍&#xff1a; …

.NET高级面试指南专题十八【 外观模式模式介绍,提供了简化的接口,隐藏系统的复杂性】

介绍&#xff1a; 外观模式是一种结构设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用于访问子系统中的一组接口。外观模式定义了一个高层接口&#xff0c;使得子系统更容易使用。 原理&#xff1a; 外观类&#xff08;Facade Class&#xff09;&#xff1a;提供了一…

PFA洗气瓶特氟龙连续洗气反应装置

洗气瓶是一种洗去气体中杂质的仪器&#xff0c;是将不纯气体通过选定的适宜液体介质鼓泡吸收&#xff08;溶解或由于发生化学反应&#xff09;&#xff0c;从而洗去杂质气体&#xff0c;以达净化气体的目的。在有可燃性气源的实验装置中&#xff0c;洗气瓶也可起到安全瓶的作用…

Github上哪些好用的工具

专注于web漏洞挖掘、内网渗透、免杀和代码审计&#xff0c;感谢各位师傅的关注&#xff01;网安之路漫长&#xff0c;与君共勉&#xff01; Qexo-爱写博客的师傅强烈推荐 漂亮的 Hexo 静态博客编辑器。该项目是基于 Django 的 Hexo 静态博客管理后台&#xff0c;支持文章管理、…