你有例子:
class My_model(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 4 * 4, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 4 * 4)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
# Call construtor of Class
my_model = My_model()
区分类和对象很重要。
名称的类在 Python 中以大写字母开头。
如你所见的构造函数,它不带数据/输入参数,只有函数 forward 有一个。
之后,为了培训,你必须:
- 计算带有标签的模型误差的标准。
- 它必须有反向传播算法的优化器
示例:
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
最后,你必须通过循环需要这个元素:
# forward + backward + optimize
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
在这里,您有一次反向传播迭代。
Pytorch documentation
如果您想考虑反向传播中的推理,您可以阅读如何使用 pytorch 创建图层以及 pytorch 如何使用签名。
张量使用 Autograph 进行反向传播。以Pytorch documentation为例
import torch
x = torch.ones(5) # input tensor
y = torch.zeros(3) # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)
loss.backward()
print(w.grad)
print(b.grad)
结果给出了反向传播,其中交叉熵标准计算模型和标签的距离。张量 z 不是唯一的值矩阵,而是一个具有 w、b、x、y 的“记忆计算”的类。
在该层中,梯度使用前向函数进行此计算,或者在必要时使用后向函数。
最好的尊重