Guest User

Untitled

a guest
Mar 19th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.51 KB | None | 0 0
  1. # Network
  2. class HierarchicalConvnet(gluon.HybridBlock):
  3. def __init__(self, embedding_len, embedding_dim, num_channels, **kwargs):
  4. super(HierarchicalConvnet, self).__init__(**kwargs)
  5.  
  6. with self.name_scope():
  7.  
  8. self.embedder = gluon.nn.Embedding(embedding_len, embedding_dim)
  9.  
  10. self.net_1 = gluon.nn.Conv1D(channels=num_channels, kernel_size=3, strides=1, padding=1,
  11. in_channels=embedding_dim, use_bias=True, activation='relu')
  12.  
  13. self.net_2 = gluon.nn.Conv1D(channels=num_channels, kernel_size=3, strides=1, padding=1,
  14. in_channels=num_channels, use_bias=True, activation='relu')
  15.  
  16. self.net_3 = gluon.nn.Conv1D(channels=num_channels, kernel_size=3, strides=1, padding=1,
  17. in_channels=num_channels, use_bias=True, activation='relu')
  18.  
  19. self.net_4 = gluon.nn.Conv1D(channels=num_channels, kernel_size=3, strides=1, padding=1,
  20. in_channels=num_channels, use_bias=True, activation='relu')
  21.  
  22. def embedding_initialize(self, glove_embedding):
  23. self.embedder.weight.set_data(glove_embedding.idx_to_vec)
  24.  
  25. def hybrid_forward(self, F, sent):
  26. sent_embed = self.embedder(sent)
  27. sent = F.swapaxes(sent_embed, 1, 2)
  28. sent = self.net_1(sent)
  29. pooled_1 = F.max(sent, axis=2) # gives dimension NC
  30. sent = self.net_2(sent)
  31. pooled_2 = F.max(sent, axis=2)
  32. sent = self.net_3(sent)
  33. pooled_3 = F.max(sent, axis=2)
  34. sent = self.net_4(sent)
  35. pooled_4 = F.max(sent, axis=2)
  36. return F.concat(pooled_1, pooled_2, pooled_3, pooled_4, dim=1) # dimension is N X 4C
  37.  
  38.  
  39. def build_mlp_classifier():
  40. net = gluon.nn.HybridSequential(prefix='mlp_')
  41. num_fc_1 = 512
  42. num_outputs = 3
  43. with net.name_scope():
  44. net.add(gluon.nn.Dense(num_fc_1, use_bias=True, activation='tanh'))
  45. net.add(gluon.nn.Dense(num_fc_1, use_bias=True, activation='tanh'))
  46. net.add(gluon.nn.Dense(num_outputs))
  47. return net
  48.  
  49.  
  50. class SiameseNet(gluon.HybridBlock):
  51. def __init__(self, glove_embedding_len, glove_embedding_dim, num_channels, **kwargs):
  52. super(SiameseNet, self).__init__(**kwargs)
  53. with self.name_scope():
  54. self.encoder = HierarchicalConvnet(glove_embedding_len, glove_embedding_dim, num_channels, prefix='hcl_')
  55. self.classifier = build_mlp_classifier()
  56.  
  57. def hybrid_forward(self, F, sent_1, sent_2):
  58. e_1 = self.encoder(sent_1)
  59. e_2 = self.encoder(sent_2)
  60. features = F.concat(e_1, e_2, F.abs(e_1 - e_2), (e_1 * e_2), dim=1)
  61. output = self.classifier(features)
  62. return output
  63.  
  64. def encode(self, sent_1):
  65. emb = self.encoder(sent_1)
  66. return emb
  67.  
  68. #Training code Blob
  69. ctx = [mx.gpu(i + params.gpu_offset) for i in range(params.num_gpu)]
  70. # Other parameters from argparse......
  71. kv = mx.kv.create('device')
  72.  
  73. data_iter = get_data_iter() # dummy function, can provide actual implementation if needed
  74.  
  75. pretrained_embedding = text.embedding.create('glove', pretrained_file_name='glove.840B.300d.txt', vocabulary=src_vocab)
  76.  
  77. net = SiameseNet(len(pretrained_embedding), pretrained_embedding.vec_len, params.num_channels)
  78. net.hybridize()
  79. net.collect_params().initialize(mx.init.Xavier(), ctx=ctx)
  80. net.encoder.embedding_initialize(pretrained_embedding)
  81.  
  82. trainer = gluon.Trainer(net.collect_params(), 'adam', {'learning_rate': learning_rate}, kvstore=kv)
  83.  
  84. epochs = params.epochs
  85. softmax_loss = gluon.loss.SoftmaxCrossEntropyLoss()
  86.  
  87. for epoch in range(epochs):
  88. for i, batch in enumerate(train_iter):
  89. total_loss_sum = 0.0
  90. data_1 = gluon.utils.split_and_load(batch.data[0], ctx_list=ctx, batch_axis=0)
  91. data_2 = gluon.utils.split_and_load(batch.data[1], ctx_list=ctx, batch_axis=0)
  92. label = gluon.utils.split_and_load(batch.label[0], ctx_list=ctx, batch_axis=0)
  93. Ls = []
  94. outputs = []
  95. for data_x, data_y, data_z in zip(data_1, data_2, label):
  96. with autograd.record():
  97. output = net(data_x, data_y)
  98. loss = softmax_loss(output, data_z)
  99. Ls.append(loss)
  100. outputs.append(output)
  101. total_loss_sum += nd.sum(loss).asscalar()
  102.  
  103. for L in Ls:
  104. L.backward()
  105. trainer.step(mini_batch_size)
  106. metric.update(label, outputs)
  107.  
  108. name, val_acc = evaluate_accuracy(ctx, valid_iter, net)
Add Comment
Please, Sign In to add comment