0715
开始每天三小时学习
第一小时:补python基础。80-84课
递归函数:栈帧分析
嵌套函数:封装
nonlocal 用来声明外层的局部变量。
global 用来声明全局变量。
区别在于nonlocal没有global那么霸道
第二个小时:实战
pytorch基础-保存和加载模型(7)_save state dict-CSDN博客
Introduction to PyTorch — PyTorch Tutorials 2.3.0+cu121 documentation
模型存储和加载
保存参数可以:
torch.save(model.state_dict(), 'model_weights.pth')
要加载模型权重,需要先创建相同模型的实例,然后使用load_state_dict()
方法加载参数。
#只保存参数,加载时要先实例化模型
model = models.vgg16(weights='IMAGENET1K_V1')
torch.save(model.state_dict(), 'model_weights.pth')
model = models.vgg16() # we do not specify ``weights``, i.e. create untrained model
model.load_state_dict(torch.load('model_weights.pth'))
model.eval()
#保存参数和结构
torch.save(model, 'model.pth')
model = torch.load('model.pth')
使用 PyTorch 进行深度学习-神经网络(部分)_pytorch loss.backward()针对整个网络参数-CSDN博客
LeNet
.view(-1)
torch.Tensor.view — PyTorch 2.3 documentation
-1:代表在该维度上自动计算结果。在其它参数已知的情况下自动补齐列向量长度。
可视化
def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
-
Unnormalization:由于在训练过程中,为了数值稳定性,图像可能会经过归一化处理(通常是将像素值从 0 到 1 或者 -1 到 1 范围内缩放)。通过除以2加0.5的操作,我们将它们还原回原始的像素值范围。
-
转换数据格式:
npimg = img.numpy()
将张量转换成NumPy数组,以便于matplotlib库的imshow函数使用。最后通过np.transpose
将张量转置,使其按照(height, width, channels)
的顺序排列,因为matplotlib期望颜色通道最后一个。
抽取样本
dataiter = iter(trainloader)
images, labels = next(dataiter)
dataiter = iter(trainloader)
这一行代码创建了一个迭代器 dataiter
,它是基于 trainloader
数据加载器的对象,通常是一个 PyTorch 的 DataLoader 对象,用于逐批次地从训练数据集中获取数据。trainloader
中的数据被预处理并打包在一起,每次迭代返回的是一组图片(images
)及其对应的标签(labels
)。
next(dataiter)
是一个Python内置函数,当调用 dataiter
的 next()
方法时,它会从当前的数据批中取出下一个元素。
这里会报错
dataiter = iter(trainloader)
images, labels = dataiter.next()
官网教程dataiter = iter(trainloader)报错的解决办法-CSDN博客
pytorch里inshow的图怎么让它不消失
plt.show()
0716
开始每天三小时学习
第一小时:补python基础。85-89课
递归函数:栈帧分析
开始学定义 类:我们把对象比作一个“饼干”,类就是制造这个饼干的“模具”。对象是类的具体实体,一般称为“类的实例”。
通过类定义数据类型的属性(数据)和方法(行为)
构造函数__init__(self):
#特殊的构造方法(函数),在其中定义属性 #self必须位于第一个参数
大概了解了:super(net, self).__init__()
继承了父类net,用父类的方法初始化子类的属性。
第二个小时:实战
深度学习pytorch实战一:LeNet图像分类篇且pytorch官方提供The CIFAR-10数据集分十类 - 古月居
在pycharm的configuration里选择parameter
--weights yolov5s.pt --data data/fire.yaml --workers 1 --batch-size 10
torch.max()
_, predicted = torch.max(outputs.data, 1)
用于沿着第二个维度(这里是第1维,因为对于单个样本来说,其长度通常是1),找出每个样本得分中的最大值及其索引。
correct += (predicted == labels).sum().item()
correct
变量用于累计预测正确的数量。predicted == labels
这部分是一个条件判断,如果预测的类别(predicted)等于实际的标签(labels),则返回的是一个布尔型张量,其中True的位置对应于预测正确的样本。然后,.sum()
函数将所有True加起来,得到正确预测的数量。
.item()
方法
用于从张量转换成标量,因为.sum()
返回的是一个整数类型的张量,我们需要获取具体的数值。
torch.manual_seed()
.empty_like()
、.zeros_like()
、 .ones_like()
和.rand_like()
方法。
Tensor Broadcasting
称为广播规则,是NumPy和许多其他深度学习库(如TensorFlow和PyTorch)处理数组运算的一种机制。当两个或更多数组进行数学运算时,如果它们的形状不完全匹配,NumPy会自动地扩展较小的数组(或单个元素)以适应较大的数组,从而保持操作的进行,而无需显式地进行填充。
广播规则如下:
-
每个张量必须至少有一个维度 - 不能有空张量。
-
比较两个张量的维度大小,从最后一个到第一个:
-
每个维度必须相等,或者
-
其中一个维度的大小必须为 1,或者
-
其中一个张量不存在该维度
-
torch.matmul()
torch.cross()
torch.svd()
0717
开始每天三小时学习
第一小时:补python基础。90-94课
实例属性
实例方法
类属性
类方法
第二个小时:实战
unsqueeze()
import torch
lin = torch.nn.Linear(3, 2)
conv = torch.nn.Conv2d(1,2,5)
x = torch.rand(1, 3)
print('Input:')
print(x)
print('\n\nWeight and Bias parameters:')
for param in lin.parameters():
print(param)
y = lin(x)
print('\n\nOutput:')
print(y)
input = torch.rand(1, 1, 32, 32) # stand-in for a 32x32 black & white image
output = conv(input)
print('\n\nIn ConvWeight and Bias parameters:')
for param in conv.parameters():
print(param)
print(output)
小小试了下
torch.nn.Linear(m,n)会创建一个[m,n]的权重矩阵和[n]的偏置矩阵:Input * [m,n] + [n] = output
torch.nn.Conv2d(ChannelInput,ChannelOutput,m)会创建一个[ChannelOutput,ChannelInput,m,m]的权重矩阵和[ChannelOutput]的偏置矩阵,可以理解为ChannelOutput个[ChannelInput,m,m]的卷积核和ChannelOutput个偏置。
Input: [ChannelInput, SizeInput,SizeInput]
Output: [ChannelOutput, SizeInput-m+1,SizeInput-m+1]
0718
玩,看万物渺小又伟大
0719
玩文明
0720
开始每天三小时学习
第一小时:补python基础。95-89课
__del__
__call__
私有属性和私有方法