202107-01 在pytorch中计算准确率,召回率和F1值的操作 看代码吧~predict=output.argmax(dim=1)confusion_matrix=torch.zeros(2,2)fort,pinzip(predict.view(-1),target.view(-1)):confusion_matrix[t.long(),p.long()]+=1a_p=(confusion_matrix.diag()/confusion_matrix.sum(1))[0]b_p=(confusion_matrix.diag()/confusion_matrix.sum(1))[1]a_r=(confusion_matrix.diag()/confusion_matrix.sum(0))[0]b_r=(confusion_matrix.diag()/confusion_matrix.s... 继续阅读 >
202107-01 pytorch中的matmul与mm,bmm区别说明 pytorch中matmul和mm和bmm区别matmulmmbmm结论先看下官网上对这三个函数的介绍。matmulmmbmm顾名思义,就是两个batch矩阵乘法.结论从官方文档可以看出1、mm只能进行矩阵乘法,也就是输入的两个tensor维度只能是(n×m)(n\timesm)(n×m)和(m×p)(m\timesp)(m×p)2、bmm是两个三维张量相乘,两个输入tensor维度是(b×n×m)(b\timesn\timesm)(b×n×m)和(b×m×p)(b\timesm\timesp)(b×m×p),第一维b代... 继续阅读 >
202107-01 pytorch-autograde-计算图的特点说明 在PyTorch实现中,autograd会随着用户的操作,记录生成当前variable的所有操作,并由此建立一个有向无环图。用户每进行一个操作,相应的计算图就会发生改变。更底层的实现中,图中记录了操作Function,每一个变量在图中的位置可通过其grad_fn属性在图中的位置推测得到。在反向传播过程中,autograd沿着这个图从当前变量(根节点\textbf{z}z)溯源,可以利用链式求导法则计算所有叶子节点的梯度。每一个前向传播操作的函数都有与之... 继续阅读 >
202107-01 pytorch损失反向传播后梯度为none的问题 错误代码:输出grad为nonea=torch.ones((2,2),requires_grad=True).to(device)b=a.sum()b.backward()print(a.grad)由于.to(device)是一次操作,此时的a已经不是叶子节点了修改后的代码为:a=torch.ones((2,2),requires_grad=True)c=a.to(device)b=c.sum()b.backward()print(a.grad)类似错误:self.miu=torch.nn.Parameter(torch.ones(self.dimensional))*0.01应该为self.miu=torch.nn.Parameter(torch.ones(se... 继续阅读 >
202106-28 PyTorch 如何设置随机数种子使结果可复现 由于在模型训练的过程中存在大量的随机操作,使得对于同一份代码,重复运行后得到的结果不一致。因此,为了得到可重复的实验结果,我们需要对随机数生成器设置一个固定的种子。CUDNNcudnn中对卷积操作进行了优化,牺牲了精度来换取计算效率。如果需要保证可重复性,可以使用如下设置:fromtorch.backendsimportcudnncudnn.benchmark=False#ifbenchmark=True,deterministicwillbeFalsecudnn.deterministic=... 继续阅读 >
202106-28 pytorch MSELoss计算平均的实现方法 给定损失函数的输入y,pred,shape均为bxc。若设定loss_fn=torch.nn.MSELoss(reduction='mean'),最终的输出值其实是(y-pred)每个元素数字的平方之和除以(bxc),也就是在batch和特征维度上都取了平均。如果只想在batch上做平均,可以这样写:loss_fn=torch.nn.MSELoss(reduction='sum')loss=loss_fn(pred,y)/pred.size(0)补充:PyTorch中MSELoss的使用参数torch.nn.MSELoss(size_average=None,reduce=None,reduct... 继续阅读 >
202106-28 Pytorch中TensorBoard及torchsummary的使用详解 1.TensorBoard神经网络可视化工具TensorBoard是一个强大的可视化工具,在pytorch中有两种调用方法:1.fromtensorboardXimportSummaryWriter这种方法是在官方还不支持tensorboard时网上有大神写的2.fromtorch.utils.tensorboardimportSummaryWriter这种方法是后来更新官方加入的1.1调用方法1.1.1创建接口SummaryWriter功能:创建接口调用方法:writer=SummaryWriter("runs")参数:log_dir:eventfile输出文件夹comment:... 继续阅读 >
202106-23 pytorch 一行代码查看网络参数总量的实现 大家还是直接看代码吧~netG=Generator()print('#generatorparameters:',sum(param.numel()forparaminnetG.parameters()))netD=Discriminator()print('#discriminatorparameters:',sum(param.numel()forparaminnetD.parameters()))补充:PyTorch查看网络模型的参数量PARAMS和FLOPS等在PyTorch中,可以使用torchstat这个库来查看网络模型的一些信息,包括总的参数量params、MAdd、显卡内存占用量和FLOPs等。示例代... 继续阅读 >
202106-23 pytorch查看网络参数显存占用量等操作 1.使用torchstatpipinstalltorchstatfromtorchstatimportstatimporttorchvision.modelsasmodelsmodel=models.resnet152()stat(model,(3,224,224))关于stat函数的参数,第一个应该是模型,第二个则是输入尺寸,3为通道数。我没有调研该函数的详细参数,也不知道为什么使用的时候并不提示相应的参数。2.使用torchsummarypipinstalltorchsummaryfromtorchsummaryimportsummarysummary(model.cuda(),input_size=(3... 继续阅读 >
202106-23 pytorch 中autograd.grad()函数的用法说明 我们在用神经网络求解PDE时,经常要用到输出值对输入变量(不是Weights和Biases)求导;在训练WGAN-GP时,也会用到网络对输入变量的求导。以上两种需求,均可以用pytorch中的autograd.grad()函数实现。autograd.grad(outputs,inputs,grad_outputs=None,retain_graph=None,create_graph=False,only_inputs=True,allow_unused=False)outputs:求导的因变量(需要求导的函数)inputs:求导的自变量grad_outputs:如果ou... 继续阅读 >
202106-23 浅谈Pytorch中autograd的若干(踩坑)总结 关于Variable和Tensor旧版本的Pytorch中,Variable是对Tensor的一个封装;在Pytorch大于v0.4的版本后,Varible和Tensor合并了,意味着Tensor可以像旧版本的Variable那样运行,当然新版本中Variable封装仍旧可以用,但是对Varieble操作返回的将是一个Tensor。importtorchastfromtorch.autogradimportVariablea=t.ones(3,requires_grad=True)print(type(a))#输出:<class'torch.Tensor'>a=Variable(a)print(type(a))#输出... 继续阅读 >
202106-23 pytorch Variable与Tensor合并后 requires_grad()默认与修改方式 pytorch更新完后合并了Variable与Tensortorch.Tensor()能像Variable一样进行反向传播的更新,返回值为TensorVariable自动创建tensor,且返回值为Tensor,(所以以后不需要再用Variable)Tensor创建后,默认requires_grad=Flase可以通过xxx.requires_grad_()将默认的Flase修改为True下面附代码及官方文档代码:importtorchfromtorch.autogradimportVariable#使用Variabl必须调用库lis=torch.range(1,6).reshape((-1,3))#创建1~6... 继续阅读 >
202106-23 pytorch loss反向传播出错的解决方案 今天在使用pytorch进行训练,在运行loss.backward()误差反向传播时出错:RuntimeError:gradcanbeimplicitlycreatedonlyforscalaroutputsFile"train.py",line143,intrainloss.backward()File"/usr/local/lib/python3.6/dist-packages/torch/tensor.py",line198,inbackwardtorch.autograd.backward(self,gradient,retain_graph,create_graph)File"/usr/local/lib/python3.6/dist-packages/torch/autograd/... 继续阅读 >
202106-23 pytorch 多个反向传播操作 之前我的一篇文章pytorch计算图以及backward,讲了一些pytorch中基本的反向传播,理清了梯度是如何计算以及下降的,建议先看懂那个,然后再看这个。从一个错误说起:RuntimeError:Tryingtobackwardthroughthegraphasecondtime,butthebuffershavealreadybeenfreed在深度学习中,有些场景需要进行两次反向,比如Gan网络,需要对D进行一次,还要对G进行一次,很多人都会遇到上面这个错误,这个错误的意思就是尝试对... 继续阅读 >
202106-23 pytorch 禁止/允许计算局部梯度的操作 一、禁止计算局部梯度torch.autogard.no_grad:禁用梯度计算的上下文管理器。当确定不会调用Tensor.backward()计算梯度时,设置禁止计算梯度会减少内存消耗。如果需要计算梯度设置Tensor.requires_grad=True两种禁用方法:将不用计算梯度的变量放在withtorch.no_grad()里>>>x=torch.tensor([1.],requires_grad=True)>>>withtorch.no_grad():...y=x*2>>>y.requires_gradOut[12]:False使用装饰器@torch.no_gard()修... 继续阅读 >
202106-23 聊聊PyTorch中eval和no_grad的关系 首先这两者有着本质上区别model.eval()是用来告知model内的各个layer采取eval模式工作。这个操作主要是应对诸如dropout和batchnorm这些在训练模式下需要采取不同操作的特殊layer。训练和测试的时候都可以开启。torch.no_grad()则是告知自动求导引擎不要进行求导操作。这个操作的意义在于加速计算、节约内存。但是由于没有gradient,也就没有办法进行backward。所以只能在测试的时候开启。所以在evaluate的时候,需要同时使用两者。... 继续阅读 >