- 博客(48)
- 收藏
- 关注
原创 Day 48 随机函数与广播机制
知识点回顾:随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,会自动计算的)pytorch的广播机制:加法和乘法的广播机制ps:numpy运算也有类似的广播机制,基本一致。
2025-09-07 23:38:03
989
原创 Day 47 注意力热图可视化
这个注意力热图是通过钩子机制 register_forward_hook 捕获最后一个卷积层(conv3)的输出特征图。热力图(红色表示高关注,蓝色表示低关注)半透明覆盖在原图上。
2025-09-06 23:36:51
458
原创 Day 46 通道注意力(SE注意力)
通道注意力(Channel Attention)属于注意力机制(Attention Mechanism)的变体,而非自注意力(Self-Attention)的直接变体。特征图本质就是不同的卷积核的输出,浅层指的是离输入图近的卷积层,浅层卷积层的特征图通常较大,而深层特征图会经过多次下采样,尺寸显著缩小,尺寸差异过大时,小尺寸特征图在视觉上会显得模糊或丢失细节。从数学角度看,注意力机制是对输入特征进行加权求和,不同于卷积的固定权重,注意力是“动态权重”的特征提取,输入数据不同权重不同。
2025-09-05 23:36:36
1056
原创 Day 45 Tensorboard使用介绍
你可以用它直观看到训练过程中的数据变化(比如损失值、准确率)、模型结构、数据分布等,不用盯着一堆枯燥的数字看,对新手非常友好。监控模型参数(如权重 weights)和梯度(grads)的分布变化,诊断训练问题(如梯度消失 / 爆炸)。2.记录标量数据(Scalar):记录每个batch(批次)的损失和准确率,以及每个epoch(轮次)的训练指标。1.在训练过程中tensorboard将训练数据和模型结构信息记录到日志文件(.tfevents)文件中。2.保存训练集和验证集的loss变化曲线,无需手动打印。
2025-09-04 21:54:08
338
原创 Day 44 预训练模型
训练策略那么什么模型会被选为预训练模型呢?比如一些调参后表现很好的cnn神经网络(固定的神经元个数+固定的层数等)。所以调用预训练模型做微调,本质就是 用这些固定的结构+之前训练好的参数 接着训练所以需要找到预训练的模型结构并且加载模型参数相较于之前用自己定义的模型有以下几个注意点1. 需要调用预训练模型和加载权重2. 需要resize 图片让其可以适配模型3. 需要修改最后的全连接层以适应数据集。
2025-09-03 23:24:48
850
原创 Day43 复习日
设置batch_size,以及shuffle=ture,训练集打乱顺序,测试集不打乱,增强鲁棒性,防止模型学习到顺序。weights = torch.mean(self.gradients, dim=(2, 3)):对空间维度求平均,得到每个特征图的重要性权重。数据预处理管道,调整图像像素,转化为pytorch张量,进行像素值归一化,标准化。Grad-CAM原理:通过梯度计算卷积层特征图对类别预测的重要性,生成类别激活热力图。- torch.no_grad() :禁用梯度计算,提高效率。
2025-09-02 23:45:01
473
原创 Day42 Grad-CAM与Hook函数
知识点回顾回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例由于标准的前向传播和反向传播过程是一个黑盒,我们很难直接访问中间层的信息,所以很难经常查看或修改模型中间层的输出或梯度。PyTorch提供了hook函数来帮助我们在不修改模型结构的情况下,获取或修改中间层的信息。常用场景如下:1.调试与可视化中间层输出2.特征提取,在图像分类模型中提取高层语义特征用于下游任务3.梯度分析与修改,在训练过程中,对某些层进行梯度裁剪或缩放来改变模型的动态。
2025-09-01 23:53:48
905
原创 Day 41 简单CNN
知识回顾数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率卷积操作常见流程如下:输入 → 卷积层 → Batch归一化层(可选) → 池化层 → 激活函数 → 下一层Flatten -> Dense (with Dropout,可选) -> Dense (Output)
2025-08-31 19:51:34
1000
原创 Day 40 训练和测试的规范写法
知识点回顾:彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout作业:仔细学习下测试和训练代码的逻辑,这是基础,这个代码框架后续会一直沿用,后续的重点慢慢就是转向模型定义阶段了。图像数据的格式以及模型定义的过程与结构化数据的不同主要体现在以下两个方面:1.模型定义的时候需要展平图像。
2025-08-30 23:02:00
897
原创 Day 39 图像数据与显存
图像相关的神经网络的定义知识点回顾图像数据的格式:灰度和彩色数据模型的定义显存占用的4种地方模型参数+梯度参数优化器参数数据批量所占显存神经元输出中间状态batchisize和训练的关系灰度图像作为图像数据,相较于结构化数据(表格数据)他的特点在于他每个样本的的形状并不是(特征数,),而是(宽,高,通道数)结构化数据(如表格)的形状通常是 (样本数, 特征数),例如 (1000, 5) 表示 1000 个样本,每个样本有 5 个特征。
2025-08-29 21:12:35
700
原创 Day 38 Dataset和Dataloader类
定义一个简单的全连接神经网络模型,包含一个输入层、一个隐藏层和一个输出层定义层数+定义前向传播顺序输入42个特征,输出分两类,经过独热编码后特征从17变到了42class MLP(nn.Module): #定义一个多层感知机(MLP)模型,继承父类nn.Moduledef __init__(self): #初始化函数super(MLP, self).__init__() #调用父类的初始化函数# 前三行是八股文,后面的网络层是自定义的。
2025-08-28 23:49:10
780
原创 Day 37 早停策略和模型权重的保存
如果可以监控验证集的指标不再变好,此时提前终止训练,避免模型对训练集过度拟合。深度学习中模型的保存与加载主要涉及参数(权重)和整个模型结构的存储,同时需兼顾训练状态(如优化器参数、轮次等)以支持断点续训。可以看到,虽然损失值在下降,但是仍要考虑是否会出现过拟合现象,由于模型过度学习了训练集的信息,导致在测试集上表现不理想。原理:保存模型参数、优化器状态(学习率、动量)、训练轮次、损失值等完整训练状态,用于中断后继续训练。过拟合:训练集损失持续下降,但测试集损失在某一时刻开始上升(或不再下降)。
2025-08-27 23:30:38
437
原创 Day 36 复习日
今天是复习日,神经网络与机器学习最大的不同就是不止固定的三行代码,需要自己定义一个模型,先继承类的属性,然后去写自己的属性,以及前向传播方法,可以手动构建:中间层的数量、每一层的神经元数、激活函数选什么、损失函数选什么、以及梯度下降的步长。前面的一些官方文档阅读,信贷模型训练,明日定敲代码实践。计算损失:使用损失函数来评估预测与真实标签之间的差距。权重更新:使用优化器调整步长,更新模型的权重。前向传播:通过模型传输如数据来计算预测。直到损失不变则代表训练完成。反向传播:根据损失计算梯度。
2025-08-26 23:40:13
194
原创 Day 35 模型可视化与推理
但是在使用该方法时,input_size=(4,) 参数是必需的,因为 PyTorch 需要知道输入数据的形状才能推断模型各层的输出形状和参数数量。因此,要生成模型摘要(如每层的输出形状、参数数量),必须提供一个示例输入形状,让 PyTorch “运行” 一次模型,从而推断出各层的信息。尤其在深度学习这种训练是循环的场景中。这是最基础、简单的方法,直接打印模型对象,输出模型的结构,显示模型中各个层的名称和参数信息。该方法不显示输入层的尺寸,因为输入的神经网是自己设置的,所以不需要显示输入层的尺寸。
2025-08-25 23:25:58
1326
原创 Day 34
self.fc1是一个实例化的对象,为什么具备了函数一样的用法,这是因为nn.Linear继承了nn.Module类,nn.Module类中定义了__call__方法。可以注意到,self.fc1 = nn.Linear(4, 10) 此时,是实例化了一个nn.Linear(4, 10)对象,并把这个对象赋值给了MLP的初始化函数中的self.fc1变量。综上,数据传输和各种固定开销的总和,超过了 GPU 在这点计算量上通过并行处理所能节省的时间,导致了 GPU 比 CPU 慢的现象。
2025-08-24 23:45:44
1037
原创 Day33 MLP神经网络的训练
神经网络由于内部比较灵活,所以封装的比较浅,可以对模型做非常多的改进,而不像机器学习三行代码固定。与机器学习中最大的不同。定义一个简单的全连接神经网络模型,包含一个输入层、一个隐藏层和一个输出层。训练时,要关注每个epoch训练完后测试集的表现:测试集的loss和准确度。查看显卡信息的命令行命令(cmd中使用)数据预处理(归一化、转换成张量)PyTorch和cuda的安装。模型训练,定义损失函数和优化器。定义层数+定义前向传播顺序。继承nn.Module类。定义损失函数和优化器。
2025-08-23 22:58:59
328
原创 Day 32 官方文档的阅读
3. 官方文档:https://pdpbox.readthedocs.io/en/latest/1. GitHub 仓库:https://github.com/SauceCat/PDPbox。2. PyPI 页面:https://pypi.org/project/PDPbox/在官方文档中搜索函数名,然后查看函数的详细说明和用法示例。参考pdpbox官方文档中的其他类,绘制相应的图,任选即可。官方文档的阅读和使用:要求安装的包和文档为同一个版本。官方文档的检索方式:github和官网。
2025-08-22 15:07:12
195
原创 Day 31 文件的规范拆分和写法
比如一个包含数据处理模块 data_processing.py、模型训练模块 model_training.py 的机器学习项目,在 model_training.py 中用 if __name__ == "__main__" 包裹训练相关的主逻辑代码,运行该文件时就知道需要从这里开始执行(其他文件都是附属文件),让项目结构和执行流程更清晰。如果直接运行这个文件,则__name__等于__main__,若这个文件被其他模块导入,则__name__不等于__main__。这些可复用代码通常会被整理到项目的。
2025-08-21 14:59:47
964
原创 Day 30 模块和库导入
from math import *`:这种方法将 `math` 模块中的所有公开的函数和变量导入到当前的命名空间中,可以直接使用这些函数和变量而无需 `math.` 前缀。`import math`:这种方法会将整个 `math` 模块导入到命名空间中,但是需要使用 `math.` 前缀来访问模块内的函数或变量。`import math`:明确指出了函数和变量来源于 `math` 模块,这对代码的可读性和维护性都是有益的。其他阅读你代码的人可以清楚地看到每个函数的来源,这对大型项目和团队合作尤为重要。
2025-08-20 13:12:26
1039
原创 Day 29 类的装饰器
我们之前是用复用的思想来看装饰器的,换一个角度理解,当你想修改一个函数的时候,可以通过装饰器方法来修改而无需重新定义这个函数。---理解动态的含义。2. 在类定义外部定义方法,然后把方法赋值给类的属性---这是一种动态方法,常在装饰器中使用,可以再外部修改类的方法。核心的区别就是类装饰器是可以直接修改类的定义的,但是函数装饰器是在不修改函数代码的前提下拓展功能。通过类装饰器,可以在不修改类内部代码的情况下,为多个类统一添加功能(如日志、统计)类也有修饰器,他的逻辑类似:接收一个类,返回一个修改后的类。
2025-08-19 13:54:32
352
原创 Day 28 类的定义和方法
避免运行错误,等到想好写什么再去补上比如def、class这些定义的关键词后,必须有一个有占据缩进位置的代码块。还有下面这些依赖缩进的语句,都可以用pass语句来占位Python 通过缩进来定义代码块的结构。当解释器遇到像 def, class, if, for 这样的语句,并且后面跟着冒号 : 时,它就期望接下来会有一个或多个缩进的语句来构成这个代码块。如果它没有找到任何缩进的语句(即代码块是空的),它就无法确定这个结构的范围,因此会抛出 IndentationError。
2025-08-18 12:00:07
982
原创 Day27 装饰器
-本质是如果让一个函数具备太多功能,那么他看起来就会比较乱,可读性比较差,如果把其中一部分相同甚至可以复用的功能用一个新的函数来调用,然后让2个函数同时实现,就会做到。装饰器函数返回的是wrapper函数,所以,在调用装饰器函数的时候,返回的还是wrapper函数,而不是被修饰的函数。可以看到,上述这个写法的时候,prime_nums()没有传入参数,如果函数有参数,那么必须给外部函数传入参数,也就是需要给外部的装饰器函数传入参数。所以装饰器本身就是函数中调用其他函数,实现先拆分函数,再合并函数的功能。
2025-08-17 11:12:28
858
原创 Day 26 函数专题1:函数定义与参数
如果在填充完所有能通过名字匹配上的明确定义的形参后,调用时还有剩余的关键字参数(即这些关键字参数的名字在函数定义中没有对应的明确形参名),那么这些“多余的”关键字参数就会被收集起来,形成一个字典 (dictionary),并赋值给 **kwargs 指定的那个变量(通常就是 kwargs)。当函数被调用时,Python 会先尝试用调用时提供的位置参数去填充函数定义中所有明确定义的、非关键字的形参 (也就是那些普通的,没有 * 或 ** 前缀的参数,包括有默认值的和没有默认值的)。
2025-08-16 21:11:14
1074
原创 Day 25 异常处理
2. 避免意外捕获: 如果把“成功后的后续步骤”也放在 try 块里,而这些步骤本身也可能引发 try 块想要捕获的同类型异常,那么就会导致逻辑混淆。except:如果 try 块里的代码真的出错了(从出错开始就不会继续执行try之后的代码了),Python 就会跳到 except 块里执行这里的代码,而不是崩溃。后续在代码报错时要试着自己去看代码报错的类型,提高自己对代码报错的解决能力,而不是一味的让ai帮忙解决。else :如果 try 块中没有引发异常,则执行 else 块中的代码。
2025-08-15 23:50:08
508
原创 Day 24 元组和OS模块
OS 模块是 Python 标准库中的一个重要模块,它提供了一种使用操作系统相关功能的方法,如读写文件、管理目录、获取环境变量等。通过 OS 模块,Python 程序可以与操作系统进行交互。元组是 Python 中的一种数据结构,它与列表类似,但有一个关键区别:元组是不可变的,一旦创建就不能修改。元组使用圆括号 () 来定义,元素之间用逗号分隔。通过使用元组和 OS 模块,可以更高效地处理数据和与操作系统交互。罪过罪过,生产实习接近尾声,任务变重,回去一定好好继续巩固练习。元组 (Tuple)
2025-08-13 23:36:06
422
原创 Day 23 pipeline管道
转换器(transformer)是一个用于对数据进行预处理和特征提取的 estimator,它实现一个 transform 方法,用于对数据进行预处理和特征提取。因此,估计器需要在训练集上进行训练,并使用训练得到的模型参数对新数据进行预测。在pipeline中,每个估计器都实现了fit和transform方法,fit方法用于训练模型,transform方法用于对数据进行预处理和特征提取。在机器学习中,通常会按照一定的顺序对数据进行预处理、特征提取、模型训练和模型评估等步骤,以实现机器学习模型的训练和评估。
2025-08-12 23:47:37
903
原创 Day22 复习日
原理 :找到数据中「方差最大」的几个方向(主成分),将高维数据投影到这些方向上,在保留最多信息的同时降低维度。特征工程除了增加,针对高维数据也可以考虑进行特征筛选降维处理,特征降维主要是分为两大类,一部分是只根据特征本身的方差,数据分布等特性进行筛选,还有一部分是针对LDA降维。同时学习了如何对基本处理后的模型进行特征工程的方法,针对分类问题的聚类方法,通过聚类生成一个新的特征,但是要注意具体的解读,完成自己的特征工程。啦啦啦,终于又来到了快乐的复习日,这意味着我的生产实习还有一周就要结束了!
2025-08-11 23:02:21
954
原创 Day21 常见的降维算法
比如,如果A和B的脸型很像,但眼睛差别很大,LDA可能会更强调眼睛的特征,即使脸型方差更大。PCA (无监督):如果你有一堆人脸图片,PCA会尝试找到那些能最好地概括所有人脸变化的“主脸”(特征向量),比如脸型、鼻子大小等,它不关心这些人脸属于谁。我们常提的是只需要特征数据本身的无监督降维,依靠的是数据点本身的分布,方差等信息,无需用到数据样本的标签信息。在降低数据维度的同时,尽可能保留多的原始信息)PCA等无监督降维方法的目标是保留数据的最大方差,这些方差大的方向不一定是对分类最有用的方向。
2025-08-10 23:44:10
275
原创 Day 20 奇异值SVD分解
保留前 k 个奇异值后,取 U 的前 k 列(U_k,m×k)、Σ 的前 k 个奇异值(Σ_k,k×k)、V^T 的前 k 行(V_k^T,k×n)。Σ:一个 m×n 的对角矩阵,对角线上的元素是非负的奇异值(singular values),通常按降序排列,表示 A 的 “重要性” 或 “能量”。保留前 k 个奇异值时,U_k 的列向量代表数据在行空间的主要方向,V_k 的列向量代表在列空间的主要方向。V^T:一个 n×n 的正交矩阵的转置,V 的列向量是 A^T A 的特征向量,称为右奇异向量矩阵。
2025-08-09 21:53:17
1068
原创 Day 19 常见的特征筛选算法
它的核心逻辑是:在进行线性回归的同时,通过引入L1正则化项(即惩罚项),强制将一些不重要特征的回归系数压缩到0,从而实现特征筛选。它的核心逻辑是:特征的方差反映了数据的变化程度,方差很小的特征几乎没有变化,对模型的预测帮助不大。基于决策树、随机森林等树模型,通过计算特征在节点分裂时的贡献度(如信息增益)评估重要性,简单直观、能处理特征交互,但可能高估相关特征中某一个的重要性,适用于快速初步筛选。筛选逻辑 :计算所有特征与目标变量的相关系数,保留绝对值超过设定阈值的特征(如|r|>0.3),剔除低相关特征。
2025-08-08 17:30:38
1236
原创 Day18 推断聚类后簇的类型
如你想聚类消费者购买习惯,那么他过去的消费记录、购买记录、购买金额等等,这些特征都与消费者购买习惯有关,你可以使用这些特征来确定簇含义,一些其他的特征,如消费者年龄,工作行业则不考虑。- 对于 分类模型 (如 RandomForestClassifier), shap_values 是 列表 ,长度等于类别数,每个元素是形状为 (样本数, 特征数) 的数组。现在需要给这个簇赋予实际的含义,一般当你赋予实际含义的时候,你需要根据某几个特征来赋予,但是源数据特征很多,如何选择特征呢?
2025-08-07 23:35:28
721
原创 Day17 常见的聚类算法
其中,WCSS 是每个样本点与其所属簇质心的欧式距离的平方和,它反映了簇内样本的紧密程度,WCSS 越小,说明簇内样本越集中。在迭代过程中,质心的变化会逐渐减小,当变化量小于某个预设的阈值时,也可以停止迭代,以提高效率。不适合非球形簇:对非线性可分或形状复杂的簇效果较差,无法处理簇密度不均的情况,对于这类数据,可能需要采用其他聚类算法,如 DBSCAN、层次聚类等。对噪声和异常值敏感:异常值由于距离其他样本点较远,可能会显著影响质心的位置,导致聚类结果失真,需要在聚类前对数据进行预处理,去除或处理异常值。
2025-08-06 17:34:50
974
原创 Day16 数组的常见操作和形状
tensor支持cpu、gpu等加速硬件,是专门为深度学习设计的,支持自动微分(反向传播的基础)、并行计算、分布式训练等功能。shap_values[:, :, 0] 的每一行代表的是 一个特定样本每个特征对于预测类别的贡献值(SHAP 值)。微微有点小悟,但是还是没找出来之前一片空白的原因,有可能是维度问题吗,很奇怪,记下记下。1. 矩阵乘法:需要满足第一个矩阵的列数等于第二个矩阵的行数,和线代的矩阵乘法算法相同。2. 矩阵点乘:需要满足两个矩阵的行数和列数相同,然后两个矩阵对应位置的元素相乘。
2025-08-04 23:31:29
845
原创 Day15 复习日
今日由于现实生活过于可怜,作业微微拖延至明天,外加昨天的疑惑,逻辑回归的shap_values是两个数据,由于是线性模型,所以只输出正的贡献度。依赖图生成一片空白的情况也待解决。小本记下,一定完成!尝试找到一个kaggle或者其他地方的结构化数据集,用之前的内容完成一个全新的项目,这样你也是独立完成了一个专属于自己的项目。有数据地址的提供数据地址,没有地址的上传网盘贴出地址即可。尽可能与他人不同,优先选择本专业相关数据集。仔细回顾一下之前14天的内容。探索一下开源数据的网站有哪些?
2025-08-03 23:40:40
598
原创 Day14 SHAP图的绘制
shap_values行代表一个样本,列代表一个特征,值代表特征对预测结果的影响,正值为正面影响,负值为负面影响。今天的生成图的过程出现了一些奇怪的问题,示例的随机森林和我在心脏病里使用的逻辑回归有一些区别,明日再研究研究什么情况,图乱飞。简单来说,SHAP通过数学严谨的方式,将模型的复杂决策过程拆解为每个特征的独立贡献,帮助我们"打开黑盒",6. 蜂群图(Swarm Plot):类似摘要图,但以点的形式展示每个样本的特征值和SHAP值。
2025-08-02 22:55:06
1015
原创 Day13 不平衡数据集的处理
即使使用了权重调整,有时仍需根据具体的业务需求(如必须达到某个召回率水平)来调整阈值,找到最佳的操作点。不平衡数据集指的是数据集中不同类别的样本数量相差很大(比如1000个正常样本,只有10个患病样本)。SMOTE(人工合成少数类样本):找少数类样本的邻居,在它们之间"插值"生成新样本。ADASYN(根据难度动态生成样本):难分类的少数类样本生成更多新样本。精确率(查准率):预测为正类的样本中,真正是正类的比例。欠采样(让多数类变少): 随机删除多数类样本(可能丢失信息)
2025-08-01 23:09:00
731
原创 Day 12 启发式算法
生活类比 :像培育高产小麦,选产量最高的麦子做种子(选择),让它们杂交(交叉),偶尔会有基因突变(变异),经过多代选育得到最优品种。生活类比 :像一群鸟找食物,每只鸟记住自己飞过的最可能有食物的地方(个体经验),同时关注其他鸟的发现(群体经验),不断调整飞行方向。三种算法的共同目标都是寻找最优解,但思路不同:遗传算法靠"进化",粒子群靠"群体智慧",退火算法靠"缓慢冷却"跳出局部最优。启发式算法就是通过一些生活中的现象得到的“经验公式”,对现有的机器学习模型进行优化,得到想要的指标最好的超参数。
2025-07-31 22:16:53
384
原创 Day11 补昨天没做完的内容+常见调参方法
核心优势: 它不是随机选择下一个点,而是根据先前评估的结果建立一个概率模型(通常是高斯过程),预测哪些参数组合可能产生更好的结果,并据此选择下一个评估点。如果只划分一次,可能无法得到独立的验证集,导致模型在测试集上的表现过于乐观,因为超参数调整可能已经利用了测试集的信息,造成数据泄露。当前代码选择一次划分,本质是 用交叉验证的"隐式验证集"替代了手动划分的"显式验证集" ,在保证模型评估严谨性的同时简化了代码流程。可以发现,SVM,逻辑回归,和朴素贝叶斯的表现都不错,逻辑回归表现最佳。
2025-07-30 22:38:26
802
原创 Day 10 机器学习建模和评估(没到版本)
来不及了,今天就先到这吧,开始的晚了,明天一定早早开始啊啊啊啊啊啊啊啊啊。二、进行特征分类,处理异常值,对离散特征独热编码,连续特征进行标准化。一、先读取数据,数据概况分析,根据特征选择合适的预处理方式。今天先把昨天欠下的热力图和子图的任务完成一下。机器学习模型建模的三行代码。机器学习模型分类问题的评估。好好理解下这几个评估指标。心脏病的特征相关性热力图。
2025-07-29 23:55:13
223
原创 Day9 热力图与子图的绘制
将Home Ownership 和 Years in current job 转化为数字。之所以这个函数很有用,是因为它允许我们同时迭代一个序列,并获取每个元素的索引和值。iterable -- 迭代对象,迭代对象可以是列表、元组、字典、字符串等。今日状态一般般,明天再认真跑一下,今天绘制子图时出现不少问题,明天尝试解决。enumerate()函数返回一个迭代对象,该对象包含索引和值。先了解特征的分布情况,用字典映射转化类型。返回一个迭代对象,该对象包含索引和值。start -- 索引的开始值。
2025-07-28 23:55:03
268
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅