人工智障填坑记录

2024-02-28 22:18
文章标签 记录 填坑 人工 智障

本文主要是介绍人工智障填坑记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先声明这是自己在学习期间遇到的一些问题及相关处理方法,整理下来,一方面为了记录学习过程;二是为了分享,或许能帮到大家,互相学习(其中有些解决方法不免是参考别人而整理下来的,如有雷同,不胜荣幸)。


1、已下载的CIFAR10如何加载到python (torchvision.datasets.CIFAR10) || 解决python中直接下载cifar-10-python.tar.gz 过慢的方法

将从此https://pan.baidu.com/s/1oAn8o8i链接下载的cifar-10-python.tar.gz解压提出cifar-10-batches-py文件夹,然后放在./data 目录下(jupyter notebook中的一个子目录即可)然后设置download=False即可
在这里插入图片描述
函数中的transform=transform 为先前定义的预处理操作。

2、代码np.transpose(npimg,(1,2,0))参数详解

def imshow(img):img = img / 2 + 0.5  # unnormalizenpimg = img.numpy()  # 将torch.FloatTensor 转换为numpyplt.imshow(np.transpose(npimg,(1,2,0)))plt.show() 

plt.imshow()接收的参数输入顺序为(imagesize,imagesize,channels),而原始参数img的格式为(channels,imagesize,imagesize),调用np.transpose()函数来调换参数的输入顺序。如:将3×32×32调换成32×32×3.

3、针对“jupyter notebook 服务似乎挂掉了,但是会立即重启……”的解决方法。

显存分配不足,如果有GPU的话,在文件开头引入下面三行程序即可。

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"  # 使用第1个GPU
os.environ["KMP_DUPLICATE_LIB_OK"] = 'True'  # 允许副本存在


4、关于torch.utils.data.DataLoader

torch.utils.data.DataLoader(dataset,#数据加载batch_size = 1#批处理大小设置shuffle = False#是否进项洗牌操作sampler = None#指定数据加载中使用的索引/键的序列batch_sampler = None#和sampler类似num_workers = 0#是否进行多进程加载数据设置collat​​e_fn = None#是否合并样本列表以形成一小批Tensorpin_memory = False#如果True,数据加载器会在返回之前将Tensors复制到CUDA固定内存drop_last = False#True如果数据集大小不能被批处理大小整除,则设置为删除最后一个不完整的批处理。timeout = 0#如果为正,则为从工作人员收集批处理的超时值worker_init_fn = None


5、Pytorch加载训练好的模型

使用VGG-16模型

model = models.vgg16(pretrained=False)  # 由于是加载的已训练好的模型,此处可以设置为False
pre = torch.load(r'F:\installment\vgg16-397923af.pth')  # 提取本地模型
model.load_state_dict(pre) 

在COCO上加载经过预训练的预训练模型

model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=False,pretrained_backbone=False)
model.load_state_dict(torch.load('./model/fasterrcnn_resnet50_fpn_coco-258fb6c6.pth'))

#加载经过预先训练的模型进行分类,仅返回特征

model = torchvision.models.mobilenet_v2(pretrained=False)
model.load_state_dict(torch.load('./model/mobilenet_v2-b0353104.pth'))
backbone = model.features


6、 torch.nn.XXX 与 torch.functional.XXX的区别

两者的相同之处:
nn.XXX和nn.functional.XXX的实际功能是相同的,即nn.Conv2d和nn.functional.conv2d 都是进行卷积,nn.Dropout 和nn.functional.dropout都是进行dropout,。。。。。;
运行效率也是近乎相同。
nn.functional.XXX是函数接口,而nn.Xxx是nn.functional.XXX的类封装,并且nn.Xxx都继承于一个共同祖先nn.Module。这一点导致nn.XXX除了具有nn.functional.XXX功能之外,内部附带了nn.Module相关的属性和方法,例如train(), eval(),load_state_dict, state_dict 等。

两者的差别之处:
1、两者的调用方式不同。
nn.XXX需要先实例化并传入参数,然后以函数调用的方式调用实例化的对象并传入输入数据。

inputs = torch.rand(64, 3, 244, 244) 
conv = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1) 
out = conv(inputs)

nn.functional.XXX同时传入输入数据和weight, bias等其他参数 。

weight = torch.rand(64,3,3,3)
bias = torch.rand(64) 
out = nn.functional.conv2d(inputs, weight, bias, padding=1)


2、nn.XXX继承于nn.Module, 能够很好的与nn.Sequential结合使用, 而nn.functional.XXX无法与nn.Sequential结合使用。

fm_layer = nn.Sequential(nn.Conv2d(3, 64, kernel_size=3, padding=1),nn.BatchNorm2d(num_features=64),nn.ReLU(),nn.MaxPool2d(kernel_size=2),nn.Dropout(0.2))


3、nn.XXX不需要你自己定义和管理weight;而nn.functional.XXX需要你自己定义weight,每次调用的时候都需要手动传入weight, 不利于代码复用。
(1)使用nn.Xxx定义一个CNN 。

class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.cnn1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5,padding=0) self.relu1 = nn.ReLU() self.maxpool1 = nn.MaxPool2d(kernel_size=2) self.cnn2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5, padding=0) self.relu2 = nn.ReLU() self.maxpool2 = nn.MaxPool2d(kernel_size=2) 	self.linear1 = nn.Linear(4 * 4 * 32, 10) def forward(self, x): x = x.view(x.size(0), -1) out = self.maxpool1(self.relu1(self.cnn1(x))) out = self.maxpool2(self.relu2(self.cnn2(out))) out = self.linear1(out.view(x.size(0), -1)) return out


(2)使用nn.function.xxx定义一个与上面相同的CNN。

class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.cnn1_weight = nn.Parameter(torch.rand(16, 1, 5, 5)) self.bias1_weight = nn.Parameter(torch.rand(16)) self.cnn2_weight = nn.Parameter(torch.rand(32, 16, 5, 5)) self.bias2_weight = nn.Parameter(torch.rand(32)) self.linear1_weight = nn.Parameter(torch.rand(4 * 4 * 32, 10)) self.bias3_weight = nn.Parameter(torch.rand(10)) def forward(self, x): x = x.view(x.size(0), -1) out = F.conv2d(x, self.cnn1_weight, self.bias1_weight) out = F.relu(out) out = F.max_pool2d(out) out = F.conv2d(x, self.cnn2_weight, self.bias2_weight) out = F.relu(out) out = F.max_pool2d(out) out = F.linear(x, self.linear1_weight, self.bias3_weight) return out

PyTorch官方推荐:具有学习参数的(例如,conv2d, linear, batch_norm)采用nn.Xxx方式,没有学习参数的(例如,maxpool, loss func, activation func)等根据个人选择使用nn.functional.xxx或者nn.Xxx方式。但关于dropout,个人强烈推荐使用nn.Xxx方式,因为一般情况下只有训练阶段才进行dropout,在eval阶段都不会进行dropout。使用nn.Xxx方式定义dropout,在调用model.eval()之后,model中所有的dropout layer都关闭,但以nn.function.dropout方式定义dropout,在调用model.eval()之后并不能关闭dropout。
(来源知乎——有糖吃可好)

7、初始化模型参数

PyTorch中nn.Module的模块参数都采取了较为合理的初始化策略(不同类型的layer具体采样的哪一种初始化方法的可参考源代码)。但经常需要使用其他方法来初始化权重。PyTorch的init模块里提供了多种预设的初始化方法。

 #将权重参数初始化成均值为0、标准差为0.01的正态分布随机数,并依然将偏差参数清零。
for name, param in net.named_parameters():if 'weight' in name:init.normal_(param, mean=0, std=0.01)print(name, param.data)for name, param in net.named_parameters():if 'bias' in name:init.constant_(param, val=0)print(name, param.data)


8、降维

# numpy中的ravel()、flatten()、squeeze()
# 都有将多维数组转换为一维数组的功能,区别:
# ravel():如果没有必要,不会产生源数据的副本
# flatten():返回源数据的副本
# squeeze():只能对维数为1的维度降维

9、numpy中的choice()

 a1 = np.random.choice(a=5, size=3, replace=False, p=None)
# 参数意思分别 是从a 中以概率P,随机选择3个, p没有指定的时候相当于是一致的分布
# replacement 代表的意思是抽样之后还放不放回去,如果是False的话,那么出来的三个数都不一样,如果是
# True的话, 有可能会出现重复的,因为前面的抽的放回去了

这篇关于人工智障填坑记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/756777

相关文章

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板