首先这篇文章还没写完,因为今天要尝试对我之前的一个框架做一个简单的更新迭代,所以目前先更新这么多.
首先,目前的大多数电脑都是自带一些GPU(图形计算单元,在这里被称之为cuda), 需要安装相关的驱动才能正常使用这些设备和调用他们的具体情况.
nvidia-smi
但是平时对于我们个人来说,我们的电脑基本无法承担上百万的数据调用,所以一般情况下,服务器是可以提供给我们这些东西.
如图所示是服务器上的GPU情况,可以看到服务器的开发者实现了一些其他的探测功能.
(1)单独设备的选取
首先注意一个情况,对于单一设备来说,我们称呼CPU为'cpu',称呼GPU为'gpu'
而在代码中,设备时被抽象为一个对象,我们可以通过torch包下的device来指定某个设备:
- torch.device('cpu')
- torch.device('cuda') # 默认找到地0个GPU
- torch.device('cuda:1') # 可以指定第一个GPU
-
- # 以上三个函数会返回对应的一个设备连接对象
以上三个函数用来创建设备链接对象没通过这些设备可以获得具体的对象
当然在拿不准的时候,可以直接查询GPU的数目
torch.cuda.device_count()
如何构建神经网络,其实在上一篇博客中已经说到了,这里就简单介绍几个神经网络层构建函数
卷积层实现的效果其实就是一个简单的乘法加和,原理如图所示
- import torch.nn as nn
-
- nn.Con2d( input_channels, kernet_num ,kernel_size=?, padding=0, stride=1)
注意一下参数中的第二个参数是我个人的理解,其实按照正常的普遍理解,这个应该叫"输出通道数目".
(注意,大池化层的特点之一,都是不会改变频道的数目,也就是只会修改输入的尺寸,而不会修改输入的通道数目!!!!这个的pool东西,默认只有一层通道,也就是一个2d的核)
另外两个池化层需要输入的参数只有核的大小,以及步长
- import torch.nn as nn
-
- nn.AvgPool2D(kernel_size=? stride=1)
- import torch.nn as nn
-
- nn.MaxPool2D(kernel_size=? stride=1)
首先我们在大多数情况下创建的张量和模型,都是默认在cpu上面的\
- arr.device # cpu
- net.device # cuda/gpu
而在进行模型计算的时候,需要首先将模型和张量移动到统一设备上,这样计算很省时间
虽然但是,torch对于跨设备的数据和模型,提供了一些奇奇怪怪的手段来完成一个自动传递,但是真到了在训练的时候,临时传输不可避免地会造成大量的开销
使用to函数建立新链接即可
- cuda1=torch.device('cuda:1')
- X = torch.tensor([0,1,2,3])
- Y = X.to(cuda1)
-
- X.device # cpu
- Y.device # cuda1
而对于模型来说也是一样的的移动方式,使用to函数来实现
- # 顺便这里补充一个with语句
- with语句用来创建一个上下文, 比如打开文件(这里要加上as)
- 或者说给模型设置为训练模式
-
- 当with语句中的函数块执行结束以后,就可以讲with对应的操作做一个取消
- with net.train():
- ..........
- 当内部函数块执行结束以后,模型就会撤掉"转变为训练模式"这个操作