Код, который вы опубликовали, представляет собой простую демонстрацию, пытающуюся раскрыть внутренний механизм таких основ глубокого обучения. Эти платформы, включая PyTorch, Keras, Tensorflow и многие другие, автоматически обрабатывают прямой расчет, отслеживание и применение градиентов для вас, пока вы определили структуру сети. Однако код, который вы показали, все еще пытается сделать это вручную. Вот почему вы чувствуете громоздкость, когда предсказываете один пример, потому что вы все еще делаете это с нуля.
На практике мы определим класс модели, унаследованный от torch.nn.Module
, и инициализируем все сетевые компоненты (такие как нейронный уровень, GRU, уровень LSTM и т. Д.) В функции __init__
и определим, как эти компоненты взаимодействуют с сетевой вход в функции forward
.
Взят пример с предоставленной вами страницы:
# Code in file nn/two_layer_net_module.py
import torch
class TwoLayerNet(torch.nn.Module):
def __init__(self, D_in, H, D_out):
"""
In the constructor we instantiate two nn.Linear modules and
assign them as
member variables.
"""
super(TwoLayerNet, self).__init__()
self.linear1 = torch.nn.Linear(D_in, H)
self.linear2 = torch.nn.Linear(H, D_out)
def forward(self, x):
"""
In the forward function we accept a Tensor of input data and we must return
a Tensor of output data. We can use Modules defined in the constructor as
well as arbitrary (differentiable) operations on Tensors.
"""
h_relu = self.linear1(x).clamp(min=0)
y_pred = self.linear2(h_relu)
return y_pred
# N is batch size; D_in is input dimension;
# H is hidden dimension; D_out is output dimension.
N, D_in, H, D_out = 64, 1000, 100, 10
# Create random Tensors to hold inputs and outputs
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)
# Construct our model by instantiating the class defined above.
model = TwoLayerNet(D_in, H, D_out)
# Construct our loss function and an Optimizer. The call to
model.parameters()
# in the SGD constructor will contain the learnable parameters of the two
# nn.Linear modules which are members of the model.
loss_fn = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
for t in range(500):
# Forward pass: Compute predicted y by passing x to the model
y_pred = model(x)
# Compute and print loss
loss = loss_fn(y_pred, y)
print(t, loss.item())
# Zero gradients, perform a backward pass, and update the weights.
optimizer.zero_grad()
loss.backward()
optimizer.step()
Код определяет модель с именем TwoLayerNet, он инициализирует два линейных слоя в функции __init__
и дополнительно определяет, как эти два линейных элемента взаимодействуют со входом x
в функции forward
. Определив модель, мы можем выполнить одну операцию прямой связи, просто вызвав экземпляр модели, как показано в конце фрагмента кода:
y_pred = model(x)