Guest User

Untitled

a guest
Feb 24th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.68 KB | None | 0 0
  1. import numpy as np
  2. from sklearn.model_selection import train_test_split
  3.  
  4. import torch
  5. import torch.nn as nn
  6. from torch.autograd import Variable
  7.  
  8. np.random.seed(1337)
  9.  
  10. MAX_LEN = 30
  11. EMBEDDING_SIZE = 64
  12. BATCH_SIZE = 32
  13. EPOCH = 40
  14. DATA_SIZE = 1000
  15. INPUT_SIZE = 300
  16.  
  17. def batch(tensor, batch_size):
  18. tensor_list = []
  19. length = tensor.shape[0]
  20. i = 0
  21. while True:
  22. if (i+1) * batch_size >= length:
  23. tensor_list.append(tensor[i * batch_size: length])
  24. return tensor_list
  25. tensor_list.append(tensor[i * batch_size: (i+1) * batch_size])
  26. i += 1
  27.  
  28. class Estimator(object):
  29.  
  30. def __init__(self, model):
  31. self.model = model
  32.  
  33. def compile(self, optimizer, loss):
  34. self.optimizer = optimizer
  35. self.loss_f = loss
  36.  
  37. def _fit(self, X_list, y_list):
  38. """
  39. train one epoch
  40. """
  41. loss_list = []
  42. acc_list = []
  43. for X, y in zip(X_list, y_list):
  44. X_v = Variable(torch.from_numpy(np.swapaxes(X,0,1)).float())
  45. y_v = Variable(torch.from_numpy(y).long(), requires_grad=False)
  46.  
  47. self.optimizer.zero_grad()
  48. y_pred = self.model(X_v, self.model.initHidden(X_v.size()[1]))
  49. loss = self.loss_f(y_pred, y_v)
  50. loss.backward()
  51. self.optimizer.step()
  52.  
  53. ## for log
  54. loss_list.append(loss.data[0])
  55. classes = torch.topk(y_pred, 1)[1].data.numpy().flatten()
  56. acc = self._accuracy(classes, y)
  57. acc_list.append(acc)
  58.  
  59. return sum(loss_list) / len(loss_list), sum(acc_list) / len(acc_list)
  60.  
  61. def fit(self, X, y, batch_size=32, nb_epoch=10, validation_data=()):
  62. X_list = batch(X, batch_size)
  63. y_list = batch(y, batch_size)
  64.  
  65. for t in range(1, nb_epoch + 1):
  66. loss, acc = self._fit(X_list, y_list)
  67. val_log = ''
  68. if validation_data:
  69. val_loss, val_acc = self.evaluate(validation_data[0], validation_data[1], batch_size)
  70. val_log = "- val_loss: %06.4f - val_acc: %06.4f" % (val_loss, val_acc)
  71. print("Epoch %s/%s loss: %06.4f - acc: %06.4f %s" % (t, nb_epoch, loss, acc, val_log))
  72.  
  73. def evaluate(self, X, y, batch_size=32):
  74. y_pred = self.predict(X)
  75.  
  76. y_v = Variable(torch.from_numpy(y).long(), requires_grad=False)
  77. loss = self.loss_f(y_pred, y_v)
  78.  
  79. classes = torch.topk(y_pred, 1)[1].data.numpy().flatten()
  80. acc = self._accuracy(classes, y)
  81. return loss.data[0], acc
  82.  
  83. def _accuracy(self, y_pred, y):
  84. return sum(y_pred == y) / y.shape[0]
  85.  
  86. def predict(self, X):
  87. X = Variable(torch.from_numpy(np.swapaxes(X,0,1)).float())
  88. y_pred = self.model(X, self.model.initHidden(X.size()[1]))
  89. return y_pred
  90.  
  91. def predict_classes(self, X):
  92. return torch.topk(self.predict(X), 1)[1].data.numpy().flatten()
  93.  
  94.  
  95.  
  96. class GRU(nn.Module):
  97. def __init__(self, input_size, hidden_size, output_size):
  98. super(GRU, self).__init__()
  99.  
  100. self.hidden_size = hidden_size
  101.  
  102. self.gru = nn.GRU(input_size, hidden_size)
  103. self.linear = nn.Linear(hidden_size, output_size)
  104.  
  105. def forward(self, input, hidden):
  106. _, hn = self.gru(input, hidden)
  107. ## from (1, N, hidden) to (N, hidden)
  108. rearranged = hn.view(hn.size()[1], hn.size(2))
  109. out1 = self.linear(rearranged)
  110. return out1
  111.  
  112. def initHidden(self, N):
  113. return Variable(torch.randn(1, N, self.hidden_size))
  114.  
  115. def main():
  116. class_size = 7
  117.  
  118. ## Fake data
  119. X = np.random.randn(DATA_SIZE * class_size, MAX_LEN, INPUT_SIZE)
  120. y = np.array([i for i in range(class_size) for _ in range(DATA_SIZE)])
  121.  
  122. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2)
  123.  
  124. model = GRU(INPUT_SIZE, EMBEDDING_SIZE, class_size)
  125. clf = Estimator(model)
  126. clf.compile(optimizer=torch.optim.Adam(model.parameters(), lr=1e-4),
  127. loss=nn.CrossEntropyLoss())
  128. clf.fit(X_train, y_train, batch_size=BATCH_SIZE, nb_epoch=EPOCH,
  129. validation_data=(X_test, y_test))
  130. score, acc = clf.evaluate(X_test, y_test)
  131. print('Test score:', score)
  132. print('Test accuracy:', acc)
  133.  
  134. torch.save(model, 'model.pt')
  135.  
  136.  
  137. if __name__ == '__main__':
  138. main()
Add Comment
Please, Sign In to add comment