zoukankan      html  css  js  c++  java
  • 模型搭建练习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()
  • 相关阅读:
    基于Kalman filter 的北斗卫星三维坐标后数据处理
    原子串口使用0D0A结尾作为结束字符
    GY90614 读取温度,修改辐射率,拟合曲线
    CRH PC11配置
    _I2C_SDA_READ 状态确定为输入
    read_byte
    SDA 右移赋值
    积极心态-刚入职的我们
    mysql基础知识点(复习一)
    java基础知识点(复习一)
  • 原文地址:https://www.cnblogs.com/Joyce-song94/p/7477404.html
Copyright © 2011-2022 走看看