- 博客(2838)
- 资源 (1)
- 问答 (3)
- 收藏
- 关注
原创 解决tensor的shape不为1,如何转移到CPU的问题
并且我们也可以通过pred.argmax(dim=1),我们获取每个样本预测结果概率最高的类别的索引,得到一个一维张量 batch_predictions。使用 .sum().item()方法对布尔值张量进行求和,计算出预测正确的样本数量,并使用 .item() 方法将结果转换为 Python 标量类型,以方便获取具体的数值。最后,使用 .sum().item()方法对布尔值张量进行求和,计算出预测正确的样本数量,并使用 .item() 方法将结果转换为 Python 标量类型,以方便获取具体的数值。
2025-12-24 00:00:44
178
原创 不同的优化器对分类精度的影响以及损失函数对分类精度的影响.
要选择合适的优化器和超参数,通常需要进行实验和交叉验证,以找到在特定任务和数据集上表现最佳的组合。此外,监控训练过程中的指标,如训练和验证精度,有助于了解优化器选择是否有效。最终,分类精度不仅受优化器的影响,还受模型架构、数据质量、数据预处理等因素的影响。2.探索不同的损失函数对分类精度的影响。
2025-12-23 00:00:44
336
原创 深度学习任务中的多层卷积与全连接输出方法
一个简单的方法是在每个卷积层之后添加一个输出层,将卷积层的输出结果直接作为输出层的输入。未来的研究可以进一步探索如何选择和利用全连接层的输出结果,如何减少过拟合的影响,以及如何自动化地设置全连接层的输入和输出维度,以提高模型性能和效率。具体方法是将多个卷积层的输出结果经过flatten操作,转换为一维张量,然后依次通过多个全连接层进行进一步的特征提取和转换。多个卷积层连续输出方法和多个卷积层加上多个全连接层的输出方法都是针对深度学习任务中的问题提出的。# 最后得到多个卷积层和多个全连接层的输出结果。
2025-12-22 00:00:32
284
原创 卷积层与池化层的输入输出的shape的计算公式
池化也是一种类似的卷积操作,只是池化层的所有参数都是超参数,是学习不到的。只提取了显著特征,而舍弃了不显著的信息,是的模型的参数减少了,从而一定程度上可以缓解过拟合的产生。激活函数Relu,在神经网络中的作用是:通过加权的输入进行非线性组合产生非线性决策边界 简单的来说就是增加非线性作用。即输入图片大小为:input = Variable(torch.randn(1, 1, 28, 28)) 即28*28的单通道图片。卷积层与池化层的输入输出的shape的计算公式。P:填充值的大小 0默认值。
2025-12-20 00:01:18
727
原创 VGG网络、1x1卷积与卷积层参数和计算的探讨
VGG网络的特点包括:1.深度:VGG网络有多个卷积层和全连接层,总共包含16-19层卷积层,这在当时被认为是非常深的网络结构。2均一的卷积核大小:VGG网络使用3x3大小的卷积核,这种均一的卷积核大小有助于保持模型的简洁性.3.均一的步幅和填充:VGG网络在卷积层之间使用小的步幅和相同的填充,这也有助于保持模型的一致性。计算量取决于卷积核的大小,输入特征图的空间分辨率,输入通道数,输出通道数。对于一个卷积层,参数量取决于卷积核的大小,输入通道数,输出通道数,参数共享。卷积层参数量,计算量的计算方法。
2025-12-19 00:00:22
866
原创 深度学习图像处理之VGG网络模型
VGG网络的原理是通过连续使用几个3x3的卷积核来代替较大卷积核(如7x7,5x5),这样可以在保证具有相同感知野的条件下,提升了网络的深度,在一定程度上提升了神经网络的效果。第一层卷积层:输入尺寸为[224, 224, 3],输出尺寸为[_, 64, 7, 7]。第三层卷积层:输入尺寸为[128, 7, 7],输出尺寸为[_, 256, 7, 7]。第二层卷积层:输入尺寸为[64, 7, 7],输出尺寸为[_, 128, 7, 7]。第五层卷积层:输入尺寸为[512],输出尺寸为[_, 512]。
2025-12-18 00:01:11
407
原创 探究nn.Linear和nn.Conv2d的基本用法
PyTorch的nn.Linear()是用于设置网络中的全连接层的,需要注意在二维图像处理的任务中,全连接层的输入与输出一般都设置为二维张量,形状通常为[batch_size, size],不同于卷积层要求输入输出是四维张量。针对探究nn.Linear问题,其用于设置网络中的全连接层的,需要注意在二维图像处理的任务中,全连接层的输入与输出一般都设置为二维张量,其中参数in_features指的是输入的二维张量的大小,即输入的[batch_size, size]中的size。
2025-12-17 00:00:51
343
原创 探索Transform的中不同参数的用法
compose=transforms.Compose([ transforms.Resize((224, 224)),transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 对图像进行Compose转换 image = Image.open('example.jpg')
2025-12-16 00:01:21
311
原创 多个卷积层连续输出的方法
为了连续输出卷积层,我将第一个卷积层的输出作为了第二个卷积层的输入,需要注意的时第一个卷积层的out_channels要与第二层的in_channales相等,不然就无法进行。我在刚开始尝试的时候,把公式中的步幅+1一并作为分母,最后得到的结果一直与程序跑出来的结果不同,改正后计算结果与程序的结果终于相同了。本次我主要探索的就是卷积层连续输出方法,我也在网络上查询了方法,单座后的结果却是出乎意料的简单,只需要。如上述代码,我给的输入层数据为(3,24,24),得到的结果如下图。多个卷积层连续输出的方法。
2025-12-15 00:01:03
227
原创 Java方法的重载
在多个方法中实现相同的功能,将其重写为不同的方法,可提高程序的可重用性。就可以避免一个方法多次被调用时,它的同名方法又要重新做一次。由于在很多时候,我们所需要使用的方法不可能是只有一种类型的,因此我们可以通过重载来实现相同类型方法之间的互相调用。对于这个问题, Java语言的设计者是这样规定的:如果没有定义一个方法名为 static的类,那么 Java类应该有8个以上方法(或者方法名中至少包含4个数字);其次,由于每个重写后的方法都不同,所以不会出现某个重写后的方法被覆盖或调用时不能正常返回结果等问题。
2025-12-14 00:00:28
591
原创 机器学习测试模型的性能评估与探索
再比如以最近的新冠疫情为例,如果一个患病者(实际为正)经过试剂检测被预测为没有患病(预测为负),这样的假反例或者说假阴性产生的风险就非常大.。适用场景:当反例被错误的预测为正例(假正例)产生的代价很高的时候,适合用查准率,因为高查准率意味着低假正率/假阳性.比如在垃圾邮件检测中,假正例意味着非垃圾邮件(实际为负)被错误的预测为垃圾邮件(预测为正).如果一个垃圾邮件监测系统的查准率不高导致很多非垃圾邮件被归到垃圾邮箱里去,那么邮箱用户可能会丢失或者漏看一些很重要的邮件.。F1是查准率和查全率的一个加权平均。
2025-12-12 00:00:29
347
原创 Python中字典
以上介绍了字典的部分内置方法及其功能,如popitem()、pop(key[,default])等涉及到键和值的返回删除。这些方法使得字典的操作更加灵活和高效。print(key) # 输出可能是 'a', 'b', 'c' 中的任意一个,取决于 Python 的实现和字典的插入顺序。print(my_dict) # 输出: {'b': 2, 'c': 3}('d' 键从未存在,所以字典未改变)dict.get(key,default=None):返回指定键的值,如果值不在字典中返回default值。
2025-12-11 00:00:20
328
原创 字符串定义
针对数据结构,以上介绍了字符串使用方法中常用的几种类型,也提供了相应的代码实例。其中还存在其他考虑不周的地方,如:字符串使用方法没有举例完全,对其阐述不够明确即文字阐述有点少,希望下次可以考虑更全面。字符串(String)在计算机科学中,是指一组用来表示文本的字符序列。title()将字符串中第一个单词的首字母转换成大写字母。upper()将字符串中的小写字母全部转换成大写字母。lower()将字符串中的大写字母全部转换成小写字母。# rstrip , 去除末尾(右边)的空格。(1)字符串大小写转换。
2025-12-10 00:00:33
370
原创 探索不同的损失函数和batch_size对分类精度的影响
此外,还可以考虑使用动态调整batch_size的方法,如学习率衰减(learning rate decay),随机采样(random sampling)等,以在不同的训练阶段使用不同的batch_size,获得更好的平衡。1. 损失函数的选择是重要的:不同的损失函数对分类任务的优化目标和模型的学习特性有不同的影响。损失函数的选择对分类精度有显著影响:不同的损失函数衡量模型预测值与真实标签差异的方式不同,因此对分类精度的影响也不同。合适的损失函数能够使模型更关注分类错误的样本,提高分类精度。
2025-12-09 00:00:55
353
原创 用java计算BMI
最大的区别是,在java中想与用户交互的话事先需要导入Scanner类,所以写的时候也多了一些步骤。System.out.println("严重肥胖");System.out.print("请输入你的身高: ");System.out.print("请输入你的体重: ");System.out.println("过轻");System.out.println("正常");System.out.println("过重");System.out.println("肥胖");使用Scanner类用于获取信息。
2025-12-08 00:01:29
302
原创 理解pytorch中的L2正则项
针对问题一:对于pytorch模型中存在的过拟合与欠拟合做出明确原因与产生的数据来源的算法做出明确标注,解释清楚了误差的组成成分。是在优化器中实现的,在代码中构建了两个优化器,一个优化器不带有正则化,一个优化器带有正则化。方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差。正则化策略的目的就是降低方差,减小过拟合的发生。
2025-12-05 00:00:20
320
原创 Python内置函数
针对内部使用函数问题,提出上述方法,通过实验,证明该方法是有效的,总之,Python内置函数是语言本身提供的基础函数,无需导入即可使用,而内部使用的函数是开发者根据需要编写的,用于实现特定功能的函数需要导入后才能使用。内部使用的函数是用户自定义的函数,这些函数是为自己项目的内部逻辑服务的,不打算被外部代码直接调用。如果是,那么自定义的函数使用了双下划线(_ _)就是内置函数了?本文的方法考虑不周,未言明内部使用函数的特点,仅仅粗略分析,未来可以继续探讨更详细的区别以及其他使用/导入内部函数的方法。
2025-12-04 00:01:39
296
原创 for循环与while循环的区别
for循环主要用来遍历可迭代对象,而while循环主要用来执行一段代码直到满足某个条件为止, 另外,for循环会在遍历完成后自动结束,而while循环需要手动跳出循环或满足某个条件后才能结束,在复杂的逻辑判断时,while循环比较好,没有复杂的逻辑判断时for循环比较好, for一般不会出现死循环,而while容易写成死循环。在python学习中一共涉及了两种循环方式,一种是‘for in ‘循环,一种是while循环,但是对于两种循环的用法和适用情况并不了解,所以我们对两种循环方式进行了探究。
2025-12-03 00:01:35
235
原创 Java接口回调
针对接口回调是如何运用的这一问题,我们先定义一个接口,然后在类中实现这个接口,在主函数中创建一个实现了这个接口的对象,并且调用它的方法。接口回调是指把某一接口的类创建的对象的引用赋值给该接口声明的接口变量中,那么该接口就可以调用被类实现的接口中的方法,当接口变量调用被类实现的接口中的方法,虎牙事故通知相应的对象调用接口的方法,这一过程称作对象功能的接口回调。Public void show(String s){//在使用接口的类中要显式表示public。//接口中的方法默认都是public。
2025-12-02 00:00:22
176
原创 Java求100到200的素数
针对求100-200之间素数的问题,提出for内外循环的方法,通过判断所求整数不能被除1和本身整数整除实验,证明该方法是有效的,本文的方法简单,比较直观,但是不是任何数都能求出素数。在之前的Python学习中也学习过如何求素数,今天将通过Java的方法来求素数。情况一: 除数m被被除数n除本身以外的数整除,break跳出内部for循环。通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。通过Java求100到200的素数有多少个素数,并打印出来。情况二:如果不相等,不输出n(m是素数)。
2025-12-01 00:01:03
245
原创 try-catch异常处理的运用
catch语句在try语句之后,用于捕捉异常,一个try语句可以有多个catch语句与之匹配。用catch语句捕捉异常时,若找不到相匹配的catch语句,将执行默认的异常处理。这种结构中可能引发异常的语句封装在try块中,而处理异常的相应语句封装在catch块中。在使用嵌套的ty块时,将先执行内部try块,如果没有遇到匹配的catch块,则将检查外部try块的catch块。catch程序块的参数不能设置成多个,一个catch只有一个参数。通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。
2025-11-30 00:00:47
325
原创 Java数组动态扩容
这次实验让我更深入地了解了Java中数组的操作,也提高了我对用户输入处理和循环逻辑设计的能力。通过这次实验,我对Java中数组的操作有了更深入的了解,也学会了如何处理用户输入以及如何设计循环逻辑来实现特定的功能。实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配int[]arr={1,2,3},用户可以通过如下方法决定是否继续添加,添加成功,是否继续?第二步使用while循环,里面嵌套一个for循环给arr2赋arr的元素,后面给赋值你所添加的值,然后将添加元素后的数组依次打印出来。
2025-11-29 00:00:39
395
原创 两种抛出异常的方式
throws处理异常,那就是我不想处理这个异常时,我可以把这个问题往外抛,谁调用我谁就来处理,就好像在工作中出现了一个问题,我可以选择将这个问题自行解决,也可以选择将这个问题丢给我的上级解决,当我的上级碰到问题时,也会面临同样的选择,要么他自己解决,那么他就将问题抛给更上级。针对java的两种抛出异常的方式,进行了上述实验,两种抛出异常的方式分别为直接抛出异常和间接抛出异常两种,经过实验我能更加熟练地运用,更加深入的了解到异常的抛出原理。d.throw是抛出了异常,执行throw则一定抛出了某种异常。
2025-11-28 00:01:09
429
原创 自定义异常处理
本文介绍了Java中如何实现自定义异常处理,在上述给出的代码中,称myException 类从Exception类扩展而来。在myExceptionThrow 类中的main()方法创建UserTriaL类的对象并传送错误值给构造方法。这里需要注意的是exception是一个系统自带的类不可在该包中创建一个exception类。2.2 执行创建对象语句UserTrial trial=new UserTrial(-1,1),mum1与num2的值满足异常触发条件。在Java中如何实现自定义异常类?
2025-11-27 00:01:06
293
原创 VGG网络用PyTorch实现VGG网络和卷积层参数计算方法探索
VGG网络采用了深层卷积神经网络的思想,其主要特点是使用小尺寸的卷积核(通常是3x3)和堆叠的卷积层,以增加网络的深度。通道维度的变换和降维: 1x1卷积主要用于在通道维度上进行操作,它可以通过改变通道的数量来调整特征图的深度。特征融合和特征选择: 1x1卷积可以用于融合不同通道的信息,通过将不同通道的特征进行线性组合,从而创建新的特征表示。空间维度上的降采样: 虽然1x1卷积在空间维度上没有显著的感知感受野,但它可以用于降低特征图的空间分辨率,从而减少计算量,同时保留关键的特征。
2025-11-25 12:36:30
291
原创 单链表的插入和删除节点操作
插入操作需要修改两个指针属性,删除操作只需要修改一个指针属性。插入操作s.next=s语句与s.next=p.next顺序不能颠倒,不然会操作错误。·输入元素值赋给新结点*p的数据域;·将新结点*p插入尾结点*r之后;·尾指针r指向新的尾结点*P。在单链表中,插入和删除节点是最常用的操作。·输入元素值赋给新结点*p的数据域;.将新结点*p插入到头结点之后。3>被删除的节点,将不会有其他的指向,会被垃圾回收机制回收。删除节点操作:1>我们找到需要删除的这个节点的前一个节点。·生成一个新结点*p;
2025-11-24 00:00:20
367
原创 用java开发验证码
在大小写字母录入之后,面临的则是如何实现随机组合.关于这个问题则需要用到 1.字符串使用运算符”+”时会把”+”后面的内容转为字符串 2.引用Random类,然后进行四次循环遍历,每次生成一个随机整数index,利用index来实现char数组里元素的随机索引,每次索引完则可以用事先定义好的String变量来接收结果;大小写字母一共有52个,一个一个的录入效率又太低下,这里可以采用循环遍历的方法实现字母的便捷录入,而生成字母则可以用整数强制转换成字符时会根据ASCII码对应的字符的规则实现;
2025-11-23 00:00:59
745
原创 如何判断是否为水仙花数
判断遍历的数字是否是各个位数的数字的3次幂数之和是否等于数字本身,如果是它就为(水仙花数),1,选取个位数,,除以10,得到余数即为个位数。2选取十位数,i除以10,再对结果进行取整,取整后得到。通过用if的判断以及通过证明解决了如何判断水仙花数,更好的了解以及学习水仙花数。在python学习中,我们学习了if…else语句来判断语句。在键盘上输入三位整数,判断他们是不是水仙花。通过实验,提出的方法是正确的。运行得到153是一个水仙花数。输出:他们是水仙花数。
2025-11-22 00:01:23
129
原创 提升minist的准确率并探索分类指标Precision,Recall,F1-Score和Accuracy
Precision:查准率,在模型预测为positive(正)的样本中其中的正样本(真实的正样本)所占的比例,针对判定结果而言,预测为正类的样本(TP+FP)中真正是正实例(TP)所占的比率。在类别的数量不均衡的情况下,查准率是评估模型性能的一个很有用的标准。但是,在9个恶性样本中,将8个样本识别为良性,9个恶性有8个未被诊断出来,8/9,这个结果多么可怕!100个样本中,91个为良性,其中,1个FP(假正例)& 90个TN(真负例),9个为恶性,其中,1个TP(真正例)&8个FN(假负例)。
2025-11-21 00:01:59
727
原创 列表的类型以及应用
顺序列表:按照元素添加的顺序存储和访问元素。2.关联列表:每个元素与一个唯一的键相关联,通过键来访问元素。学到了列表的种类,以及如何访问列表中的值,还学会了如何列表脚本操作符。用户可以使用索引来访问列表中的值,也可以使用方括号的形式截取元素。注意,列表的索引是从0开始计算(0相当于第一个元素)-1表示倒数第一个元素,-2表示倒数第二个元素。用户可以对列表的数据项进行修改或更新,通常使用append()函数添加列表项,使用remove()函数列表项。+和*操作对列表的操作与字符串相似,+用于重复列表。
2025-11-19 00:00:42
265
原创 创建单链表的时候,为什么class后面不用跟括号
因为Python中的类默认继承自object类,这是Python中的所有类的基类。如果你不显式地指定一个基类,Python会自动将你的类继承自object。而在单链表的创建中,类不继承自任何类,所以就不需要加括号。总结来说,创建单链表时class后面不用加括号是因为我们通常不显示地指定基类,而是默认继承自object类。如果需要继承其他类,就会在类名后面加上括号并指定基类。,ListNode类继承自Node类,因此class后面跟了括号。创建单链表的时候,我们常常疑惑为什么class后面不用跟括号。
2025-11-18 00:01:04
261
原创 单链表的插入和删除结点操作
在单链表中,插入和删除结点是最常用的操作,它是建立单链表和相关运算算法的基础。在单链表中插入和删除一个结点,要先找到前驱结点,插入操作需要修改两个指针属性,删除操作需要修改一个指针属性,插入和删除结点操作是单链表中最基础的操作,所以必须要掌握好。插入结点操作,比如将结点q插入单链表中第6个结点的后面,为了插入结点q,需要修改第6个结点中的指针属性;删除结点操作,比如删除第4个结点,就是删除单链表中第3结点的后继结点。
2025-11-17 00:00:27
138
原创 探索不同的优化器、损失函数、batch_size对分类精度影响
2) 二分类损失函数。batch_size取值32训练和取64和128训练,train vall 的loss下降趋势32>64>128>256,最终结果也是32>64>128>256差不多,train vall 的acc,的最终结果32=64>128>256,其中64的trainacc最先大于vallacc,可能是实验偶然的结果,对于只有十个的分类,可以将batch调到32附近,这样可以提高精度,降低训练时长。大多数的损失都是基于最原始的损失一步步改进的,或提出更一般的形式,或提出更加具体实例化的形式。
2025-11-16 00:00:39
832
原创 利用lnception模块搭建网络
Inception模块的核心思想就是将不同的卷积层通过并联的方式结合在一起,经过不同卷积层处理的结果矩阵在深度这个维度拼接起来,形成一个更深的矩阵。Inception模块可以反复叠堆形成更大的网络,它可以对网络的深度和宽度进行高效的扩充,在提升深度学习网络准确率的同时防止过拟合现象的发生。一般来说增加网络的深度和宽度可以提升网络的性能,但是这样做也会带来参数量的大幅度增加,同时较深的网络需要较多的数据,否则容易产生过拟合现象。(2)lnception模块搭建网络代码。(1)lnception原理。
2025-11-15 00:00:27
445
原创 Python的Xpath的使用方法
XPath 是用于在 XML 和 HTML 文档中定位和选择节点的语言,通过路径表达式和条件筛选,实现高效、灵活地查找和操作文档节点。选取 bookstore 元素中的 book 元素的所有 title 元素,且其中 的price 元素的值须大于 35.00。选择所有book下的title元素,仅仅选择文本为Harry Potter的 title元素。itle、 author、year 以及price元素都是book元素的子节点。<3>从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
2025-11-14 00:01:23
363
原创 探索transform中normalize randomcrop的用法
量纲单位的不同对于不同的量纲,数据的数量级大小也是不同的,导致数据之间不具有可比性。经过归一化处理后,不仅可以消除量纲的影响,也可将各数据归一化至同一量级,从而解决数据间的可比性问题。reflect:利用反射的方式进行填充[1, 2, 3, 4] 》[3, 2, 1, 2, 3, 4, 3, 2]symmetric:对称填充方法[1, 2, 3, 4] 》》[2, 1, 1, 2, 3, 4, 4, 3]padding:填充边界的值,单个(int),两个([左/右,上/下]),四个(各个边界)
2025-11-13 00:00:20
486
原创 探究pytorch中多个卷积层和全连接层的输出方法
创建多个卷积层并连接它们时,通常会在每个卷积层后使用激活函数,这有助于引入非线性性,从而使网络能够学习更复杂的特征。在深度学习中,多个卷积层通过使用激活函数引入非线性,以学习更复杂的特征。在卷积层与全连接层之间,需要进行flatten操作,将多维张量转换成一维张量,以便进行全连接层的操作。flatten 通常指的是将一个多维的张量(tensor)转换成一个一维的张量,以便进行全连接层等操作。问题2: 多个卷积层加上多个全连接层的输出方法。问题2: 多个卷积层加上多个全连接层的输出方法。
2025-11-12 00:01:00
428
原创 如何利用切片操作实现一个trim()函数
针对如何利用切片操作实现一个trim()函数,去除字符串首尾的空格这一问题,通过逐一实验,证明该方法是有效的。先判断字符串是否为空字符串,再判断字符串首尾是否有空格,有则去除空格,没有则直接输出,后返回不包含空格的字符。print('测试失败!print('测试失败!print('测试失败!print('测试失败!print('测试失败!print('测试成功!print('测试失败!print('测试失败!print('测试失败!print('测试失败!print('测试失败!print('测试成功!
2025-11-11 00:00:24
267
原创 前插法创建单列表
(2)将新节点的前驱指针指向头节点:新节点通过其前驱指针指向当前的头节点,即新节点将成为链表的新的头部。(3)更新头节点:如果链表不为空,则将原头节点的前驱指针指向新节点,这样新节点就插入到了原头节点之前。(1)在实现前插法时,需要注意内存管理,确保每次分配的内存都能正确释放,防止内存泄漏。(2)每次插入新节点后,都需要更新链表的头结点以指向新的节点,否则会出现错误。(1)创建新节点:为新元素分配一个节点,并将元素赋值给该节点。另外:如果链表原本为空,则需要将新节点同时作为头节点和尾节点。
2025-11-10 00:02:05
423
学生成绩管理系统(Python版).7z
2021-10-13
【调研】您在开发过程中是通过什么途径解决问题的
2014-05-18
【调研】大家写技术博客的初衷是什么
2014-05-18
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1