# net ## basic ### 参数 ### 初始化 通过`net[0]`选择网络中的第一个图层, 然后使用`weight.data`和`bias.data`方法访问参数。 我们还可以使用替换方法`normal_`和`fill_`来重写参数值。 ```python # nn是神经网络的缩写 from torch import nn net = nn.Sequential(nn.Linear(2, 1)) net[0].weight.data.normal_(0, 0.01) net[0].bias.data.fill_(0) ``` 对网络linear层的参数,`normal_` ``` net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10)) def init_weights(m): if type(m) == nn.Linear: nn.init.normal_(m.weight, std=0.01) net.apply(init_weights); ``` ### loss 计算均方误差使用的是`MSELoss`类,也称为平方`L2`范数。 默认情况下,它返回所有样本损失的平均值。 ```python loss = nn.MSELoss() ``` ### 优化器 ```python trainer = torch.optim.SGD(net.parameters(), lr=0.03) ``` ### 简单结构 在l.backward()之前,进行梯度清0 `trainer.zero_grad()` ```python num_epochs = 3 for epoch in range(num_epochs): for X, y in data_iter: l = loss(net(X) ,y) trainer.zero_grad() l.backward() trainer.step() l = loss(net(features), labels) print(f'epoch {epoch + 1}, loss {l:f}') ``` ## 数据集 ```python batch_size = 256 def get_dataloader_workers(): """使用4个进程来读取数据""" return 4 train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True, num_workers=get_dataloader_workers()) ``` 对mnist_train的要求是什么 ## net layer 封装 经典例子 ```python net = nn.Sequential(nn.Flatten(), nn.Linear(784, 256), nn.ReLU(), nn.Linear(256, 10)) ``` ### 自定义块 **自定义块要继承**`nn.Module` ```python from torch import nn from torch.nn import functional as F class MLP(nn.Module): # 用模型参数声明层。这里,我们声明两个全连接的层 def __init__(self): # 调用MLP的父类Module的构造函数来执行必要的初始化。 # 这样,在类实例化时也可以指定其他函数参数,例如模型参数params(稍后将介绍) super().__init__() self.hidden = nn.Linear(20, 256) # 隐藏层 self.out = nn.Linear(256, 10) # 输出层 # 定义模型的前向传播,即如何根据输入X返回所需的模型输出 def forward(self, X): # 注意,这里我们使用ReLU的函数版本,其在nn.functional模块中定义。 return self.out(F.relu(self.hidden(X))) ```