有关torch中的疑难杂症-后续更新


1、为何tensor中默认的requires_grad默认设置的是False值,但训练的时候梯度依然可以回传?

只要某一个输入需要相关梯度值,则输出也需要保存相关梯度信息,这样就保证了这个输入的梯度回传。 而反之,若所有的输入都不需要保存梯度,那么输出的requires_grad会自动设置为False。既然没有了相关的梯度值,自然进行反向传播时会将这部分子图从计算中剔除。 对于那些要求梯度的tensor,PyTorch会存储他们相关梯度信息和产生他们的操作,这产生额外内存消耗,为了优化内存使用,默认产生的tensor是不需要梯度的。 而我们在使用神经网络时,这些全连接层卷积层等结构的参数都是默认需要梯度的。 原文链接:https://blog.csdn.net/weixin_44696221/article/details/104269981

2、pytorch 中网络的实例对象自动调用forward方法?
pytorch框架中主程序定义网络的实例对象后,输入数据自动调用forward方法

原因;当实例被当成一个函数调用的时候,此时会调用实例所属类的__call__ 方法,而__call__方法又调用了forward方法,但forward在子类中(之前的实例所属的网络)又重新定义了,所以此时调用子类的forward方法。

上图的super方法就可以规定使用子类的forward,而不是nn.Module中的__call__方法中的forward方法,但实现此原理的源码还是看不懂哈哈

3、num_workers&batch_size对cpu和gpu的作用
batch_size管显存,num_workers管GPU利用率。batch_size设置一般为2-32,num_workers一般为8、16。

相关