模型搭建练习2_实现nn模块、optim、two_layer、dynamic_net

用variable实现nn.module

 1 import torch
 2 from torch.autograd import Variable
 3 
 4 N, D_in, H, D_out = 64, 1000, 100, 10
 5 
 6 x = Variable(torch.randn(N, D_in))
 7 y = Variable(torch.randn(N, D_out), requires_grad=False)
 8 
 9 model = torch.nn.Sequential(
10     torch.nn.Linear(D_in, H),
11     torch.nn.ReLU(),
12     torch.nn.Linear(H, D_out),
13 )
14 
15 loss_fn = torch.nn.MSELoss(size_average=False)
16 
17 learning_rate = 1e-4
18 for t in range(2):
19     # Forward pass
20     y_pred = model(x)
21 
22     loss = loss_fn(y_pred, y)
23     # Zero the gradients before running the backward pass.
24     model.zero_grad()
25     # Backward pass: compute gradient of the loss with respect to all the learnable
26     # parameters of the model. Internally, the parameters of each Module are stored
27     # in Variables with requires_grad=True, so this call will compute gradients for
28     # all learnable parameters in the model.
29     loss.backward()
30 
31     # Update the weights using gradient descent. Each parameter is a Variable
32     for param in model.parameters():
33         param.data -= learning_rate * param.grad.data

实现optim

 1 import torch
 2 from torch.autograd import Variable
 3 
 4 N, D_in, H, D_out = 64, 1000, 100, 10
 5 x = Variable(torch.randn(N, D_in))
 6 y = Variable(torch.randn(N, D_out), requires_grad=False)
 7 
 8 model = torch.nn.Sequential(
 9     torch.nn.Linear(D_in, H),
10     torch.nn.ReLU(),
11     torch.nn.Linear(H, D_out),
12 )
13 loss_fn = torch.nn.MSELoss(size_average=False)
14 
15 learning_rate = 1e-4
16 # Use the optim package to define an Optimizer that will update the weights of
17 # the model for us.
18 optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
19 for t in range(500):
20     # Forward pass: compute predicted y by passing x to the model.
21     y_pred = model(x)
22     loss = loss_fn(y_pred, y)
23     # Before the backward pass, use the optimizer object to zero all of the
24     # gradients for the variables it will update (which are the learnable weights
25     # of the model)
26     optimizer.zero_grad()
27     # Backward pass: compute gradient of the loss with respect to model
28     # parameters
29     loss.backward()
30     # Calling the step function on an Optimizer makes an update to its
31     # parameters
32     optimizer.step()

实现two_layer模型

 1 import torch
 2 from torch.autograd import Variable
 3 
 4 class TwoLayerNet(torch.nn.Module):
 5     def __init__(self, D_in, H, D_out):
 6         super(TwoLayerNet, self).__init__()
 7         self.linear1 = torch.nn.Linear(D_in, H)
 8         self.linear2 = torch.nn.Linear(H, D_out)
 9 
10     def forward(self, x):
11         h_relu = self.linear1(x).clamp(min=0)
12         y_pred = self.linear2(h_relu)
13         return y_pred
14 
15 N, D_in, H, D_out = 64, 1000, 100, 10
16 x = Variable(torch.randn(N, D_in))
17 y = Variable(torch.randn(N, D_out), requires_grad=False)
18 
19 model = TwoLayerNet(D_in, H, D_out)
20 criterion = torch.nn.MSELoss(size_average=False)
21 optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
22 for t in range(2):
23     y_pred = model(x)
24     loss = criterion(y_pred, y)
25     optimizer.zero_grad()
26     loss.backward()
27     optimizer.step()

实现dynamic_net

 1 import random
 2 import torch
 3 from torch.autograd import Variable
 4 
 5 class DynamicNet(torch.nn.Module):
 6     def __init__(self, D_in, H, D_out):
 7         super(DynamicNet, self).__init__()
 8         self.input_linear = torch.nn.Linear(D_in, H)
 9         self.middle_linear = torch.nn.Linear(H, H)
10         self.output_linear = torch.nn.Linear(H, D_out)
11 
12     def forward(self, x):
13         h_relu = self.input_linear(x).clamp(min=0)
14         for _ in range(random.randint(0, 3)):
15             h_relu = self.middle_linear(h_relu).clamp(min=0)
16         y_pred = self.output_linear(h_relu)
17         return y_pred
18 
19 N, D_in, H, D_out = 64, 1000, 100, 10
20 x = Variable(torch.randn(N, D_in))
21 y = Variable(torch.randn(N, D_out), requires_grad=False)
22 model = DynamicNet(D_in, H, D_out)
23 
24 criterion = torch.nn.MSELoss(size_average=False)
25 optimizer = torch.optim.SGD(model.parameters(), lr=1e-4, momentum=0.9)
26 for t in range(2):
27     y_pred = model(x)
28     loss = criterion(y_pred, y)
29     optimizer.zero_grad()
30     loss.backward()
31     optimizer.step()

 

posted @ 2017-09-05 10:40  Joyce_song94  阅读(451)  评论(0编辑  收藏  举报