Guest User

Untitled

a guest
Dec 16th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.79 KB | None | 0 0
  1. class FilterLayer(nn.Module):
  2. def __init__(self, filter_size, embedding_size, sequence_length, out_channels=128):
  3. super(FilterLayer, self).__init__()
  4.  
  5. self.model = nn.Sequential(
  6. nn.Conv2d(1, out_channels, (filter_size, embedding_size)),
  7. nn.ReLU(inplace=True),
  8. nn.MaxPool2d((sequence_length - filter_size + 1, 1), stride=1)
  9. )
  10.  
  11. for m in self.modules():
  12. if isinstance(m, nn.Conv2d):
  13. n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
  14. m.weight.data.normal_(0, math.sqrt(2. / n))
  15.  
  16. def forward(self, x):
  17. return self.model(x)
  18.  
  19. class FlatCnnLayer(nn.Module):
  20. def __init__(self, embedding_size, sequence_length, filter_sizes=[3, 4, 5], out_channels=128):
  21. super(FlatCnnLayer, self).__init__()
  22.  
  23. self.filter_layers = nn.ModuleList(
  24. [FilterLayer(filter_size, embedding_size, sequence_length, out_channels=out_channels) for
  25. filter_size in filter_sizes])
  26.  
  27. def forward(self, x):
  28. pools = []
  29. for filter_layer in self.filter_layers:
  30. out_filter = filter_layer(x)
  31. # reshape from (batch_size, out_channels, h, w) to (batch_size, h, w, out_channels)
  32. pools.append(out_filter.view(out_filter.size()[0], 1, 1, -1))
  33. x = torch.cat(pools, dim=3)
  34.  
  35. x = x.view(x.size()[0], -1)
  36. x = F.dropout(x, p=dropout_prob, training=True)
  37.  
  38. return x
  39.  
  40. class TextClassifyCnnNet(nn.Module):
  41. def __init__(self, embedding_size, sequence_length, num_classes, filter_sizes=[3, 4, 5], out_channels=128):
  42. super(TextClassifyCnnNet, self).__init__()
  43.  
  44. self.flat_layer = FlatCnnLayer(embedding_size, sequence_length, filter_sizes=filter_sizes,
  45. out_channels=out_channels)
  46.  
  47. self.model = nn.Sequential(
  48. self.flat_layer,
  49. nn.Linear(out_channels * len(filter_sizes), num_classes)
  50. )
  51.  
  52. def forward(self, x):
  53. x = self.model(x)
  54.  
  55. return x
  56.  
  57.  
  58. def fit(net, data, save_path):
  59. if torch.cuda.is_available():
  60. net = net.cuda()
  61.  
  62. for param in list(net.parameters()):
  63. print(type(param.data), param.size())
  64.  
  65. optimizer = optim.Adam(net.parameters(), lr=0.01, weight_decay=0.1)
  66.  
  67. X_train, X_test = data['X_train'], data['X_test']
  68. Y_train, Y_test = data['Y_train'], data['Y_test']
  69.  
  70. X_valid, Y_valid = data['X_valid'], data['Y_valid']
  71.  
  72. n_batch = len(X_train) // batch_size
  73.  
  74. for epoch in range(1, n_epochs + 1): # loop over the dataset multiple times
  75. net.train()
  76. start = 0
  77. end = batch_size
  78.  
  79. for batch_idx in range(1, n_batch + 1):
  80. # get the inputs
  81. x, y = X_train[start:end], Y_train[start:end]
  82. start = end
  83. end = start + batch_size
  84.  
  85. # zero the parameter gradients
  86. optimizer.zero_grad()
  87.  
  88. # forward + backward + optimize
  89. predicts = _get_predict(net, x)
  90. loss = _get_loss(predicts, y)
  91. loss.backward()
  92. optimizer.step()
  93.  
  94. if batch_idx % display_step == 0:
  95. print('Train Epoch: {} [{}/{} ({:.0f}%)]tLoss: {:.6f}'.format(
  96. epoch, batch_idx * len(x), len(X_train), 100. * batch_idx / (n_batch + 1), loss.data[0]))
  97.  
  98. # print statistics
  99. if epoch % display_step == 0 or epoch == 1:
  100. net.eval()
  101. valid_predicts = _get_predict(net, X_valid)
  102. valid_loss = _get_loss(valid_predicts, Y_valid)
  103. valid_accuracy = _get_accuracy(valid_predicts, Y_valid)
  104. print('r[%d] loss: %.3f - accuracy: %.2f' % (epoch, valid_loss.data[0], valid_accuracy * 100))
  105.  
  106. print('rFinished Trainingn')
  107.  
  108. net.eval()
  109.  
  110. test_predicts = _get_predict(net, X_test)
  111. test_loss = _get_loss(test_predicts, Y_test).data[0]
  112. test_accuracy = _get_accuracy(test_predicts, Y_test)
  113. print('Test loss: %.3f - Test accuracy: %.2f' % (test_loss, test_accuracy * 100))
  114.  
  115. torch.save(net.flat_layer.state_dict(), save_path)
  116.  
  117.  
  118. def _get_accuracy(predicts, labels):
  119. predicts = torch.max(predicts, 1)[1].data[0]
  120. return np.mean(predicts == labels)
  121.  
  122.  
  123. def _get_predict(net, x):
  124. # wrap them in Variable
  125. inputs = torch.from_numpy(x).float()
  126. # convert to cuda tensors if cuda flag is true
  127. if torch.cuda.is_available:
  128. inputs = inputs.cuda()
  129. inputs = Variable(inputs)
  130. return net(inputs)
  131.  
  132.  
  133. def _get_loss(predicts, labels):
  134. labels = torch.from_numpy(labels).long()
  135. # convert to cuda tensors if cuda flag is true
  136. if torch.cuda.is_available:
  137. labels = labels.cuda()
  138. labels = Variable(labels)
  139. return F.cross_entropy(predicts, labels)
  140.  
  141. # optimizer = optim.Adam(net.parameters(), lr=0.01, weight_decay=0.1)
  142. optimizer = optim.Adam(model.parameters(), lr=0.001)
Add Comment
Please, Sign In to add comment