You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_loss.py 5.5 kB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. import unittest
  2. import fastNLP.core.loss as loss
  3. import math
  4. import torch as tc
  5. import pdb
  6. class TestLoss(unittest.TestCase):
  7. def test_case_1(self):
  8. #验证nllloss的原理
  9. print (".----------------------------------")
  10. loss_func = loss.Loss("nll")
  11. #pdb.set_trace()
  12. y = tc.Tensor(
  13. [
  14. [.3,.4,.3],
  15. [.5,.3,.2],
  16. [.3,.6,.1],
  17. ]
  18. )
  19. gy = tc.LongTensor(
  20. [
  21. 0,
  22. 1,
  23. 2,
  24. ]
  25. )
  26. y = tc.log(y)
  27. los = loss_func(y , gy)
  28. r = -math.log(.3) - math.log(.3) - math.log(.1)
  29. r /= 3
  30. print ("loss = %f" % (los))
  31. print ("r = %f" % (r))
  32. self.assertEqual(int(los * 1000), int(r * 1000))
  33. def test_case_2(self):
  34. #验证squash()的正确性
  35. print ("----------------------------------")
  36. log = math.log
  37. loss_func = loss.Loss("nll")
  38. #pdb.set_trace()
  39. y = tc.Tensor(
  40. [
  41. [[.3,.4,.3],[.3,.4,.3],],
  42. [[.5,.3,.2],[.1,.2,.7],],
  43. [[.3,.6,.1],[.2,.1,.7],],
  44. ]
  45. )
  46. gy = tc.LongTensor(
  47. [
  48. [0,2],
  49. [1,2],
  50. [2,1],
  51. ]
  52. )
  53. #pdb.set_trace()
  54. y = tc.log(y)
  55. los = loss_func(y , gy)
  56. print ("loss = %f" % (los))
  57. r = -log(.3) - log(.3) - log(.1) - log(.3) - log(.7) - log(.1)
  58. r /= 6
  59. print ("r = %f" % (r))
  60. self.assertEqual(int(los * 1000), int(r * 1000))
  61. def test_case_3(self):
  62. #验证pack_padded_sequence()的正确性
  63. print ("----------------------------------")
  64. log = math.log
  65. loss_func = loss.Loss("nll")
  66. #pdb.set_trace()
  67. y = tc.Tensor(
  68. [
  69. [[.3,.4,.3],[.3,.2,.5],[.4,.5,.1,],],
  70. [[.5,.3,.2],[.1,.2,.7],[.0,.0,.0,],],
  71. [[.3,.6,.1],[.0,.0,.0],[.0,.0,.0,],],
  72. ]
  73. )
  74. gy = tc.LongTensor(
  75. [
  76. [0,2,1,],
  77. [1,2,0,],
  78. [2,0,0,],
  79. ]
  80. )
  81. lens = [3,2,1]
  82. #pdb.set_trace()
  83. y = tc.log(y)
  84. yy = tc.nn.utils.rnn.pack_padded_sequence(y , lens , batch_first = True).data
  85. gyy = tc.nn.utils.rnn.pack_padded_sequence(gy , lens , batch_first = True).data
  86. los = loss_func(yy , gyy)
  87. print ("loss = %f" % (los))
  88. r = -log(.3) - log(.5) - log(.5) - log(.3) - log(.7) - log(.1)
  89. r /= 6
  90. print ("r = %f" % (r))
  91. self.assertEqual(int(los * 1000), int(r * 1000))
  92. def test_case_4(self):
  93. #验证unpad()的正确性
  94. print ("----------------------------------")
  95. log = math.log
  96. #pdb.set_trace()
  97. y = tc.Tensor(
  98. [
  99. [[.3,.4,.3],[.3,.2,.5],[.4,.5,.1,],[.6,.3,.1,],],
  100. [[.5,.3,.2],[.1,.2,.7],[.0,.0,.0,],[.0,.0,.0,],],
  101. [[.3,.6,.1],[.0,.0,.0],[.0,.0,.0,],[.0,.0,.0,],],
  102. ]
  103. )
  104. gy = tc.LongTensor(
  105. [
  106. [0,2,1,2,],
  107. [1,2,0,0,],
  108. [2,0,0,0,],
  109. ]
  110. )
  111. lens = [4,2,1]
  112. #pdb.set_trace()
  113. y = tc.log(y)
  114. loss_func = loss.Loss("nll" , pre_pro = ["unpad"])
  115. los = loss_func(y , gy , lens = lens)
  116. print ("loss = %f" % (los))
  117. r = -log(.1) -log(.3) - log(.5) - log(.5) - log(.3) - log(.7) - log(.1)
  118. r /= 7
  119. print ("r = %f" % (r))
  120. self.assertEqual(int(los * 1000), int(r * 1000))
  121. def test_case_5(self):
  122. #验证mask()和make_mask()的正确性
  123. print ("----------------------------------")
  124. log = math.log
  125. #pdb.set_trace()
  126. y = tc.Tensor(
  127. [
  128. [[.5,.3,.2],[.1,.2,.7],[.0,.0,.0,],[.0,.0,.0,],],
  129. [[.5,.4,.1],[.3,.2,.5],[.4,.5,.1,],[.6,.1,.3,],],
  130. [[.3,.6,.1],[.3,.2,.5],[.0,.0,.0,],[.0,.0,.0,],],
  131. ]
  132. )
  133. gy = tc.LongTensor(
  134. [
  135. [1,2,0,0,],
  136. [0,2,1,2,],
  137. [2,1,0,0,],
  138. ]
  139. )
  140. mask = tc.ByteTensor(
  141. [
  142. [1,1,0,0,],
  143. [1,1,1,1,],
  144. [1,1,0,0,],
  145. ]
  146. )
  147. y = tc.log(y)
  148. lens = [2,4,2]
  149. loss_func = loss.Loss("nll" , pre_pro = ["mask"])
  150. los = loss_func(y , gy , mask = mask)
  151. print ("loss = %f" % (los))
  152. los2 = loss_func(y , gy , mask = loss.make_mask(lens,gy.size()[-1]))
  153. print ("loss2 = %f" % (los2))
  154. r = -log(.3) -log(.7) - log(.5) - log(.5) - log(.5) - log(.3) - log(.1) - log(.2)
  155. r /= 8
  156. print ("r = %f" % (r))
  157. self.assertEqual(int(los * 1000), int(r * 1000))
  158. self.assertEqual(int(los2 * 1000), int(r * 1000))
  159. def test_case_6(self):
  160. #验证unpad_mask()的正确性
  161. print ("----------------------------------")
  162. log = math.log
  163. #pdb.set_trace()
  164. y = tc.Tensor(
  165. [
  166. [[.3,.4,.3],[.3,.2,.5],[.4,.5,.1,],[.6,.3,.1,],],
  167. [[.5,.3,.2],[.1,.2,.7],[.0,.0,.0,],[.0,.0,.0,],],
  168. [[.3,.6,.1],[.0,.0,.0],[.0,.0,.0,],[.0,.0,.0,],],
  169. ]
  170. )
  171. gy = tc.LongTensor(
  172. [
  173. [0,2,1,2,],
  174. [1,2,0,0,],
  175. [2,0,0,0,],
  176. ]
  177. )
  178. lens = [4,2,1]
  179. #pdb.set_trace()
  180. y = tc.log(y)
  181. loss_func = loss.Loss("nll" , pre_pro = ["unpad_mask"])
  182. los = loss_func(y , gy , lens = lens)
  183. print ("loss = %f" % (los))
  184. r = -log(.1) -log(.3) - log(.5) - log(.5) - log(.3) - log(.7) - log(.1)
  185. r /= 7
  186. print ("r = %f" % (r))
  187. self.assertEqual(int(los * 1000), int(r * 1000))
  188. def test_case_7(self):
  189. #验证一些其他东西
  190. print ("----------------------------------")
  191. log = math.log
  192. #pdb.set_trace()
  193. y = tc.Tensor(
  194. [
  195. [[.3,.4,.3],[.3,.2,.5],[.4,.5,.1,],[.6,.3,.1,],],
  196. [[.5,.3,.2],[.1,.2,.7],[.0,.0,.0,],[.0,.0,.0,],],
  197. [[.3,.6,.1],[.0,.0,.0],[.0,.0,.0,],[.0,.0,.0,],],
  198. ]
  199. )
  200. gy = tc.LongTensor(
  201. [
  202. [0,2,1,2,],
  203. [1,2,0,0,],
  204. [2,0,0,0,],
  205. ]
  206. )
  207. lens = [4,2,1]
  208. #pdb.set_trace()
  209. y = tc.log(y)
  210. loss_func = loss.Loss("nll" , pre_pro = [] , weight = tc.Tensor([1,1,0]))
  211. loss_func.add_pre_pro("unpad_mask")
  212. los = loss_func(y , gy , lens = lens)
  213. print ("loss = %f" % (los))
  214. r = - log(.3) - log(.5) - log(.3)
  215. r /= 3
  216. print ("r = %f" % (r))
  217. self.assertEqual(int(los * 1000), int(r * 1000))
  218. if __name__ == "__main__":
  219. unittest.main()