- 博客(155)
- 收藏
- 关注
原创 linux驱动开发(1)-内核模块
本文摘要:Linux内核模块机制允许动态扩展内核功能而无需重新编译或重启系统。内核模块以ELF格式文件存在,通过结构化的头部、节区和节区头表组成。EXPORT_SYMBOL宏实现的核心机制包含三个部分:宏定义创建符号表条目(包含函数地址和名称)、链接脚本指导链接器组织这些条目、以及运行时通过特定节区解析未定义符号。该机制通过将符号信息放置到__ksymtab等专用节区中,使内核模块能动态链接到内核导出的函数,实现模块化开发与动态加载的灵活性。
2025-06-01 16:53:20
873
原创 深度学习总结(41)
卷积神经网络是用于计算机视觉任务的最佳机器学习模型。即使在非常小的数据集上从头开始训练一个卷积神经网络,也可以得到不错的结果。卷积神经网络通过学习模块化模式和概念的层次结构来表示视觉世界。模型在小型数据集上的主要问题是过拟合。在处理图像数据时**,数据增强是降低过拟合的强大方法。利用特征提取**,可以很容易地将现有的卷积神经网络复用于新的数据集。对于小型图像数据集,这是一种很有用的方法。作为特征提取的补充,你还可以使用微调技术,将现有模型之前学到的一些数据表示应用于新问题。这种方法可以进一步提高模型性能。
2025-05-31 11:32:27
862
原创 深度学习总结(40)
有以下两种方法可供选择。在我们的数据集上运行卷积基,将输出保存为NumPy数组,并保存在硬盘上,然后将这个数组输入到一个独立的密集连接分类器中。这种方法速度快,计算代价低,因为对于每张输入图像只需运行一次卷积基,而卷积基是当前流程中计算代价最高的。但出于同样的原因,这种方法无法使用数据增强。在已有模型(conv_base)上添加Dense层,并在输入数据上端到端地运行整个模型。这样就可以使用数据增强,因为每张输入图像进入模型时都会经过卷积基。但出于同样的原因,这种方法的计算代价比第一种要高很多。
2025-05-31 11:31:52
1019
原创 深度学习总结(39)
如果使用数据增强技巧来训练新模型,那么模型将永远不会两次看到同样的输入。但模型看到的输入仍然是高度相关的,因为这些输入都来自于少量的原始图像。我们无法生成新信息,只能将现有信息。因此,这种方法可能不足以完全消除过拟合。为了进一步降低过拟合,我们还会在模型的之前添加一个Dropout层,如代码清单所示。关于随机图像增强层,你应该知道一点:就像Dropout层一样,它在推断过程中(调用predict()或evaluate()时)是不起作用的。在评估过程中,模型的表现与不采用数据增强和dropout时一样。
2025-04-27 08:59:34
1132
原创 深度学习总结(38)
更一般地说,我们可以使用许多有用的dataset方法,举例如下。.shuffle(buffer_size):打乱缓冲区元素。.prefetch(buffer_size):将缓冲区元素预取到GPU内存中,以提高设备利用率。.map(callable):对数据集的每个元素进行某项变换(函数callable的输入是数据集生成的单个元素)。.map()方法很常用。我们来看一个例子:利用这一方法将数据集元素的形状由(16,)变为(4, 4)。你会见到.map()的更多示例。
2025-04-27 08:59:12
857
原创 深度学习总结(37)
本例初始输入的尺寸为180像素×180像素(这是一个随意的选择),最后在Flatten层之前的特征图尺寸为7×7。注意 在模型中,特征图的深度逐渐增大(从32增大到128),而特征图的尺寸则逐渐缩小(从180×180缩小到7×7)。(1)读取JPEG文件。这些步骤可能看起来有些复杂,但幸运的是,Keras拥有自动完成这些步骤的工具。具体地说,Keras包含实用函数image_dataset_from_directory(),它可以快速建立数据管道,自动将磁盘上的图像文件转换为预处理好的张量批量。
2025-04-26 15:38:37
935
原创 深度学习总结(36)
特别是在计算机视觉领域,许多预训练模型(通常都是在ImageNet数据集上训练得到的)现在都可以公开下载,并可用于在数据量很少的情况下构建强大的视觉模型。之所以要这样做,是因为在你的职业生涯中,你遇到的许多图像数据集只包含几千个样本,而不是几万个。最后,创建~/.kaggle文件夹(mkdir ~/.kaggle),并将密钥文件复制过去(cp kaggle.json ~/.kaggle/)。在这3个集合中,两个类别的样本数相同,所以这是一个均衡的二分类问题,分类精度可作为衡量成功的指标。
2025-04-26 15:30:05
924
原创 深度学习总结(35)
卷积由以下两个关键参数定义。:这些图块尺寸通常是3×3或5×5。本例采用3×3,这是很常见的选择。:卷积所计算的滤波器的数量。本例第一层的深度为32,最后一层的深度为128。对于Keras的Conv2D层,这些参数就是向层传入的前几个参数:Conv2D(output_depth, (window_height, window_width))。卷积的工作原理是这样的:在3维输入特征图上滑动(slide)这些3×3或5×5的。
2025-04-25 08:47:37
968
原创 深度学习总结(34)
下面给出一个简单的卷积神经网络。它是Conv2D层和MaxPooling2D层的堆叠,你很快就会知道这些层的作用。我们将使用函数式API来构建模型。卷积神经网络接收的输入张量的形状为(image_height, image_width,image_channels)(不包括)。本例中,我们设置卷积神经网络处理大小为(28, 28, 1)的输入,这正是MNIST图像的格式。我们来看一下这个卷积神经网络的架构。
2025-04-25 08:47:12
628
原创 深度学习总结(33)
在前面,我们从头开始编写了自定义训练循环。这样做具有最大的灵活性,但需要编写大量代码,同时无法利用fit()提供的许多方便的特性,比如回调函数或对分布式训练的支持。如果想自定义训练算法,但仍想使用Keras内置训练逻辑的强大功能,那么要怎么办呢?实际上,在使用fit()和从头开始编写训练循环之间存在折中:你可以编写自定义的训练步骤函数,然后让框架完成其余工作。你可以通过覆盖Model类的train_step()方法来实现这一点。它是fit()对每批数据调用的函数。
2025-04-24 09:00:16
503
原创 深度学习总结(32)
fit()工作流程在易用性和灵活性之间实现了很好的平衡。在大多数情况下会用到它。然而,即使有了自定义指标、自定义损失函数和自定义回调函数,它也无法实现深度学习研究人员想做的一切事情。毕竟,内置的fit()工作流程只针对于监督学习(supervised learning)。监督学习是指,已知与输入数据相关联的目标(也叫标签或注释),将损失计算为这些目标和模型预测值的函数。然而,并非所有机器学习任务都属于这个类别。
2025-04-24 08:59:55
1324
原创 深度学习总结(31)
如果想在训练过程中采取特定行动,而这些行动又没有包含在内置回调函数中,那么你可以编写自定义回调函数。回调函数的实现方式是将keras.callbacks.Callback类子类化。然后,你可以实现下列方法(从名称中即可看出这些方法的作用),它们在训练过程中的不同时间点被调用。on_epoch_begin(epoch, logs) #在每轮开始时被调用on_epoch_end(epoch, logs) #在每轮结束时被调用。
2025-04-23 08:53:43
1003
原创 深度学习总结(30)
指标是衡量模型性能的关键,尤其是衡量模型在训练数据上的性能与在测试数据上的性能之间的差异。常用的分类指标和回归指标内置于keras.metrics模块中。大多数情况下,你会使用这些指标。但如果想做一些不寻常的工作,你需要能够编写自定义指标。这很简单!Keras指标是keras.metrics.Metric类的子类。与层相同的是,指标具有一个存储在TensorFlow变量中的内部状态。与层不同的是,这些变量无法通过反向传播进行更新,所以你必须自己编写状态更新逻辑。
2025-04-23 08:53:24
508
原创 深度学习总结(29)
它可以构建那些无法表示为层的有向无环图的模型,比如这样一个模型,其call()方法在for循环中使用层,甚至递归调用这些层。这种自由是有代价的:对于子类化模型,你需要负责更多的模型逻辑,也就是说,你犯错的可能性会更大。(另一个区别是,你可以将模型保存为文件)你可以编译和训练Model子类,就像序贯模型或函数式模型一样。前面介绍过如何通过将Layer类子类化来创建自定义层,将Model类子类化的方法与其非常相似:在__init__()方法中,定义模型将使用的层;,重复使用模型的中间特征来创建新模型。
2025-04-22 09:00:02
360
原创 深度学习总结(28)
这个模型有3个输入:工单标题(文本输入)工单的文本正文(文本输入)用户添加的标签(分类输入,假定为one-hot编码)我们可以将文本输入编码为由1和0组成的数组,数组大小为vocabulary_size。模型还有2个输出:工单的优先级分数,它是介于0和1之间的标量(sigmoid输出)应处理工单的部门(对所有部门做softmax)利用函数式API,仅凭几行代码就可以构建这个模型。对于后一种情况,层返回的是一个新的符号张量,其中包含更新后的形状和数据类型信息。,但编码了调用模型时实际数据张量的详细信息。
2025-04-22 08:59:38
399
原创 深度学习总结(27)
简单的工作流程应该简单易懂,同时还有高级的工作流程:无论你的问题多么罕见、多么复杂,应该都有一条清晰的解决路径。相反,Keras提供了一系列工作流程,既有非常简单的工作流程,也有非常灵活的工作流程。所有这些工作流程都基于共享API,比如Layer和Model,所以任何一种工作流程的组件都可以用于其他工作流程,它们之间可以互相通信。逐步构建序贯模型时,每添加一层就打印出当前模型的概述信息,这是非常有用的。只有在数据上调用模型,或者调用模型的build()方法并给定输入形状时,模型才具有权重。
2025-04-21 09:10:16
739
原创 深度学习总结(26)
上手一个新的机器学习项目时,首先定义要解决的问题。了解项目的大背景:最终目标是什么,有哪些限制?收集并标注数据集,确保你对数据有深入了解。选择衡量成功的指标:你要在验证数据上监控哪些指标?理解问题并拥有合适的数据集之后,你就可以开发模型了。准备数据。选择评估方法:留出验证还是K折交叉验证?应该将哪一部分数据用于验证?实现统计功效:超越简单基准。扩大模型规模:开发一个过拟合的模型。根据模型在验证数据上的性能,对模型进行正则化并调节超参数。很多机器学习研究往往只关注这一步,但一定要牢记全局。
2025-04-21 09:09:55
566
原创 深度学习总结(25)
精度、准确率和召回率、还是客户留存率?衡量成功的指标将指引你在整个项目中的所有技术选择。它应该与你的最终目标(如客户的商业成功)保持一致。对于平衡分类问题(每个类别的比例相同),精度和受试者操作特征曲线下面积(area under a receiver operating characteristic curve,缩写为ROC AUC)是两个常用指标。对于类别不平衡的问题、排序问题和多标签分类问题,你既可以使用。
2025-04-20 09:20:04
951
原创 深度学习总结(24)
只有深入了解所做事情的背景,你才能将工作做好。为什么要解决某个问题?能够从解决方案中获得什么价值—模型将被如何使用,模型又将如何融入客户的业务流程?什么样的数据是可用的,或是可收集的?哪种类型的机器学习任务与业务问题相关?定义一个机器学习问题,通常需要与利益相关者进行多次详细讨论。应该关注以下问题。输入数据是什么?要预测什么?只有拥有可用的训练数据,才能学习预测某件事情。举个例子,只有拥有可用的影评和情感标注,你才能学习对影评进行情感分类。因此,数据可用性通常是这一阶段的限制因素。
2025-04-20 09:19:42
836
原创 深度学习总结(23)
机器学习模型的目的在于泛化,即在前所未见的输入上表现良好。这看起来不难,但实现起来很难。深度神经网络实现泛化的方式是:学习一个参数化模型,这个模型可以成功地在训练样本之间进行插值—这样的模型学会了训练数据的“潜在流形”。这就是为什么深度学习模型只能理解与训练数据非常接近的输入。机器学习的根本问题是优化与泛化之间的矛盾:为了实现泛化,你必须首先实现对训练数据的良好拟合,但改进模型对训练数据的拟合,在一段时间之后将不可避免地降低泛化能力。深度学习的所有最佳实践都旨在解决这一矛盾。
2025-04-19 11:03:04
1049
原创 深度学习总结(22)
举例来说,在卷积神经网络成功解决MNIST数字分类问题之前,这个问题的解决方法通常是基于硬编码的特征,比如数字图像中的圆圈个数、图像中的数字高度、像素值的直方图等。但如果从更高的层次理解了这个问题(知道人们如何读取时钟显示的时间),就可以为机器学习算法找到更好的输入特征,比如可以编写5行Python脚本,找到时钟指针对应的黑色像素并输出每个指针顶端的(x, y)坐标,这很简单。模型的容量越大,它拟合训练数据的速度就越快(得到很小的训练损失),但也更容易过拟合(导致训练损失和验证损失有很大差异)。
2025-04-19 10:30:30
922
原创 深度学习总结(21)
若要提高模型的表示能力,你可以添加更多的层、使用更大的层(拥有更多参数的层),或者使用更适合当前问题的层类型(也就是更好的架构预设)。对于一个二分类问题,如果90%的样本属于类别A,10%的样本属于类别B,那么一个总是预测类别A的分类器就已经达到了0.9的验证精度,你需要做得比这更好。在面对一个全新的问题时,你需要设定一个可以参考的基于常识的基准,这很重要。试图拟合一个标签被打乱的MNIST模型,它就属于这种情况:模型可以训练得很好,但验证精度停留在10%,因为这样的数据集显然是不可能泛化的。
2025-04-18 22:08:20
1232
原创 深度学习总结(20)
你关心的是模型在全新数据上的表现,而不是在验证数据上的表现,因此你需要一个完全不同、前所未见的数据集来评估模型,这就是测试集。应该始终记住,改进深度学习模型的最佳方法就是在更多的数据或更好的数据上训练模型(当然,添加过于嘈杂的数据或不准确的数据会降低泛化能力)。因此,基于模型在验证集上的表现来调节模型配置,很快会导致模型在验证集上过拟合,即使你并没有在验证集上直接训练模型。这是最简单的评估方法,但它有一个缺点:如果可用的数据很少,那么可能验证集包含的样本就很少,无法在统计学上代表数据。
2025-04-18 19:55:01
738
原创 深度学习总结(19)
代码清单 向 MNIST 数据集添加白噪声通道或全零通道下面我们在这两个训练集上训练模型。代码清单 对于带有噪声通道或全零通道的 MNIST数据,训练相同的模型代码清单 绘图比较验证精度尽管二者的数据都包含相同的信息,但在带有噪声通道的数据集上训练的模型,最终验证精度要低约 1%,这完全是由于虚假相关性的影响。添加的噪声通道越多,精度就会下降得越多。噪声特征不可避免会导致过拟合。因此,如果你不确定特征究竟是有用的还是无关紧要的,那么常见的做法是在训练前进行特征选择(feature selection)
2025-04-17 08:53:48
712
原创 深度学习总结(18)
我们让模型训练时间更长一点:500 轮。为了记录模型每轮的表现,我们需要修改训练循环,在每轮都保存每折的验证分数。代码清单 保存每折的验证分数然后,计算每轮所有折 MAE 的平均值,如代码清单 4-28 所示。然后,计算每轮所有折 MAE 的平均值。代码清单 计算每轮的 K折验证分数平均值我们来画图看看。代码清单 绘制验证 MAE 曲线由于比例问题,前几轮的验证 MAE 远大于后面的轮次,很难看清这张图的规律。我们忽略前 10 个数据点因为它们的取值范围与曲线上的其他点不同。
2025-04-17 08:53:29
853
原创 深度学习总结(17)
对于这类数据,普遍采用的最佳处理方法是对每个特征进行标准化,即对于输入数据的每个特征(输入数据矩阵的每一列),减去特征平均值,再除以标准差,这样得到的特征平均值为0,标准差为1。另一种常见的机器学习问题是回归(regression)问题,它预测的是一个连续值,而不是离散标签,比如根据气象数据预测明日气温,或者根据软件说明书预测完成软件项目所需时间。这种方法将可用数据划分为K个分区(K通常取4或5),实例化K个相同的模型,然后将每个模型在K-1个分区上训练,并在剩下的一个分区上进行评估。
2025-04-16 08:49:25
731
原创 深度学习总结(16)
如果要对N个类别的数据点进行分类,那么模型的最后一层应该是大小为N的Dense层。对于单标签、多分类问题,模型的最后一层应该使用softmax激活函数,这样可以输出一个在N个输出类别上的概率分布。导致下降的主要原因在于,我们试图将大量信息(这些信息足以找到46个类别的分离超平面)压缩到维度过小的中间层。前面说过,因为最终输出是46维的,所以中间层的单元不应少于46个。对于均衡的二分类问题,完全随机的分类器能达到 50% 的精度。我们从头开始训练一个新模型,训练9轮,然后在测试集上评估模型。
2025-04-16 08:49:00
818
原创 深度学习总结(15)
调用 model.fit()返回了一个 history对象。这个对象有一个名为history的成员,它是一个字典,包含训练过程中的全部数据。这个字典包含4个条目,分别对应训练过程和验证过程中监控的指标。我们将使用 Matplotlib 在同一张图上绘制训练损失和验证损失,以及训练精度和验证精度。由于模型的随机初始值不同,得到的结果可能会略有不同。代码清单:绘制训练损失和验证损失代码清单:绘制训练精度和验证精度训练损失每轮都在减小,训练精度每轮都在提高。
2025-04-15 20:27:07
1007
原创 深度学习总结(14)
单元越多(表示空间的维度越高),模型就能学到更加复杂的表示,但模型的计算代价也变得更大,并可能导致学到不必要的模式(这种模式可以提高在训练数据上的性能,但不会提高在测试数据上的性能)。中间层使用relu作为激活函数,最后一层使用sigmoid激活函数,以便输出一个介于0和1之间的概率值(表示样本目标值等于“1”的可能性,即评论为正面的可能性)。,再将列表转换成形状为(samples, max_length)的整数张量,然后在模型第一层使用能处理这种整数张量的层(也就是Embedding层)。
2025-04-15 08:48:06
866
原创 深度学习总结(13)
TensorFlow 是业界领先的数值计算框架,它可以在 CPU、GPU 或 TPU 上运行。它既可以自动计算任意可微表达式的梯度,也可以分布到许多设备上,还可以将程序导出到各种外部运行环境,甚至是JavaScript运行时。Keras 是用 TensorFlow 进行深度学习的标准 API。TensorFlow 的关键对象包括张量、变量、张量运算和梯度带。Keras 的核心类是 Layer。层封装了一些权重和一些计算,并构成了模型。
2025-04-14 22:10:54
970
原创 深度学习总结(12)
例如,简单的向量数据存储在形状为(samples,features)的2阶张量中,通常用密集连接层[denselyconnected layer,也叫全连接层(fully connected layer)或密集层(dense layer),对应于 Keras 的 Dense 类〕来处理。因此,假设空间的结构(模型架构)是非常重要的。有些层是无状态的,但大多数层具有状态,即层的权重。层兼容性(layer compatibility)的概念具体指的是,每一层只接收特定形状的输入张量,并返回特定形状的输出张量。
2025-04-14 21:47:13
724
原创 深度学习总结(11)
首先,我们生成一些线性可分的数据:二维平面上的点,它们分为两个类别。生成方法是从一个具有特定协方差矩阵和特定均值的随机分布中抽取坐标来生成每一类点。直观上来看,协方差矩阵描述了点云的形状,均值则描述了点云在平面上的位置。我们设定,两个点云的协方差矩阵相同,但均值不同。也就是说,两个点云具有相同的形状,但位置不同。代码清单 在二维平面上随机生成两个类别的点negative_samples和positive_samples都是形状为(1000, 2)的数组。我们将二者堆叠成一个形状为(2000, 2)的数组。
2025-04-13 17:29:52
836
原创 深度学习总结(10)
举例来说,物体位置相对于时间的梯度是这个物体的速度,二阶梯度则是它的加速度。如果测量一个垂直下落的苹果的位置随时间的变化,并且发现它满足position(time) =4.9 * time ** 2,那么它的加速度是多少?通过打印变量(variable),我们可以看到它和之前的tensorflow里面的张量是不同的。通过tensorflow,只需要创建一个GradientTape作用域,对一个或多个输入张量做一些计算,然后就可以检索计算结果相对于输入的梯度,TensorFlow张量是不可赋值的,它是常量。
2025-04-13 10:15:07
924
原创 深度学习总结(9)
张量构成了现代机器学习系统的基石。它具有不同的dtype(数据类型)、rank(阶)、shape(形状)等。可以通过张量运算(比如加法、张量积或逐元素乘法)对数值张量进行操作。这些运算可看作几何变换。一般来说,深度学习的所有内容都有几何解释。深度学习模型由简单的张量运算链接而成,它以权重为参数,权重就是张量。模型权重保存的是模型所学到的“知识”。学习是指找到一组模型参数值,使模型在一组给定的训练数据样本及其对应目标值上的损失函数最小化。
2025-04-12 09:08:03
652
原创 深度学习总结(8)
由许多链接在一起组成,并将映射为。随后,损失函数将这些预测值与目标值进行比较,得到一个,用于衡量模型预测值与预期结果之间的匹配程度。将利用这个损失值来更新模型。下面是输入数据。输入图像保存在float32类型的NumPy张量中,其形状分别为(60000,784)(训练数据)和(10000, 784)(测试数据)。下面是模型。这个模型包含两个链接在一起的Dense层,每层都对输入数据做一些简单的张量运算,这些运算都涉及权重张量。权重张量是该层的属性,里面保存了模型所学到的知识。下面是模型编译。
2025-04-11 22:12:30
685
原创 深度学习总结(7)
举个例子,你可以想象这样一个程序:接收一个计算图作为输入,并返回一个新的计算图,新计算图可实现相同计算的大规模分布式版本。比如,grad(loss_val, w) =grad(loss_val, x2) * grad(x2, x1) * grad(x1, w),如下图所示。grad(loss_val, w) = 1 * 1 * 2 = 2grad(loss_val, b) = 1 * 1 = 1注意 在反向图中,如果两个节点a和b之间有多条路径,那么grad(b, a)就是将所有路径的值相加。
2025-04-11 21:15:28
1033
原创 深度学习总结(6)
动量方法的实现过程是,每一步移动小球,不仅要考虑当前的斜率值(当前的加速度),还要考虑当前的速度(由之前的加速度产生)。给定一个可微函数,理论上可以用解析法找到它的最小值:函数的最小值就是导数为0的点,因此只需找到所有导数为0的点,然后比较函数在其中哪个点的取值最小。当N = 2或N = 3时,可以对这样的方程进行求解,但对于实际的神经网络是无法求解的,因为参数的个数不会少于几千个,而且经常有上千万个。重要的是,神经网络由许多链接在一起的张量运算组成,每个张量运算的导数都是已知的,且都很简单。
2025-04-10 20:15:13
1204
原创 深度学习总结(5)
张量运算grad(f(W), W)以矩阵W为输入,它可以表示为标量函数grad_ij(f(W),w_ij)的组合,每个标量函数返回的是,loss_value = f(W)相对于W[i, j]的导数(假设W的其他所有元素都不变)。同样,对于一个张量函数f(W),你也可以通过将W沿着梯度的反方向移动来减小loss_value = f(W),比如W1 = W0 - step * grad(f(W0), W0),其中step是一个很小的比例因子。如果你想减小f(x)的值,那么只需将x沿着导数的反方向移动一小步。
2025-04-10 19:29:03
1325
原创 深度学习总结(4)
从几何角度来看,这相当于将两个向量的箭头连在一起,得到的位置表示两个向量之和对应的向量(见图2-8)。如果将相同的向量加法应用于平面上的一组点(一个物体),就会在新位置上创建整个物体的副本(见图2-9)。点积结果是一个形状为(x.shape[0], y.shape[1])的矩阵,其元素是x的行与y的列之间的向量点积。由于x的行和y的列必须具有相同的元素个数,因此x的宽度一定等于y的高度。对于张量运算所操作的张量,其元素可看作某个几何空间中的点的坐标,因此所有的张量运算都有几何解释。
2025-04-09 23:39:56
1091
原创 深度学习总结(3)
假设X的形状是(32, 10),y的形状是(10,)。由于每一帧都可以保存在一个形状为(height, width,color_depth)的3阶张量中,因此一个视频(帧的序列)可以保存在一个形状为(frames, height, width, color_depth)的4阶张量中,由多个视频组成的批量则可以保存在一个形状为(samples, frames, height, width, color_depth)的5阶张量中。这个层理解为一个函数,其输入是一个矩阵,返回的是另一个矩阵,即输入张量的新表示。
2025-04-09 23:31:52
664
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人