Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.02 KB | None | 0 0
  1.  
  2. X = np.random.rand(4000,1100).astype('float32')
  3. y = np.random.randint(0,5,size=(4000,1100)).astype('long')
  4. train_ds = data.TensorDataset(torch.from_numpy(X[:-800]).unsqueeze(-1), torch.from_numpy(y[:-800]).unsqueeze(-1))
  5. valid_ds = data.TensorDataset(torch.from_numpy(X[-800:]).unsqueeze(-1), torch.from_numpy(y[-800:]).unsqueeze(-1))
  6.  
  7.  
  8. batch_size = 32
  9. n_iters = 3000
  10. num_epochs = n_iters / (len(train_ds) / batch_size)
  11. num_epochs = int(num_epochs)
  12.  
  13. train_loader = torch.utils.data.DataLoader(dataset=train_ds,
  14.                                            batch_size=batch_size,
  15.                                            shuffle=True)
  16.  
  17. test_loader = torch.utils.data.DataLoader(dataset=valid_ds,
  18.                                           batch_size=batch_size,
  19.                                           shuffle=False)
  20.  
  21. '''
  22. STEP 3: CREATE MODEL CLASS
  23. '''
  24.  
  25. class LSTMModel(nn.Module):
  26.     def __init__(self, input_dim, hidden_dim, layer_dim, output_dim):
  27.         super(LSTMModel, self).__init__()
  28.         # Hidden dimensions
  29.         self.hidden_dim = hidden_dim
  30.  
  31.         # Number of hidden layers
  32.         self.layer_dim = layer_dim
  33.  
  34.         # Building your LSTM
  35.         # batch_first=True causes input/output tensors to be of shape
  36.         # (batch_dim, seq_dim, feature_dim)
  37.         self.lstm = nn.LSTM(input_dim, hidden_dim, layer_dim, batch_first=True)
  38.  
  39.         # Readout layer
  40.         self.fc = nn.Linear(hidden_dim, output_dim)
  41.  
  42.     def forward(self, x):
  43.         # Initialize hidden state with zeros
  44.         #######################
  45.         #  USE GPU FOR MODEL  #
  46.         #######################
  47.         h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_().to(device)
  48.  
  49.         # Initialize cell state
  50.         c0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_().to(device)
  51.  
  52.         # One time step
  53.         out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach()))
  54.  
  55.         # Index hidden state of last time step
  56.         # out.size() --> 100, 28, 100
  57.         # out[:, -1, :] --> 100, 100 --> just want last time step hidden states!
  58.         out = self.fc(out[:, -1, :])
  59.         # out.size() --> 100, 10
  60.         return out
  61.  
  62. '''
  63. STEP 4: INSTANTIATE MODEL CLASS
  64. '''
  65. input_dim = 1
  66. hidden_dim = 100
  67. layer_dim = 3  # ONLY CHANGE IS HERE FROM ONE LAYER TO TWO LAYER
  68. output_dim = 5
  69.  
  70. model = LSTMModel(input_dim, hidden_dim, layer_dim, output_dim)
  71.  
  72. #######################
  73. #  USE GPU FOR MODEL  #
  74. #######################
  75.  
  76. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  77. model.to(device)
  78.  
  79. '''
  80. STEP 5: INSTANTIATE LOSS CLASS
  81. '''
  82. criterion = nn.CrossEntropyLoss()
  83.  
  84. '''
  85. STEP 6: INSTANTIATE OPTIMIZER CLASS
  86. '''
  87. learning_rate = 0.1
  88.  
  89. optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)  
  90.  
  91. '''
  92. STEP 7: TRAIN THE MODEL
  93. '''
  94.  
  95. # Number of steps to unroll
  96. seq_dim = 1100  
  97.  
  98. iter = 0
  99. for epoch in range(num_epochs):
  100.     for i, (images, labels) in enumerate(train_loader):
  101.         # Load images as Variable
  102.         #######################
  103.         #  USE GPU FOR MODEL  #
  104.         #######################
  105.         images = images.view(-1, seq_dim, input_dim).requires_grad_().to(device)
  106.         labels = labels.to(device)
  107.  
  108.         # Clear gradients w.r.t. parameters
  109.         optimizer.zero_grad()
  110.  
  111.         # Forward pass to get output/logits
  112.         # outputs.size() --> 100, 10
  113.         outputs = model(images)
  114.  
  115.         # Calculate Loss: softmax --> cross entropy loss
  116.         print(outputs.shape, labels.shape)
  117.         print(outputs.dtype, labels.dtype)
  118.  
  119.         loss = criterion(outputs, labels)
  120.  
  121.         # Getting gradients w.r.t. parameters
  122.         loss.backward()
  123.  
  124.         # Updating parameters
  125.         optimizer.step()
  126.  
  127.         iter += 1
  128.  
  129.         if iter % 500 == 0:
  130.             # Calculate Accuracy        
  131.             correct = 0
  132.             total = 0
  133.             # Iterate through test dataset
  134.             for images, labels in test_loader:
  135.                 #######################
  136.                 #  USE GPU FOR MODEL  #
  137.                 #######################
  138.                 images = images.view(-1, seq_dim, input_dim).to(device)
  139.                 labels = labels.to(device)
  140.  
  141.                 # Forward pass only to get logits/output
  142.                 outputs = model(images)
  143.  
  144.                 # Get predictions from the maximum value
  145.                 _, predicted = torch.max(outputs.data, 1)
  146.  
  147.                 # Total number of labels
  148.                 total += labels.size(0)
  149.  
  150.                 # Total correct predictions
  151.                 #######################
  152.                 #  USE GPU FOR MODEL  #
  153.                 #######################
  154.                 if torch.cuda.is_available():
  155.                     correct += (predicted.cpu() == labels.cpu()).sum()
  156.                 else:
  157.                     correct += (predicted == labels).sum()
  158.  
  159.             accuracy = 100 * correct / total
  160.  
  161.             # Print Loss
  162.             print('Iteration: {}. Loss: {}. Accuracy: {}'.format(iter, loss.item(), accuracy))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement