、指定GPU编号
2、查看模型每层输出详情
3、梯度裁剪
4、扩展单张图片维度
5、onehot编码
6、防止验证模型时爆显存
7、学习率衰减
8、冻结某些层的参数
9、对不同层使用不同学习率
0、模型相关操作
、Pytorch内置onehot函数
2、网络参数初始化
3、加载内置预训练模型
、指定GPU编号设置当前使用的GPU设备仅为0号设备,设备名称为/gpu:0:os.environ["CUDA_VISIBLE_DEVICES"]="0"
设置当前使用的GPU设备为0,号两个设备,名称依次为/gpu:0、/gpu::os.environ["CUDA_VISIBLE_DEVICES"]="0,",根据顺序表示优先使用0号设备,然后使用号设备。
指定GPU的命令需要放在和神经网络相关的一系列操作的前面。2、查看模型每层输出详情Keras有一个简洁的API来查看模型的每一层输出尺寸,这在调试网络时非常有用。现在在PyTorch中也可以实现这个功能。使用很简单,如下用法:fromtorchsummaryimportsummarysummary(your_model,input_size=(channels,H,W))input_size是根据你自己的网络模型的输入尺寸进行设置。3、(GradientClipping)梯度裁剪
importtorch.nnasnnoutputs=model(data)loss=loss_fn(outputs,target)optimizer.zero_grad()loss.backward()nn.utils.clip_grad_norm_(model.parameters(),max_norm=20,norm_type=2)optimizer.step()nn.utils.clip_grad_norm_的参数:parameters–一个基于变量的迭代器,会进行梯度归一化max_norm–梯度的最大范数norm_type–规定范数的类型,默认为L2
不椭的椭圆提出:梯度裁剪在某些任务上会额外消耗大量的计算时间,可移步评论区查看详情。4、扩展单张图片维度因为在训练时的数据维度一般都是(batch_size,c,h,w),而在测试时只输入一张图片,所以需要扩展维度,扩展维度有多个方法:importcv2importtorchimage=cv2.imread(img_path)image=torch.tensor(image)print(image.size())img=image.view(,*image.size())print(img.size())#output:#torch.Size([h,w,c])#torch.Size([,h,w,c])或
importcv2importnumpyasnpimage=cv2.imread(img_path)print(image.shape)img=image[np.newaxis,:,:,:]print(img.shape)#output:#(h,w,c)#(,h,w,c)或(感谢
coldleaf的补充)importcv2importtorchimage=cv2.imread(img_path)image=torch.tensor(image)print(image.size())img=image.unsqueeze(dim=0)print(img.size())img=img.squeeze(dim=0)print(img.size())#output:#torch.Size([(h,w,c)])#torch.Size([,h,w,c])#torch.Size([h,w,c])tensor.unsqueeze(dim):扩展维度,dim指定扩展哪个维度。tensor.squeeze(dim):去除dim指定的且size为的维度,维度大于时,squeeze()不起作用,不指定dim时,去除所有size为的维度。5、独热编码在PyTorch中使用交叉熵损失函数的时候会自动把label转化成onehot,所以不用手动转化,而使用MSE需要手动转化成onehot编码。
importtorchclass_num=8batch_size=4defone_hot(label):"""将一维列表转换为独热编码"""label=label.resize_(batch_size,)m_zeros=torch.zeros(batch_size,class_num)#从value中取值,然后根据dim和index给相应位置赋值onehot=m_zeros.scatter_(,label,)#(dim,index,value)returnonehot.numpy()#Tensor-Numpylabel=torch.LongTensor(batch_size).random_()%class_num#对随机数取余print(one_hot(label))#output:[[0.0.0..0.0.0.0.][0.0.0.0..0.0.0.][0.0..0.0.0.0.0.][0..0.0.0.0.0.0.]]注:第条有更简单的方法。6、防止验证模型时爆显存验证模型时不需要求导,即不需要梯度计算,关闭autograd,可以提高速度,节约内存。如果不关闭可能会爆显存。
withtorch.no_grad():#使用model进行预测的代码pass感谢
zhaz的提醒,我把torch.cuda.empty_cache()的使用原因更新一下。这是原回答:Pytorch训练时无用的临时变量可能会越来越多,导致outofmemory,可以使用下面语句来清理这些不需要的变量。