| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- #!/usr/bin/env python
- import numpy as np
- def convert_to_x4_q7_weights(weights):
- [r, h, w, c] = weights.shape
- weights = np.reshape(weights, (r, h*w*c))
- num_of_rows = r
- num_of_cols = h*w*c
- new_weights = np.copy(weights)
- new_weights = np.reshape(new_weights, (r*h*w*c))
- counter = 0
- for i in range(int(num_of_rows)/4):
- # we only need to do the re-ordering for every 4 rows
- row_base = 4*i
- for j in range (int(num_of_cols)/4):
- # for each 4 entries
- column_base = 4*j
- new_weights[counter] = weights[row_base ][column_base ]
- new_weights[counter+1] = weights[row_base+1][column_base ]
- new_weights[counter+2] = weights[row_base ][column_base+2]
- new_weights[counter+3] = weights[row_base+1][column_base+2]
- new_weights[counter+4] = weights[row_base+2][column_base ]
- new_weights[counter+5] = weights[row_base+3][column_base ]
- new_weights[counter+6] = weights[row_base+2][column_base+2]
- new_weights[counter+7] = weights[row_base+3][column_base+2]
- new_weights[counter+8] = weights[row_base ][column_base+1]
- new_weights[counter+9] = weights[row_base+1][column_base+1]
- new_weights[counter+10] = weights[row_base ][column_base+3]
- new_weights[counter+11] = weights[row_base+1][column_base+3]
- new_weights[counter+12] = weights[row_base+2][column_base+1]
- new_weights[counter+13] = weights[row_base+3][column_base+1]
- new_weights[counter+14] = weights[row_base+2][column_base+3]
- new_weights[counter+15] = weights[row_base+3][column_base+3]
- counter = counter + 16
- # the remaining ones are in order
- for j in range((int)(num_of_cols-num_of_cols%4), int(num_of_cols)):
- new_weights[counter] = weights[row_base][j]
- new_weights[counter+1] = weights[row_base+1][j]
- new_weights[counter+2] = weights[row_base+2][j]
- new_weights[counter+3] = weights[row_base+3][j]
- counter = counter + 4
- return new_weights
- def convert_to_x4_q15_weights(weights):
- [r, h, w, c] = weights.shape
- weights = np.reshape(weights, (r, h*w*c))
- num_of_rows = r
- num_of_cols = h*w*c
- new_weights = np.copy(weights)
- new_weights = np.reshape(new_weights, (r*h*w*c))
- counter = 0
- for i in range(int(num_of_rows)/4):
- # we only need to do the re-ordering for every 4 rows
- row_base = 4*i
- for j in range (int(num_of_cols)/2):
- # for each 2 entries
- column_base = 2*j
- new_weights[counter] = weights[row_base ][column_base ]
- new_weights[counter+1] = weights[row_base ][column_base+1]
- new_weights[counter+2] = weights[row_base+1][column_base ]
- new_weights[counter+3] = weights[row_base+1][column_base+1]
- new_weights[counter+4] = weights[row_base+2][column_base ]
- new_weights[counter+5] = weights[row_base+2][column_base+1]
- new_weights[counter+6] = weights[row_base+3][column_base ]
- new_weights[counter+7] = weights[row_base+3][column_base+1]
- counter = counter + 8
- # the remaining ones are in order
- for j in range((int)(num_of_cols-num_of_cols%2), int(num_of_cols)):
- new_weights[counter] = weights[row_base][j]
- new_weights[counter+1] = weights[row_base+1][j]
- new_weights[counter+2] = weights[row_base+2][j]
- new_weights[counter+3] = weights[row_base+3][j]
- counter = counter + 4
- return new_weights
- def convert_q7_q15_weights(weights):
- [r, h, w, c] = weights.shape
- weights = np.reshape(weights, (r, h*w*c))
- num_of_rows = r
- num_of_cols = h*w*c
- new_weights = np.copy(weights)
- new_weights = np.reshape(new_weights, (r*h*w*c))
- counter = 0
- for i in range(int(num_of_rows)/4):
- # we only need to do the re-ordering for every 4 rows
- row_base = 4*i
- for j in range (int(num_of_cols)/2):
- # for each 2 entries
- column_base = 2*j
- new_weights[counter] = weights[row_base ][column_base ]
- new_weights[counter+1] = weights[row_base+1][column_base ]
- new_weights[counter+2] = weights[row_base ][column_base+1]
- new_weights[counter+3] = weights[row_base+1][column_base+1]
- new_weights[counter+4] = weights[row_base+2][column_base ]
- new_weights[counter+5] = weights[row_base+3][column_base ]
- new_weights[counter+6] = weights[row_base+2][column_base+1]
- new_weights[counter+7] = weights[row_base+3][column_base+1]
- counter = counter + 8
- # the remaining ones are in order
- for j in range((int)(num_of_cols-num_of_cols%2), int(num_of_cols)):
- new_weights[counter] = weights[row_base][j]
- new_weights[counter+1] = weights[row_base+1][j]
- new_weights[counter+2] = weights[row_base+2][j]
- new_weights[counter+3] = weights[row_base+3][j]
- counter = counter + 4
- return new_weights
- # input dimensions
- vec_dim = 127
- row_dim = 127
- weight = np.zeros((row_dim,vec_dim), dtype=int)
- # generate random inputs
- for i in range(row_dim):
- for j in range(vec_dim):
- weight[i][j] = np.random.randint(256)-128
- weight = np.reshape(weight, (row_dim, vec_dim, 1, 1))
- outfile = open("../Ref_Implementations/fully_connected_testing_weights.h", "w")
- outfile.write("#define IP2_WEIGHT {")
- weight.tofile(outfile,sep=",",format="%d")
- outfile.write("}\n\n")
- new_weight = convert_to_x4_q7_weights(weight)
- outfile.write("#define IP4_WEIGHT {")
- new_weight.tofile(outfile,sep=",",format="%d")
- outfile.write("}\n\n")
- new_weight = convert_q7_q15_weights(weight)
- outfile.write("#define IP4_q7_q15_WEIGHT {")
- new_weight.tofile(outfile,sep=",",format="%d")
- outfile.write("}\n\n")
- new_weight = convert_to_x4_q15_weights(weight)
- outfile.write("#define IP4_WEIGHT_Q15 {")
- new_weight.tofile(outfile,sep=",",format="%d")
- outfile.write("}\n\n")
- outfile.close()
|