07.08-07.013第28周已完成

0708

开始每天三小时学习

第一小时:补python基础。55-59课

if选择,for,while循环,可迭代对象非常灵活

r1 = {"name":"gaoqi","age":18,"salary":30000}
r2 = {"name":"gaoqa","age":19,"salary":40000}
tb =[r1,r2]
for i in tb:
    for j in i.items():
        print(j,end="\t")

第二个小时:实战

构建神经网络讲解

构建简单的神经网络

torch.nn.flatten() torch.flatten()

torch.nn.Flatten(start_dim=1end_dim=- 1)

作用:将连续的维度范围展平为张量。 经常在nn.Sequential()中出现,一般写在某个神经网络模型之后,用于对神经网络模型的输出进行处理,得到tensor类型的数据。

注意是从dim=1开始的,也就是第二个维度

而torch.flatten()是从dim=0开始的

nn.Linear()是用于设置网络中的全连接层的,在二维图像处理的任务中,全连接层的输入与输出一般都设置为二维张量,形状通常为[batch_size, size],不同于卷积层要求输入输出是四维张量(b,w,h,c)。

ReLU()函数是分段线性函数,把所有的负值都变为0,而正值不变,这种操作被成为单侧抑制。类似的函数有nn.ReLU(inplace=True),把变量进行替换,直接把原来的变量覆盖掉,节省了内存。缺点是有时候出现梯度回传失败的问题,之前的变量被替换,找不到之前的变量。

model.named_parameters()是一个内置函数,它返回一个迭代器,每次迭代都会生成一个包含参数名称(name)和对应参数值(param)的元组。

0709

开始每天三小时学习

第一小时:补python基础。60-64课

代码优化

1. 尽量减少循环内部不必要的计算

2. 嵌套循环中,尽量减少内层循环的计算,尽可能向外提。

3. 局部变量查询较快,尽量使用局部变量

我们可以通过 zip()函数对多个序列进行并行迭代,zip()函数在最短序列“用完”时就会停止

代码中测试了,zip并行迭代快了20%

#测试并行迭代
import time
names = ("高淇","高老二","高老三","高老四")
ages = (18,16,20,25)
jobs = ("老师","程序员","公务员")

start1 = time.time()
for m in range(10000):
    for name,age,job in zip(names,ages,jobs):
        print(f"{name}--{age}--{job}")
end1 = time.time()

start2 = time.time()
for n in range(10000):
    for i in range(3):
        print(f"{names[i]}--{ages[i]}--{jobs[i]}")

end2 = time.time()

print(f"zip使用的时间{end1-start1},遍历使用的时间{end2-start2}")
#zip并行迭代快了20%

第二个小时:实战

pytorch基础-使用 TORCH.AUTOGRAD 进行自动微分(5)_pytorch 的 autograd 系统不支持对具有复杂 dtype 的输出进行自动微分-CSDN博客

tensor.requires_grad函数

a = torch.randn(2, 2) # 缺失情况下默认 requires_grad = False
x = ((a * 5) / (a - 5))
print(x.requires_grad) # False
a.requires_grad_(True)
print(a.requires_grad) # True

 由于x是直接创建的,所以它没有grad_fn,而z是通过计算创建的,所以z有grad_fn。像x这种直接创建的称为叶子节点,叶子节点对应的grad_fn是None。

x = torch.ones(5)  # input tensor
y = torch.zeros(3)  # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)
print(f"Gradient function for x = {x.grad_fn}")
print(f"Gradient function for z = {z.grad_fn}")
print(f"Gradient function for loss = {loss.grad_fn}")
.grad_fn是什么

requires_grad,grad_fn,grad的含义及使用_dlage的博客-CSDN博客_requires_grad_

pytorch-微分_pytorch微分-CSDN博客

在前向传递中,autograd 同时做两件事:

(1)在前向传递中,autograd同时做两件事:运行请求的操作来计算结果张量。在DAG中维护操作的梯度函数:.grad_fn。

(2)当在DAG根节点上调用.backward()时,后向传递开始。autograd计算每个  .grad_fn的梯度。将它们累积到各自张量的  .grad属性中。利用链式法则,一直传播到叶张量。

.grad_fn就是这个计算图上的一条边,它指向了创建当前张量的操作函数

一般不设置backward()函数的参数,就本质上相当于调用backward(torch.tensor(1.0)),这也是计算标量值函数(比如神经网络训练期间的损失,损失就是标量)的梯度的一种有用方法。

torch.tensor(1.)创建了一个标量张量1.0,这个值会被用作损失函数的梯度。

从说明中我们可以了解到:

  • 如果你要求导的是一个标量,那么gradients默认为None,所以前面可以直接调用J.backward()就行了
  • 如果你要求导的是一个量,那么gradients应该传入一个Tensor。那么这个时候是什么意思呢?

0710

开始每天三小时学习

第一小时:补python基础。65-66课

推导式是典型的 Python 风格,会使用它代表你已经超过 Python 初学者的水平

很多同学可能会问:“都有推导式,元组有没有?”,能不能用小括号?

我们发现提示的是“一个生成器对象”。显然,元组是没有推导式的

画同心圆,画棋盘。

第二个小时:实战

pytorch基础-优化模型参数(6)_sgd optimizer.setp()-CSDN博客

   for batch, (X, y) in enumerate(dataloader):#从数据加载器中获取批次个数,图像数据和对应标签
enumerate() 函数

enumerate() 函数用于同时返回索引 batch 和对应的批次数据 (X, y)X 往往代表输入特征数据,y 则对应于输入数据的标签或者目标值。enumerate 让我们能够跟踪当前正在处理的是第几个批次,这对于监督学习中的训练至关重要

pytorch之dataloader,enumerate_enumerate pytorch-CSDN博客

train_loader = DataLoader(dataset=train_ids, batch_size=4, shuffle=True)
for i, data in enumerate(train_loader):  # 注意enumerate返回值有两个,一个是序号,一个是数据(包含训练数据和标签)

for i:就是循环,把索引(地址)和数据(这里是因为数据本身就是二维,即索引+数据)都传入了data里

Dataloader:传入数据(这个数据包括:训练数据和标签),batchsize(代表的是将数据分成batch=[len(train_ids[0])除以batchsize],每一份包括的数据是batchsize)

enumerate:返回值有两个:一个是序号,也就是在这里的batch地址,一个是数据train_ids

0711

开始每天三小时学习

第一小时:补python基础。67-68课

做了第四章习题

文档字符串

​​​​​​​help(printMax.__doc__)
help(printMax)

第二个小时:实战

pytorch基础-优化模型参数(6)_sgd optimizer.setp()-CSDN博客

在深度学习模型中,有几种常见的运行模式:

1.训练模式:model.train()是一个常用函数,用于将模型设置为训练模式。当模型处于训练模式下,它的内部层会启用反向传播算法,允许我们在给定输入数据和标签的情况下更新模型的权重,以最小化损失函数。

2.评估模式:model.eval()model.test(): 这种模式下,模型通常不会对内部状态进行更新,比如关闭Dropout和BN(批归一化)等随机行为,目的是为了在验证集或测试集上得到更准确的结果。它适用于计算精度、召回率等指标,而不仅仅是前向传播。

3.推断模式(inference or prediction mode): 当你需要模型只用于预测新样本结果,不涉及任何更新权重的操作时,通常会调用这个模式。例如在生产环境中部署模型,直接做实时推理。

4.冻结模式 (Freezing layers): 如果你想在一个预训练模型的基础上进行微调,可能会先将某些早期的层(通常认为任务无关的部分)固定住,只调整新增或后期添加的层。

5.调试模式 (model.debug()): 一些框架提供特殊模式,用于模型的调试和性能分析,比如查看内部激活、梯度信息等。

        if batch % 100 == 0:
            loss, current = loss.item(), batch * batch_size + len(X)
            print(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")

.item():该方法的功能是以标准的Python数字的形式来返回这个张量的值.这个方法 只能用于只包含一个元素的张量.对于其他的张量,请查看方法tolist().

correct += (pred.argmax(1) == y).type(torch.float).sum().item()

这行代码是PyTorch中的一个常见评估指标计算操作,用于计算模型预测结果和真实标签之间的准确率。这里解释一下每一部分:

  1. pred.argmax(1)argmax函数沿着第一维(通常是类别轴)找到每个样本的最大概率预测值,返回的是每个样本对应的类别编号,形状为(batch_size,)。

  2. == y: 这是在比较每个预测的类别编号是否等于真实的标签y。如果是,结果是一个布尔型tensor,其中True表示预测正确,False表示预测错误。

  3. .type(torch.float): 将布尔tensor转换为浮点数,因为后续需要求和,而torch中的sum函数默认只支持数值类型。

  4. .sum(): 对转换后的浮点tensor求和,这个和代表了多少个样本被正确预测。

  5. .item(): 最后,调用item()函数将结果从张量转换为单个浮点数,因为我们通常关心的是准确率这一数值,不是一个张量。

所以整体来说,这行代码计算了所有样本中预测正确的比例,并作为准确率存储在correct变量中。

实验代码:

import torch
a = [True,False]
x = torch.tensor(a)
print(x)
print(x.type(torch.float))
 总样本数和总batch数

dataloader.dataset和dataloader不一样:)

 size = len(dataloader.dataset)#获取数据集总数大小
    num_batches = len(dataloader)#获取样本数据集中的组数

0712

开始每天三小时学习

第一小时:补python基础。69-73课

做了第四章习题

文档字符串

全局变量、局部变量。栈帧。局部变量效率更高

第二个小时:实战

pytorch基础-保存和加载模型(7)_save state dict-CSDN博客

模型存储和加载

0713

开始每天三小时学习

第一小时:补python基础。74-79课

深拷贝和浅拷贝

传递可变对象和不可变对象

我们可以为某些参数设置默认值,这样这些参数在传递时就是可选的。称为“默认值参数”。

默认值参数放到位置参数后面

def f1(a,b,c=10,d=20):

​​​​​​​

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值