fully_connected_opt_weight_generation.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #!/usr/bin/env python
  2. import numpy as np
  3. def convert_to_x4_q7_weights(weights):
  4. [r, h, w, c] = weights.shape
  5. weights = np.reshape(weights, (r, h*w*c))
  6. num_of_rows = r
  7. num_of_cols = h*w*c
  8. new_weights = np.copy(weights)
  9. new_weights = np.reshape(new_weights, (r*h*w*c))
  10. counter = 0
  11. for i in range(int(num_of_rows)/4):
  12. # we only need to do the re-ordering for every 4 rows
  13. row_base = 4*i
  14. for j in range (int(num_of_cols)/4):
  15. # for each 4 entries
  16. column_base = 4*j
  17. new_weights[counter] = weights[row_base ][column_base ]
  18. new_weights[counter+1] = weights[row_base+1][column_base ]
  19. new_weights[counter+2] = weights[row_base ][column_base+2]
  20. new_weights[counter+3] = weights[row_base+1][column_base+2]
  21. new_weights[counter+4] = weights[row_base+2][column_base ]
  22. new_weights[counter+5] = weights[row_base+3][column_base ]
  23. new_weights[counter+6] = weights[row_base+2][column_base+2]
  24. new_weights[counter+7] = weights[row_base+3][column_base+2]
  25. new_weights[counter+8] = weights[row_base ][column_base+1]
  26. new_weights[counter+9] = weights[row_base+1][column_base+1]
  27. new_weights[counter+10] = weights[row_base ][column_base+3]
  28. new_weights[counter+11] = weights[row_base+1][column_base+3]
  29. new_weights[counter+12] = weights[row_base+2][column_base+1]
  30. new_weights[counter+13] = weights[row_base+3][column_base+1]
  31. new_weights[counter+14] = weights[row_base+2][column_base+3]
  32. new_weights[counter+15] = weights[row_base+3][column_base+3]
  33. counter = counter + 16
  34. # the remaining ones are in order
  35. for j in range((int)(num_of_cols-num_of_cols%4), int(num_of_cols)):
  36. new_weights[counter] = weights[row_base][j]
  37. new_weights[counter+1] = weights[row_base+1][j]
  38. new_weights[counter+2] = weights[row_base+2][j]
  39. new_weights[counter+3] = weights[row_base+3][j]
  40. counter = counter + 4
  41. return new_weights
  42. def convert_to_x4_q15_weights(weights):
  43. [r, h, w, c] = weights.shape
  44. weights = np.reshape(weights, (r, h*w*c))
  45. num_of_rows = r
  46. num_of_cols = h*w*c
  47. new_weights = np.copy(weights)
  48. new_weights = np.reshape(new_weights, (r*h*w*c))
  49. counter = 0
  50. for i in range(int(num_of_rows)/4):
  51. # we only need to do the re-ordering for every 4 rows
  52. row_base = 4*i
  53. for j in range (int(num_of_cols)/2):
  54. # for each 2 entries
  55. column_base = 2*j
  56. new_weights[counter] = weights[row_base ][column_base ]
  57. new_weights[counter+1] = weights[row_base ][column_base+1]
  58. new_weights[counter+2] = weights[row_base+1][column_base ]
  59. new_weights[counter+3] = weights[row_base+1][column_base+1]
  60. new_weights[counter+4] = weights[row_base+2][column_base ]
  61. new_weights[counter+5] = weights[row_base+2][column_base+1]
  62. new_weights[counter+6] = weights[row_base+3][column_base ]
  63. new_weights[counter+7] = weights[row_base+3][column_base+1]
  64. counter = counter + 8
  65. # the remaining ones are in order
  66. for j in range((int)(num_of_cols-num_of_cols%2), int(num_of_cols)):
  67. new_weights[counter] = weights[row_base][j]
  68. new_weights[counter+1] = weights[row_base+1][j]
  69. new_weights[counter+2] = weights[row_base+2][j]
  70. new_weights[counter+3] = weights[row_base+3][j]
  71. counter = counter + 4
  72. return new_weights
  73. def convert_q7_q15_weights(weights):
  74. [r, h, w, c] = weights.shape
  75. weights = np.reshape(weights, (r, h*w*c))
  76. num_of_rows = r
  77. num_of_cols = h*w*c
  78. new_weights = np.copy(weights)
  79. new_weights = np.reshape(new_weights, (r*h*w*c))
  80. counter = 0
  81. for i in range(int(num_of_rows)/4):
  82. # we only need to do the re-ordering for every 4 rows
  83. row_base = 4*i
  84. for j in range (int(num_of_cols)/2):
  85. # for each 2 entries
  86. column_base = 2*j
  87. new_weights[counter] = weights[row_base ][column_base ]
  88. new_weights[counter+1] = weights[row_base+1][column_base ]
  89. new_weights[counter+2] = weights[row_base ][column_base+1]
  90. new_weights[counter+3] = weights[row_base+1][column_base+1]
  91. new_weights[counter+4] = weights[row_base+2][column_base ]
  92. new_weights[counter+5] = weights[row_base+3][column_base ]
  93. new_weights[counter+6] = weights[row_base+2][column_base+1]
  94. new_weights[counter+7] = weights[row_base+3][column_base+1]
  95. counter = counter + 8
  96. # the remaining ones are in order
  97. for j in range((int)(num_of_cols-num_of_cols%2), int(num_of_cols)):
  98. new_weights[counter] = weights[row_base][j]
  99. new_weights[counter+1] = weights[row_base+1][j]
  100. new_weights[counter+2] = weights[row_base+2][j]
  101. new_weights[counter+3] = weights[row_base+3][j]
  102. counter = counter + 4
  103. return new_weights
  104. # input dimensions
  105. vec_dim = 127
  106. row_dim = 127
  107. weight = np.zeros((row_dim,vec_dim), dtype=int)
  108. # generate random inputs
  109. for i in range(row_dim):
  110. for j in range(vec_dim):
  111. weight[i][j] = np.random.randint(256)-128
  112. weight = np.reshape(weight, (row_dim, vec_dim, 1, 1))
  113. outfile = open("../Ref_Implementations/fully_connected_testing_weights.h", "w")
  114. outfile.write("#define IP2_WEIGHT {")
  115. weight.tofile(outfile,sep=",",format="%d")
  116. outfile.write("}\n\n")
  117. new_weight = convert_to_x4_q7_weights(weight)
  118. outfile.write("#define IP4_WEIGHT {")
  119. new_weight.tofile(outfile,sep=",",format="%d")
  120. outfile.write("}\n\n")
  121. new_weight = convert_q7_q15_weights(weight)
  122. outfile.write("#define IP4_q7_q15_WEIGHT {")
  123. new_weight.tofile(outfile,sep=",",format="%d")
  124. outfile.write("}\n\n")
  125. new_weight = convert_to_x4_q15_weights(weight)
  126. outfile.write("#define IP4_WEIGHT_Q15 {")
  127. new_weight.tofile(outfile,sep=",",format="%d")
  128. outfile.write("}\n\n")
  129. outfile.close()