运行pytorch的一些问题

1.only one element tensors can be converted to python scalars(假设a的类型是tensor)
解决方案:tensor维度为1时才可以使用a.item()进行转换。

2.Can’t call numpy() on Variable that requires grad. Use var.detach().numpy() instead.通过调用 .detach() 方法可以停止一个张量对计算记录的追踪
解决方案:第三个问题的solution为正解。

3.can’t convert cuda tensor to numpy
解决方案:如果想把CUDA tensor格式的数据改成numpy时,需要先将其转换成cpu float-tensor随后再转到numpy格式。 numpy不能读取CUDA tensor 需要将它转化为 CPU tensor。

4.关于parser.add_argument()记录一个特殊的情况:ex1:action self.parser.add_argument('--lr_use', action='store_true', default=False, help='if or not use lr_loss')当在终端运行的时候,如果不加入–lr_use, 那么程序running的时候,lr_use的值为default: False
如果加上了–lr_use,不需要指定True/False,那么程序running的时候,lr_use的值为True
ex2: self.parser.add_argument('--no_flip', action='store_false', help='.....')
当在终端运行的时候,并没有加入–no_flip, 数据集中的图片并不会翻转,打印出来看到no_flip的值为True

5.model.zero_grad()optimizer.zero_grad()等效,都是将梯度置为0

6.循环的时候不要去累加loss,time;例如:loss += epoch_loss,可以将loss设置为一个列表,然后去求列表所有loss的和除以列表中的数目average_epoch_loss_train = sum(epoch_loss) / len(epoch_loss)。如epoch_loss[],epoch_loss.append(loss.item());

7.pytorch中的view()函数,可以有tensor调用,也可以有variable调用。其作用在于返回和原tensor数据个数相同,但size不同的tensor(numpy中的size是元素个数,pytorch中的size等价于numpy中的shape。) view函数只能用于contiguous的张量上,就是在内存中连续存储的张量,当tensor之前调用了transpose,permute函数时就会使得tensor内存变得不连续,就不能调用view函数,所以,应该提前做tensor.contiguous()的操作。reshape函数调用不依赖tensor在内存中是否连续。即reshape近似等于tensor.contiguous().view()

8.model.train()和model.eval()分别在训练和测试中写,它们的作用如下:
(1) model.train()
启用 BatchNormalization 和 Dropout,将BatchNormalization和Dropout置为True。
(2) model.eval()
不启用 BatchNormalization 和 Dropout,将BatchNormalization和Dropout置为False。

9.pytorch设置随机数种子使结果可复现:
在神经网络中,参数默认是随机初始化的,不同的初始化参数往往会导致不同的结果,当得到比较好的结果时我们通常希望这个结果是可以复现的,在pytorch中,通过设置全局随机数种子可以实现这个目的。

你可能感兴趣的:(python,深度学习)