这几天看完了第5章:深度学习计算,做个总结。
第五章:深度学习计算
5.1 层和块
介绍了神经网络的层和块。
层:①接收一组输入②生成相应输出③具有一组可调整参数
块:描述单个或多个层,或多个快,甚至整个模型。从编程角度,块由类(class)表示,其中包含前向传播函数和一些必要的参数。
from mxnet import np, npx
from mxnet.gluon import nnnpx.set_np()net = nn.Sequential()
net.add(nn.Dense(256, activation='relu'))
net.add(nn.Dense(10))
net.initialize()X = np.random.uniform(size=(2, 20))
net(X)
这样就实现了一个块,包含一个带激活函数的含256个神经元的全连接层和一个10个神经元的全连接层。
net(X)在这里相当于net.__call__(X)(默认调用函数),作用是将X前向传播得出预测的y。
Class MLP(nn.Module):def __init__(self):super().__init__()self.hidden = nn.Linear(20, 256) self.out = nn.Linnear(256, 10)# 括号里两个参数分别代表输入维度和输出维度def forward(self, X):return self.out(F.relu(self.hidden(X)))net = MLP()
net(X)
这样就手动实现了一个块。
nn.Module的默认调用函数是forward,所以net(X)运行的其实是net.forward(X)。
然后再来实现一个可以自定义的块:
class mySequential(nn.Module):def __init__(self, *args):super().__init__()for idx, module in enumerate(args):self._modules[str(idx)] = moduledef forward(self, X):for block in self._modules.values():X = block(X)return Xnet = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
net(X)
5.2 参数管理
这里介绍了一些关于神经网络参数的知识。
比如我们可以用函数访问参数:
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8,1))print(net[2].state_dict())
state_dict()用于获取模型参数和缓冲区(如权重和偏置)的字典,访问第三层的weight和bias。
print(net[2].bias)
print(net[2].bias.data)
输出偏置和参数类的实例。
还可以一次性输出模型全部参数,还有另一种输出模型参数的方式,还可以输出嵌套块的参数。
还有参数绑定:
shared = nn.Linear(8, 8)
net = Sequential(shared, nn.ReLU(), shared)
这时改变一个,另一个也会变。
5.5 读写文件
可以将张量加载或保存,也可以将模型加载或保存。
5.6 GPU
计算机中有CPU和GPU两种处理器(设备),默认情况下变量和计算都保存在CPU中,CPU和GPU可以用torch.device('cpu')和torch.device('cuda')表示。
CPU代表所有物理CPU和内存,GPU只代表一个卡和显存。
def try_gpu(i = 0):if torch.cuda.device_count() >= i+1:return torch.device(f'cuda:{i}')return torch.device('cpu')
可以自行设置将张量存储在gpu中,比如:
X = torch.ones(2, 3, device = try_gpu(0))
不同gpu上张量无法互通,需要进行运算可以将张量复制到另一个gpu上。
Z = X.cuda(1)
深度学习框架要求计算的输入数据都在同一设备上,无论是cpu还是gpu。