pip install torch -i https://pypi.douban.com/simple
可直接根据环境条件,直接运行最下面的命令安装。
使用 torch.nn.Embedding报错:index out of range in self;
可能原因是输入 embedding 层的数据并不是经过词典映射的,而是原始数据,因此张量内部有超出embedding层合法范围的数,embedding 层需检查张量内部具体值的大小,并确保它们的值在有效范围内[0, num_embeddings - 1]。可重新检查一下文本转为数字的过程,排序编码是否有问题
torch的zero_grad():
调用backward()函数之前都要将梯度清零,如果梯度不清零,pytorch会将上次计算的梯度和本次计算的梯度累加。好处是硬件限制,不能使用更大的batch_size时,使用多次计算较小的batch_size的梯度平均值代替更方便,坏处是每次都要清零梯度。
optimizer.zero_grad() output = net(input) loss = loss_f(output, target) loss.backward()
pytorch 的 backward() 函数,网络参数反馈时,梯度是被积累的而不是被替换掉;在每一个batch时不需要将两个batch的梯度混合起来累积,这时就需要每个batch设置一遍zero_grad()清零。
如果不是每一个batch 都清楚之前的梯度,如每两个batch清理一次,相当于提高了batch_size,如果硬件不行,但batch_size 需要设高的领域比较适合,比如目标检测模型的训练。
使用pytorch实现多项线性回归中,grad更新时,每次运算后将上一次梯度清空,报错:
原因是在系统将 w 的grad 值初始化为none,第一次求梯度计算是在none值上进行报错,自然会没有data属性,修改方法:添加一个判断语句,从第二次循环开始执行求导运算;
for i in range(100): y_pred = multi_linear(x_train) loss = getloss(y_pred, y_train) if i != 0: w.grad.data.zero_() b.grad.data.zero_() loss.backward() w.data = w.data - 0.001 * w.grad.data b.data = b.data - 0.001 * b.grad.data
模型预测结果输出与目标值shape不符
告警:‘UserWarning: Using a target size (torch.Size([16])) that is different to the input size (torch.Size([16, 1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.’
目标 tensor 的尺寸和输入 tensor 的尺寸不一致,只是警告,程序还能正常运行。该问题是目标 tensor 的尺寸是 ‘torch.Size([16, 1])’,而输入 tensor 的尺寸是 ‘torch.Size([16])’。
解决方法:使用 reshape() 改变目标 tensor 的尺寸,或用squeeze(1)将第二维去掉。
参考:
pytorch embedding层报错index out of range in self - 灰信网(软件开发博客聚合)