> 文章列表 > 笔记2 网络部分2

笔记2 网络部分2

笔记2 网络部分2

这里写目录标题

    • torch.utils.data.dataloader.default_collate
    • torch.load
    • StepLR
    • model.train()
    • optimizer.step()
    • enumerate()
    • torch.utils.data.DataLoader
    • output.data.max(1, keepdim=True)[1]
    • tenser.data

torch.utils.data.dataloader.default_collate

collate_fn: (callable, optional): merges a list of samples to form amini-batch of Tensor(s).  Used when using batched loading from amap-style dataset.

https://zhuanlan.zhihu.com/p/346332974

torch.load

https://blog.csdn.net/pearl8899/article/details/109566084
用于加载torch.save() 保存的模型文件。
函数格式为:torch.load(f, map_location=None, pickle_module=pickle, **pickle_load_args),一般我们使用的时候,基本只使用前两个参数
f为保存的模型路径

model_path = "./cuda_model.pth"
model = torch.load(model_path, map_location=torch.device('cpu'))

StepLR

https://blog.csdn.net/maly_Sunshine/article/details/123225799
调整学习率
class torch.optim.lr_scheduler.stepLR(optimizer, step_size,gamma=0.1,last_epoch=-1)

optimizer ---要更新学习率的优化器step_size --- 每经step_size个epoch,更新一次学习率lrgamma --- 更新lr的乘法因子last_epoch --- 默认为-1表示从头开始训练

model.train()

在使用pytorch构建神经网络的时候,训练过程中会在程序上方添加一句model.train(),作用是启用batch normalization和drop out。
测试过程中会使用model.eval(),这时神经网络会沿用batch normalization的值,并不使用drop out。

optimizer.step()

只有用了optimizer.step(),模型才会更新,而scheduler.step()是对lr进行调整。
https://zhuanlan.zhihu.com/p/344294796
https://blog.csdn.net/qq_20622615/article/details/83150963

loss.backward()进行反向传播求出梯度
optimizer进行参数管理与更新,所以optimizer放在backward后面用求出的梯度进行参数更行,记住step之前要进行optimizer.zero_grad(),否则用的梯度包含上一个batch的,相当于batch_size为之前的两倍,所以optimizer.step()是用在batch里的
scheduler.step()是用来更新学习率的,所以用在epoch里
原文链接:https://blog.csdn.net/phily123/article/details/123250205

enumerate()

https://zhuanlan.zhihu.com/p/92544989
https://blog.csdn.net/windmyself/article/details/119413613
enumerate(iteration, start)函数默认包含两个参数,其中iteration参数为需要遍历的参数,比如字典、列表、元组等,start参数为开始的参数,默认为0(不写start那就是从0开始)。

torch.utils.data.DataLoader

https://zhuanlan.zhihu.com/p/184911006

output.data.max(1, keepdim=True)[1]

(max, max_indices) = torch.max(input, dim, keepdim=False)

输入:
1、input 是输入的tensor。
2、dim 是索引的维度,dim=0寻找每一列的最大值,dim=1寻找每一行的最大值。
3、keepdim 表示是否需要保持输出的维度与输入一样,keepdim=True表示输出和输入的维度一样,keepdim=False表示输出的维度被压缩了,也就是输出会比输入低一个维度。
输出:
1、max 表示取最大值后的结果。
2、max_indices 表示最大值的索引。

https://blog.csdn.net/zylooooooooong/article/details/112576268

https://blog.csdn.net/weixin_48249563/article/details/111387501

k=np.arrayprint(p.data) # <memory at 0x000001F44E6EF048>p=torch.tensor(
[[1,2,3]]
)
print(torch.max(p,1, keepdim=True))
print(torch.max(p,1, keepdim=True)[1])torch.return_types.max(values=tensor([[3]]),indices=tensor([[2]]))tensor([[2]])

tenser.data

tensor.data的两点总结:

(1)tensor .data 返回和 x 的相同数据 tensor,而且这个新的tensor和原来的tensor是共用数据的,一者改变,另一者也会跟着改变,而且新分离得到的tensor的require s_grad = False, 即不可求导的。(这一点其实detach是一样的)

(2)使用tensor.data的局限性。文档中说使用tensor.data是不安全的, 因为 x.data 不能被 autograd 追踪求微分 。什么意思呢?从上面的例子可以看出,由于我更改分离之后的变量值c,导致原来的张量out的值也跟着改变了,但是这种改变对于autograd是没有察觉的,它依然按照求导规则来求导,导致得出完全错误的导数值却浑然不知。它的风险性就是如果我再任意一个地方更改了某一个张量,求导的时候也没有通知我已经在某处更改了,导致得出的导数值完全不正确,故而风险大。

原文链接:https://blog.csdn.net/qq_27825451/article/details/96837905