@@ -6,319 +6,234 @@ void _cnn_run(){
isrun = 1 ;
}
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> ô<EFBFBD> ӡ<EFBFBD> <D3A1> <EFBFBD> <EFBFBD> */
/// @brief <20> <> ӡͼ<D3A1> <CDBC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/// @param array <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
/// @param array_num <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ܵĸ<DCB5> <C4B8> <EFBFBD>
/// @param elements_per_line ÿһ <C3BF> е ĸ<D0B5> <C4B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Զ<EFBFBD> <D4B6> <EFBFBD> <EFBFBD> <EFBFBD>
void PrintfArray ( float * array , int array_num , int elements_per_line )
{
for ( int i = 0 ; i < array_num ; i + + )
{
printf ( " %f " , array [ i ] ) ; // <20> <> ӡ<EFBFBD> <D3A1> ǰԪ<C7B0> <D4AA>
// ÿ<> <C3BF> ӡ<EFBFBD> <D3A1> ָ<EFBFBD> <D6B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> غ<EFBFBD> <D8BA> <EFBFBD> <EFBFBD> <EFBFBD>
if ( ( i + 1 ) % elements_per_line = = 0 )
{
printf ( " \n " ) ;
void print_rslt ( float * rslt , u8 input_matrix_length , u32 length ) {
int _tmp = 0 ;
printf ( " [0:0] " ) ;
for ( int i = 0 ; i < length ; i + + ) {
printf ( " %f " , rslt [ i ] ) ;
if ( ( i + 1 ) % input_matrix_length = = 0 ) {
printf ( " \n [%d:%d] " , + + _tmp , i + 1 ) ;
}
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> Ԫ<EFBFBD> ز<EFBFBD> <D8B2> 㣬<EFBFBD> ֶ<EFBFBD> <D6B6> <EFBFBD> <EFBFBD> <EFBFBD>
if ( array_num % elements_per_line ! = 0 )
{
printf ( " \n " ) ;
}
printf ( " \r \n " ) ;
}
void PrintfResArray ( float * array , int array_num , int elements_per_line )
{
for ( int i = 0 ; i < array_num ; i + + )
{
printf ( " %f " , array [ i ] ) ; // <20> <> ӡ<EFBFBD> <D3A1> ǰԪ<C7B0> <D4AA>
// ÿ<> <C3BF> ӡ<EFBFBD> <D3A1> ָ<EFBFBD> <D6B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> غ<EFBFBD> <D8BA> <EFBFBD> <EFBFBD> <EFBFBD>
if ( ( i + 1 ) % elements_per_line = = 0 )
{
printf ( " \t " ) ;
// <20> <> ԭʼ <D4AD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƶ<EFBFBD> <C6B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ľ<EFBFBD> <C4BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
float * expand ( const float * old_matrix , int old_matrix_length , int layer ) {
float * new_matrix = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * layer * ( old_matrix_length + 2 ) * ( old_matrix_length + 2 ) ) ;
memset ( new_matrix , 0 , sizeof ( float ) * layer * ( old_matrix_length + 2 ) * ( old_matrix_length + 2 ) ) ;
for ( int l = 0 ; l < layer ; l + + ) {
for ( int i = 0 ; i < old_matrix_length ; i + + ) {
for ( int j = 0 ; j < old_matrix_length ; j + + ) {
new_matrix [ ( i + 1 ) * ( old_matrix_length + 2 ) + ( j + 1 ) +
l * ( old_matrix_length + 2 ) * ( old_matrix_length + 2 ) ]
= old_matrix [ i * old_matrix_length + j +
l * ( old_matrix_length ) * ( old_matrix_length ) ] ;
}
}
}
return new_matrix ;
}
//model ģ<> <C4A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
//input_matrix <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
//input_matrix_length <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ı ߳<C4B1> <DFB3> <EFBFBD> 102
//c_rl <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ı ߳<C4B1> <DFB3> <EFBFBD> 100
//<2F> <> <EFBFBD> ؾ<EFBFBD> <D8BE> <EFBFBD> <EFBFBD> Ľ<EFBFBD> <C4BD> <EFBFBD>
float * convolution ( Model model_w , Model model_b , const float * input_matrix , int input_matrix_length ) {
// <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
int im_l = input_matrix_length ;
int cr_l = input_matrix_length - 2 ;
float conv_temp ; // <20> <> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڴ洢<DAB4> <E6B4A2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> м<EFBFBD> <D0BC> <EFBFBD> <EFBFBD> <EFBFBD>
//<2F> <> <EFBFBD> ںϲ <DABA> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> 飬<EFBFBD> <E9A3AC> <EFBFBD> <EFBFBD> 32*64*50*50(<28> ڶ<EFBFBD> <DAB6> <EFBFBD> )<29> Ĵ<EFBFBD> С
float * _conv_rlst = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * model_w . channel * model_w . num_kernels * ( cr_l * cr_l ) ) ;
memset ( _conv_rlst , 0 , sizeof ( float ) * model_w . channel * model_w . num_kernels * ( cr_l * cr_l ) ) ;
//<2F> <> ͼ<EFBFBD> ϲ <EFBFBD> <CFB2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
float * conv_rlst = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * model_w . num_kernels * ( cr_l * cr_l ) ) ;
memset ( conv_rlst , 0 , sizeof ( float ) * model_w . num_kernels * ( cr_l * cr_l ) ) ;
/*<2A> <> ά <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ָ <EFBFBD> <EFBFBD> */
/// @brief <20> <> ̬<EFBFBD> <CCAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ά<EFBFBD> <CEAC> <EFBFBD> 飬<EFBFBD> <E9A3AC> <EFBFBD> <EFBFBD> ΪelementSize
/// @param depth <20> <> ά<EFBFBD> <CEAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȣ <EFBFBD> <C8A3> <EFBFBD> a[depth][]
/// @param num <20> <> <EFBFBD> ȣ <EFBFBD> <C8A3> <EFBFBD> a[][num]
/// @param elementSize <20> <> ά<EFBFBD> <CEAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
void * * allocate2DArray ( int depth , int num , size_t elementSize )
{
void * * array = ( void * * ) mymalloc ( SRAMEX , depth * sizeof ( void * ) ) ;
for ( int d = 0 ; d < depth ; d + + )
{
array [ d ] = mymalloc ( SRAMEX , num * elementSize ) ;
}
return array ;
}
/// @brief <20> ͷ<EFBFBD> ͨ<EFBFBD> <CDA8> allocate2DArray<61> <79> <EFBFBD> <EFBFBD> <EFBFBD> Ķ<EFBFBD> ά<EFBFBD> <CEAC> <EFBFBD> <EFBFBD>
/// @param array <20> <> ά<EFBFBD> <CEAC> <EFBFBD> <EFBFBD>
/// @param depth <20> <> <EFBFBD> <EFBFBD>
void free2DArray ( float * * array , int depth )
{
for ( int d = 0 ; d < depth ; d + + )
{
myfree ( SRAMEX , array [ d ] ) ;
}
myfree ( SRAMEX , array ) ;
}
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> غ<EFBFBD> <D8BA> <EFBFBD> */
/// @brief <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0<EFBFBD> <30> <EFBFBD> <EFBFBD>
/// @param inputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
/// @param input_size <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ĵ<EFBFBD> <C4B5> е <EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 磺100<30> <30> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> 100<30> <30> Ԫ<EFBFBD> <D4AA>
/// @param outputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
void Full ( float * inputArray , int input_size , float * outputArray )
{
int i , j ;
for ( i = 0 ; i < ( ( input_size + 2 ) * ( input_size + 2 ) ) ; i + + )
{
outputArray [ i ] = 0 ;
}
for ( i = 0 ; i < input_size ; i + + )
{
for ( j = 0 ; j < input_size ; j + + )
{
outputArray [ ( i + 1 ) * ( input_size + 2 ) + ( j + 1 ) ] = inputArray [ i * input_size + j ] ;
// <20> <> <EFBFBD> <EFBFBD> 30 <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˣ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 30<EFBFBD> <EFBFBD> ͨ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
for ( int c = 0 ; c < model_w . channel ; c + + ) {
for ( int k = 0 ; k < model_w . num_kernels ; k + + ) {
for ( int row = 0 ; row < cr_l ; row + + ) {
for ( int col = 0 ; col < cr_l ; col + + ) {
conv_temp = 0 ; // ÿ<> <C3BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> س<EFBFBD> ʼ <EFBFBD> <CABC> Ϊ0
// <20> <> <EFBFBD> <EFBFBD> 3x3<78> ľ<EFBFBD> <C4BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
for ( int x = 0 ; x < 3 ; x + + ) {
for ( int y = 0 ; y < 3 ; y + + ) {
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> Ķ<EFBFBD> Ӧ<EFBFBD> <D3A6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ȩ<EFBFBD> <C8A8> <EFBFBD> <EFBFBD> <EFBFBD> ˣ<EFBFBD> <CBA3> <EFBFBD> <EFBFBD> ۼӵ<DBBC> conv_temp
conv_temp + = input_matrix [ ( c * im_l * im_l ) + ( row * ( im_l ) + col ) + ( x * ( im_l ) + y ) ]
* model_w . array [ ( ( c + k * model_w . channel ) * 3 * 3 ) + ( x * 3 + y ) ] ;
}
}
_conv_rlst [ ( c * model_w . num_kernels * cr_l * cr_l ) + ( k * cr_l * cr_l ) + ( row * cr_l + col ) ] = conv_temp ;
}
}
}
}
//<2F> ϲ <EFBFBD> <CFB2> <EFBFBD> ͼ
{
for ( int k = 0 ; k < model_w . num_kernels ; k + + ) {
for ( int row = 0 ; row < cr_l ; row + + ) {
for ( int col = 0 ; col < cr_l ; col + + ) {
conv_temp = 0 ; // ÿ<> <C3BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> س<EFBFBD> ʼ <EFBFBD> <CABC> Ϊ0
for ( int c = 0 ; c < model_w . channel ; c + + ) {
conv_temp + = _conv_rlst [ ( c * model_w . num_kernels * cr_l * cr_l ) + ( k * cr_l * cr_l ) + ( row * cr_l + col ) ] ;
}
// <20> <> <EFBFBD> ϶<EFBFBD> Ӧ<EFBFBD> <D3A6> <EFBFBD> <EFBFBD> <EFBFBD> ˵<EFBFBD> ƫ<EFBFBD> <C6AB>
conv_temp + = model_b . array [ k ] ;
// <20> <> <EFBFBD> <EFBFBD> <EEBAAF> <EFBFBD> <EFBFBD> ReLU<4C> <55> <EFBFBD> <EFBFBD> С <EFBFBD> <D0A1> 0<EFBFBD> <30> ֵ<EFBFBD> <D6B5> Ϊ0<CEAA> <30>
if ( conv_temp > 0 )
conv_rlst [ ( k * ( cr_l * cr_l ) ) + ( row * cr_l ) + ( col ) ] = conv_temp ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0<EFBFBD> <30> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
else
conv_rlst [ ( k * ( cr_l * cr_l ) ) + ( row * cr_l ) + ( col ) ] = 0 ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0
}
}
}
}
myfree ( SRAMEX , _conv_rlst ) ;
return conv_rlst ;
}
/// @brief <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> <EFBFBD> <EFBFBD> г ػ<D0B3> <D8BB> <EFBFBD> ѡ ȡkernel_size*kernel_size<7A> ķ<EFBFBD> Χ <EFBFBD> <CEA7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊstep
/// @param inputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <EFBFBD>
/// @param input_size <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ĵ<EFBFBD> <C4B5> е <EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD>
/// @param kernel_size <20> ػ<EFBFBD> <D8BB> ˵ĵ<CBB5> <C4B5> е <EFBFBD> Ԫ<EFBFBD> ظ <EFBFBD> <EFBFBD> <EFBFBD>
/// @param step <20> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
/// @param outputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
void Pooling ( float * inputArray , int input_size ,
int kernel_size , unsigned int step ,
float * outputArray )
{
int output_size = ( input_size - kernel_size ) / step + 1 ;
for ( int i = 0 ; i < output_size ; i + + )
//num_kernels <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ˵ĸ<CBB5> <C4B8> <EFBFBD> <EFBFBD> <EFBFBD> 32
//area <20> ػ<EFBFBD> <D8BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 2*2
//input_matrix <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <EFBFBD>
//input_matrix_length <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ı ߳<C4B1> <DFB3> <EFBFBD> 100
//<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <EFBFBD> <EFBFBD> ı ߳<EFBFBD> <EFBFBD> <EFBFBD> 50
//<EFBFBD> <EFBFBD> <EFBFBD> سػ<EFBFBD> <EFBFBD> Ľ<EFBFBD> <EFBFBD> <EFBFBD>
float * pooling ( Model model_w , const float * input_matrix , u8 input_matrix_length ) {
u8 im_l = input_matrix_length ;
float pool_temp = 0 ; // <20> <> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڴ洢<DAB4> ػ<EFBFBD> <D8BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
float * pool_rslt = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * model_w . num_kernels * im_l * im_l ) ;
memset ( pool_rslt , 0 , sizeof ( float ) * model_w . num_kernels * im_l * im_l ) ;
// <20> <> <EFBFBD> <EFBFBD> 30<33> <30> ͨ<EFBFBD> <CDA8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC>
for ( u8 n = 0 ; n < model_w . num_kernels ; n + + )
{
for ( int j = 0 ; j < output_size ; j + + )
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> <EFBFBD> ÿһ <C3BF> У <EFBFBD> <D0A3> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ2<CEAA> <32> 2x2<78> ijػ<C4B3> <D8BB> <EFBFBD> <EFBFBD> ڣ<EFBFBD>
for ( u8 row = 0 ; row < im_l ; row = row + 2 )
{
float max_value = 0 ;
for ( int m = 0 ; m < kernel_size ; m + + )
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> <EFBFBD> ÿһ <C3BF> У <EFBFBD> <D0A3> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ2
for ( u8 col = 0 ; col < im_l ; col = col + 2 )
{
for ( int n = 0 ; n < kernel_size ; n + + )
pool_temp = 0 ; // ÿ<> <C3BF> <EFBFBD> ػ<EFBFBD> <D8BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> ʼ <EFBFBD> <CABC> Ϊ0
// <20> <> <EFBFBD> <EFBFBD> 2x2<78> <32> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ػ<EFBFBD> <D8BB> <EFBFBD> <EFBFBD> <EFBFBD>
for ( u8 x = 0 ; x < 2 ; x + + )
{
int input_row = i * step + m ;
int input_col = j * step + n ;
int input_idx = input_row * input_size + input_col ;
if ( inputArray [ input_idx ] > max_value )
for ( u8 y = 0 ; y < 2 ; y + + )
{
max_value = inputArray [ input_idx ] ;
// <20> <> <EFBFBD> µ<EFBFBD> ǰ<EFBFBD> ػ<EFBFBD> <D8BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
if ( pool_temp < = input_matrix [ row * im_l + col + x * im_l + y + n * ( im_l * im_l ) ] )
pool_temp = input_matrix [ row * im_l + col + x * im_l + y + n * ( im_l * im_l ) ] ;
}
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD> <EFBFBD> ػ<EFBFBD> <D8BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
pool_rslt [ ( row / 2 ) * ( im_l / 2 ) + col / 2 + n * ( ( im_l / 2 ) * ( im_l / 2 ) ) ] = pool_temp ;
}
int output_idx = i * output_size + j ;
outputArray [ output_idx ] = max_value ;
}
}
return pool_rslt ;
}
/// @brief <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> <EFBFBD> <EFBFBD> о <EFBFBD> <D0BE> <EFBFBD> <EFBFBD> <EFBFBD> ѡ ȡkernel_size*kernel_size<7A> ķ<EFBFBD> Χ <EFBFBD> <CEA7> <EFBFBD> <EFBFBD> <EFBFBD> ﲽ<EFBFBD> <EFB2BD> Ϊ1
/// @param inputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ <EFBFBD> <EFBFBD>
/// @param input_size <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ĵ<EFBFBD> <C4B5> е <EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD>
/// @param kernel <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ľ<EFBFBD> <C4BE> <EFBFBD> <EFBFBD> ˣ<EFBFBD> <CBA3> <EFBFBD> kernel_size * kernel_size<7A> ľ<EFBFBD> <C4BE> <EFBFBD> <EFBFBD> ˲<EFBFBD> <CBB2> <EFBFBD>
/// @param kernel_size <20> ػ<EFBFBD> <D8BB> ˵ĵ<CBB5> <C4B5> е <EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD>
/// @param outputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
void Convolution ( float * inputArray , int input_size ,
float * kernel , int kernel_size ,
float * outputArray )
{
int i , j , m , n ;
int half_k = kernel_size / 2 ;
int output_size = input_size - 2 * half_k ;
float * hidden ( const float * input_matrix ) {
float affine1_temp ; // <20> <> ʱ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڴ洢ȫ<EFBFBD> <EFBFBD> <EFBFBD> Ӳ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> м<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
float * affine1_rslt = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * 128 ) ;
memset ( affine1_rslt , 0 , sizeof ( float ) * 128 ) ;
for ( i = half_k ; i < input_size - half_k ; i + + )
// <20> <> <EFBFBD> <EFBFBD> 128<32> <38> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ز<EFBFBD> <D8B2> <EFBFBD> 128<32> <38> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA>
for ( u8 n = 0 ; n < 128 ; n + + )
{
for ( j = half_k ; j < input_size - half_k ; j + + )
affine1_temp = 0 ; // ÿ<> <C3BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> Ϊ0
// <20> <> <EFBFBD> о <EFBFBD> <D0BE> <EFBFBD> <EFBFBD> ˷<EFBFBD> <CBB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ػ<EFBFBD> <D8BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> չƽ Ϊһ ά<D2BB> <CEAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȫ<EFBFBD> <C8AB> <EFBFBD> Ӳ<EFBFBD> Ȩ<EFBFBD> ؽ<EFBFBD> <D8BD> е <EFBFBD> <D0B5> <EFBFBD>
for ( int i = 0 ; i < ( 128 * 12 * 12 ) ; i + + )
{
float sum = 0 ;
for ( m = 0 ; m < kernel_size ; m + + )
{
for ( n = 0 ; n < kernel_size ; n + + )
{
int input_row = i + m - half_k ;
int input_col = j + n - half_k ;
int input_idx = input_row * input_size + input_col ;
int kernel_idx = m * kernel_size + n ;
sum + = inputArray [ input_idx ] * kernel [ kernel_idx ] ;
}
}
int output_idx = ( i - half_k ) * output_size + ( j - half_k ) ;
outputArray [ output_idx ] = sum ;
affine1_temp = affine1_temp + input_matrix [ i ] * fc1_weight . array [ i + ( 128 * 12 * 12 ) * n ] ;
}
// <20> <> <EFBFBD> ϶<EFBFBD> Ӧ<EFBFBD> <D3A6> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> ƫ<EFBFBD> <C6AB>
affine1_temp = affine1_temp + fc1_bias . array [ n ] ;
// <20> <> <EFBFBD> <EFBFBD> <EEBAAF> <EFBFBD> <EFBFBD> ReLU<4C> <55> <EFBFBD> <EFBFBD> С <EFBFBD> <D0A1> 0<EFBFBD> <30> ֵ<EFBFBD> <D6B5> Ϊ0<CEAA> <30>
if ( affine1_temp > 0 )
affine1_rslt [ n ] = affine1_temp ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0<EFBFBD> <30> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
else
affine1_rslt [ n ] = 0 ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0
}
// print_rslt(affine1_rslt,1,128);
return affine1_rslt ;
}
/// @brief <20> Զ<EFBFBD> ά<EFBFBD> <CEAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϲ <EFBFBD> <CFB2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ӧλ<D3A6> <CEBB> <EFBFBD> <EFBFBD>
/// @param inputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ <EFBFBD> <EFBFBD>
/// @param input_depth <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȣ <EFBFBD> <C8A3> <EFBFBD> a[input_depth][]
/// @param input_size <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ĵ<EFBFBD> <C4B5> е <EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD>
/// @param outputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
void Combine ( float * * inputArray , int input_depth , int input_size , float * outputArray )
{
int i , j , k ;
int input_idx ;
float * output ( const float * input_matrix ) {
float affine2_temp ; // <20> <> ʱ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڴ洢<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> м<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
float * affine2_rslt = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * 7 ) ;
memset ( affine2_rslt , 0 , sizeof ( float ) * 7 ) ;
for ( i = 0 ; i < input_size ; i + + )
// <20> Ƚ<EFBFBD> <C8BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
float temp = - 100 ; // <20> <> <EFBFBD> ڴ洢<DAB4> <E6B4A2> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> Ϊһ <CEAA> <D2BB> <EFBFBD> dz<EFBFBD> С <EFBFBD> <D0A1> ֵ
int predict_num ; // <20> <> <EFBFBD> ڴ洢Ԥ<E6B4A2> <D4A4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֣<EFBFBD> <D6A3> <EFBFBD> Ӧ<EFBFBD> <D3A6> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// <20> <> <EFBFBD> <EFBFBD> 10<31> <30> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 10<31> <30> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
for ( int n = 0 ; n < 7 ; n + + )
{
for ( j = 0 ; j < input_size ; j + + )
affine2_temp = 0 ; // <20> <> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> Ϊ0
// <20> <> <EFBFBD> о <EFBFBD> <D0BE> <EFBFBD> <EFBFBD> ˷<EFBFBD> <CBB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ز<EFBFBD> <D8B2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ȩ<EFBFBD> ؽ<EFBFBD> <D8BD> е <EFBFBD> <D0B5> <EFBFBD>
for ( int i = 0 ; i < 128 ; i + + )
{
float sum = 0 ;
input_idx = i * input_size + j ;
for ( k = 0 ; k < input_depth ; k + + )
{
sum + = inputArray [ k ] [ input_idx ] ;
}
outputArray [ i * input_size + j ] = sum ;
affine2_temp = affine2_temp + fc2_weight . array [ i + 128 * n ] * input_matrix [ i ] ;
}
}
}
/// @brief չ<> <D5B9> <EFBFBD> <EFBFBD> ά<EFBFBD> <CEAC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ ά <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/// @param inputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
/// @param input_depth <20> <> <EFBFBD> <EFBFBD> ͼ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȣ <EFBFBD> <EFBFBD> <EFBFBD> a[input_depth][]
/// @param input_size <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ĵ<EFBFBD> <C4B5> е <EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD>
/// @param outputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <EFBFBD>
void Flatten2D ( float * * inputArray , int input_depth , int input_size , float * outputArray )
{
int i , j , k ;
for ( k = 0 ; k < input_depth ; k + + )
{
for ( i = 0 ; i < input_size ; i + + )
// <20> <> <EFBFBD> ϶<EFBFBD> Ӧ<EFBFBD> <D3A6> <EFBFBD> <EFBFBD> Ԫ <EFBFBD> <EFBFBD> ƫ <EFBFBD> <EFBFBD>
affine2_temp = affine2_temp + fc2_weight . array [ n ] ;
affine2_rslt [ n ] = affine2_temp ; // <20> 洢 <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ľ <EFBFBD> <EFBFBD> <EFBFBD>
// Ѱ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
if ( temp < = affine2_rslt [ n ] )
{
for ( j = 0 ; j < input_size ; j + + )
{
int input_idx = i * input_size + j ;
outputArray [ k * input_size * input_size + input_idx ] = inputArray [ k ] [ input_idx ] ;
}
temp = affine2_rslt [ n ] ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
predict_num = n ; // <20> <> ¼<EFBFBD> <C2BC> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> Ӧ<EFBFBD> <D3A6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
}
print_rslt ( affine2_rslt , 7 , 7 ) ;
printf ( " Label is:%d \r \n " , predict_num + 1 ) ;
return affine2_rslt ;
}
/// @brief <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> <EFBFBD> ÿһ λ<D2BB> <CEBB> <EFBFBD> <EFBFBD> ƫ<EFBFBD> <C6AB>
/// @param inputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
/// @param input_num <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ܵ<EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD>
/// @param bias ƫ<> ú<EFBFBD>
/// @param outputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
void AddBias ( float * inputArray , int input_num , float bias , float * outputArray )
{
for ( int i = 0 ; i < input_num ; i + + )
{
outputArray [ i ] = inputArray [ i ] + bias ;
}
}
/// @brief ȫ<> <C8AB> <EFBFBD> Ӳ<EFBFBD> <D3B2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> <D4AA> ȫ<EFBFBD> <C8AB> <EFBFBD> <EFBFBD>
/// @param inputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
/// @param input_num <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ܵ<EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD>
/// @param input_w <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ȩ<EFBFBD> غ<EFBFBD>
/// @param input_b <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƫ<EFBFBD> ú<EFBFBD>
/// @return һ <> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> Ľ<EFBFBD> <C4BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊfloat
float ConnectedLayer ( float * inputArray , int input_num ,
float * input_w , float input_b )
void calculate_statistics ( Model model , float * value )
{
int i ;
value [ 0 ] = fabsf ( model . array [ 0 ] ) ;
float sum = 0 ;
for ( i = 0 ; i < input_num ; i + + )
{
sum + = inputArray [ i ] * input_w [ i ] ;
}
sum = sum + input_b ;
return sum ;
}
float sum_sq = 0 ;
/// @brief ReLU<4C> <55> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˺<EFBFBD> <CBBA> <EFBFBD> <EFBFBD> Ƕ<EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EEA3BA> ֵ<EFBFBD> <D6B5> <EFBFBD> ڵ<EFBFBD> <DAB5> <EFBFBD> 0<EFBFBD> <30> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0
/// @param inputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC>
/// @param num <20> <> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ܵ<EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD>
/// @param outputArray <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ľ<EFBFBD> <C4BE> <EFBFBD>
void ReLU1 ( float * inputArray , int num , float * outputArray )
{
for ( int i = 0 ; i < num ; i + + ) {
outputArray [ i ] = ( inputArray [ i ] > 0 ) ? inputArray [ i ] : 0 ;
}
}
for ( int i = 0 ; i < model . maxlength ; i + + ) {
float abs_val = fabsf ( model . array [ i ] ) ;
/// @brief ReLU<4C> <55> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˺<EFBFBD> <CBBA> <EFBFBD> <EFBFBD> Ƕ<EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EEA3BA> ֵ<EFBFBD> <D6B5> <EFBFBD> ڵ<EFBFBD> <DAB5> <EFBFBD> 0<EFBFBD> <30> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0
/// @param data <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/// @return <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊfloat
float ReLU2 ( float data )
{
if ( data > 0 ) {
return data ;
}
else {
return 0 ;
}
}
//<2F> <> <EFBFBD> <EFBFBD> ֵ
/// @brief <20> <> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƽ <EFBFBD> <C6BD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ<EFBFBD> ͱ<EFBFBD> <EFBFBD> <D7BC>
/// @param arr <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/// @param size <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ij<EFBFBD> <C4B3> <EFBFBD>
/// @param max_val <20> <> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD>
/// @param mean ƽ <> <C6BD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD>
/// @param std_dev <20> <> <EFBFBD> <EFBFBD> <EEB1A3>
void calculate_statistics ( float arr [ ] , int size , float * max_val , float * mean , float * std_dev )
{
* max_val = fabs ( arr [ 0 ] ) ;
float sum = 0.0 ;
float sum_sq = 0.0 ;
for ( int i = 0 ; i < size ; i + + ) {
float abs_val = fabs ( arr [ i ] ) ;
if ( abs_val > * max_val ) {
* max_val = abs_val ;
if ( abs_val > value [ 0 ] ) {
value [ 0 ] = abs_val ;
}
sum + = abs_val ;
sum_sq + = abs_val * abs_val ;
sum_sq + = abs_val * abs_val ;
}
* mean = sum / size ;
value [ 1 ] = sum / ( float ) model . maxlength ;
float variance = ( sum_sq / size ) - ( * mean * * mean ) ;
* std_dev = sqrt ( variance ) ;
float variance = ( sum_sq / ( float ) model . maxlength ) - ( value [ 1 ] * value [ 1 ] ) ;
value [ 2 ] = sqrtf ( variance ) ;
}
//<2F> жϷŵ<CFB7>
/// @brief <20> ж<EFBFBD> <D0B6> Ƿ<EFBFBD> <C7B7> ŵ<EFBFBD>
/// @param arr <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/// @param size <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ij<EFBFBD> <C4B3> <EFBFBD>
/// @param mean ƽ <> <C6BD> ֵ
/// @param std_dev <20> <> <EFBFBD> <D7BC>
/// @return <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <EFBFBD> 1<EFBFBD> <31> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0
int check_threshold ( float arr [ ] , int size , float * mean , float * std_dev )
u8 check_threshold ( Model model , const float * value )
{
const float threshold = 20. 0;
const float threshold = 2 0;
for ( int i = 0 ; i < size ; i + + ) {
float K = ( arr [ i ] - * mean ) / * std_dev ;
for ( int i = 0 ; i < model . maxlength ; i + + ) {
float K = ( fabsf ( model . array [ i ] ) - value [ 1 ] ) / value [ 2 ] ;
if ( K > threshold ) {
return 1 ;
}
@@ -326,306 +241,85 @@ int check_threshold(float arr[], int size, float *mean, float *std_dev)
return 0 ;
}
/// @brief <20> <> <EFBFBD> <EFBFBD> 100*100<30> <30> <EFBFBD> <EFBFBD>
/// @param get_data <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/// @param Max_value <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ
/// @param totalPoints <20> ܵ<EFBFBD> <DCB5> <EFBFBD> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD>
/// @param CNN_data <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 飨<EFBFBD> <E9A3A8> ά<EFBFBD> <CEAC>
void generateMatrix ( float * get_data , float Max_value , int totalPoints , float CNN_data [ 100 * 100 ] )
float * generateMatrix ( Model model , const float * value )
{
for ( int i = 0 ; i < 100 ; i + + ) {
for ( int j = 0 ; j < 100 ; j + + ) {
CNN_data [ i * 100 + j ] = 0 ;
}
}
float * CNN_data = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * 100 * 100 ) ;
memset ( CNN_data , 0 , sizeof ( float ) * 100 * 100 ) ;
int pointsPerInterval = totalPoints / 100 ;
float amplitudeStep = Max_ value / 100 ;
u16 x = model . maxlength / 100 ;
float y = value [ 0 ] / 100 ;
for ( int i = 0 ; i < totalPoints ; i + + ) {
float amplitudeV alue = fabsf ( get_data [ i ] ) ;
for ( int i = 0 ; i < model . maxlength ; i + + ) {
float absolutev alue = fabsf ( model . array [ i ] ) ;
if ( amplitudeValue = = 0.0f ) {
if ( ! absolutevalue ) {
continue ;
}
int interval Index = i / pointsPerInterval ;
if ( interval Index > = 100 ) interval Index = 99 ;
int x Index = i / x ;
if ( x Index > = 100 ) x Index = 99 ;
int amplitude Index = 99 - ( int ) ( amplitudeV alue / amplitudeStep ) ;
if ( amplitude Index < 0 ) amplitude Index = 0 ;
int y Index = ( int ) ( absolutev alue / y ) ;
if ( y Index < 0 ) y Index = 0 ;
CNN_data [ amplitude Index* 100 + interval Index] + + ;
CNN_data [ y Index * 100 + x Index ] + + ;
}
return CNN_data ;
}
/// @brief <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/// @param input_array <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/// @param output_array <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/// @param input_num <20> <> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD>
/// @return <20> <> <EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ĭ<EFBFBD> <C4AC> +1<> <31> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> a[0]<5D> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 1<EFBFBD> <31>
int calculate_probabilities ( float * input_array , float * output_array , int input_num )
{
float sum = 0.0 ;
float temp [ input_num ] ;
for ( int i = 0 ; i < input_num ; i + + )
{
temp [ i ] = exp ( input_array [ i ] ) ;
sum = sum + temp [ i ] ;
void cnn_run ( ) {
float value [ 3 ] = { 0 } ;
calculate_statistics ( data , & value [ 0 ] ) ;
if ( check_threshold ( data , & value [ 0 ] ) ) {
float * _data = generateMatrix ( data , & value [ 0 ] ) ;
//<2F> <> һ <EFBFBD> 㣺<EFBFBD> <E3A3BA> <EFBFBD> <EFBFBD> 102 * 102
float * expand_matrix_1 = expand ( _data , 100 , 1 ) ;
float * conv_rlst_1 = convolution ( conv1_weight , conv1_bias , expand_matrix_1 , 102 ) ;
float * pool_rslt_1 = pooling ( conv1_weight , conv_rlst_1 , 100 ) ;
myfree ( SRAMEX , _data ) ;
_data = NULL ;
myfree ( SRAMEX , expand_matrix_1 ) ;
expand_matrix_1 = NULL ;
myfree ( SRAMEX , conv_rlst_1 ) ;
conv_rlst_1 = NULL ;
//<2F> ڶ<EFBFBD> <DAB6> 㣺<EFBFBD> <E3A3BA> <EFBFBD> <EFBFBD> 32 * 52 * 52
float * expand_matrix_2 = expand ( pool_rslt_1 , 50 , 32 ) ;
float * conv_rlst_2 = convolution ( conv2_weight , conv2_bias , expand_matrix_2 , 52 ) ;
float * pool_rslt_2 = pooling ( conv2_weight , conv_rlst_2 , 50 ) ;
myfree ( SRAMEX , pool_rslt_1 ) ;
pool_rslt_1 = NULL ;
myfree ( SRAMEX , expand_matrix_2 ) ;
expand_matrix_2 = NULL ;
myfree ( SRAMEX , conv_rlst_2 ) ;
conv_rlst_2 = NULL ;
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> 㣺<EFBFBD> <E3A3BA> <EFBFBD> <EFBFBD> 64 * 27 * 27
float * expand_matrix_3 = expand ( pool_rslt_2 , 25 , 64 ) ;
float * conv_rlst_3 = convolution ( conv3_weight , conv3_bias , expand_matrix_3 , 27 ) ;
float * pool_rslt_3 = pooling ( conv3_weight , conv_rlst_3 , 25 ) ;
myfree ( SRAMEX , pool_rslt_2 ) ;
pool_rslt_2 = NULL ;
myfree ( SRAMEX , expand_matrix_3 ) ;
expand_matrix_3 = NULL ;
myfree ( SRAMEX , conv_rlst_3 ) ;
conv_rlst_3 = NULL ;
float * affine1_rslt = hidden ( pool_rslt_3 ) ;
float * affine2_rslt = output ( affine1_rslt ) ;
myfree ( SRAMEX , pool_rslt_3 ) ;
pool_rslt_3 = NULL ;
myfree ( SRAMEX , affine1_rslt ) ;
affine1_rslt = NULL ;
myfree ( SRAMEX , affine2_rslt ) ;
affine2_rslt = NULL ;
} else {
printf ( " δ<EFBFBD> ŵ磡<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֵ:%f ƽ <> <C6BD> ֵ:%f <20> <> <EFBFBD> <D7BC> :%f \r \n " , value [ 0 ] , value [ 1 ] , value [ 2 ] ) ;
}
for ( int j = 0 ; j < input_num ; j + + )
{
output_array [ j ] = temp [ j ] / sum ;
}
int max_index = 0 ;
float max_value = output_array [ 0 ] ;
for ( int k = 1 ; k < input_num ; k + + )
{
if ( output_array [ k ] > max_value )
{
max_value = output_array [ k ] ;
max_index = k ;
}
}
return max_index + 1 ;
}
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ǻ<EFBFBD> <C7BB> <EFBFBD> <EFBFBD> <EFBFBD> ֤<EFBFBD> <D6A4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ܣ<EFBFBD> <DCA3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ż<EFBFBD> */
/*ԭʼ <D4AD> <CABC> <EFBFBD> ݸ<EFBFBD> <DDB8> <EFBFBD>
*Ŀǰ<C4BF> <C7B0> <EFBFBD> <EFBFBD> ֤<EFBFBD> ܷ<EFBFBD> <DCB7> <EFBFBD> <EFBFBD> <EFBFBD> Ŀ<EFBFBD> <C4BF> <EFBFBD> Ե<EFBFBD> <D4B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ¼<EFBFBD> <C2BC> 㣬<EFBFBD> п<EFBFBD> <D0BF> ܳ<EFBFBD> <DCB3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
*Ŀǰû<C7B0> <C3BB> <EFBFBD> <EFBFBD> û<EFBFBD> <C3BB> <EFBFBD> <EFBFBD> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> Ԫ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ¼<EFBFBD> <C2BC> 㡣
*ԭʼ <D4AD> <CABC> <EFBFBD> ݸ<EFBFBD> <DDB8> <EFBFBD> <EFBFBD> <EFBFBD> ӡ<EFBFBD> <D3A1> Ԥ<EFBFBD> <D4A4> <EFBFBD> <EFBFBD> <EFBFBD> ļ<EFBFBD> <C4BC> 㣬<EFBFBD> <E3A3AC> <EFBFBD> <EFBFBD> <EFBFBD> ľ<EFBFBD> <C4BE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ò<EFBFBD> <C3B2> <EFBFBD> <EFBFBD> <EFBFBD>
*/
/// @brief <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ij<EFBFBD> <C4B3> <EFBFBD>
/// @param data <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ ά<D2BB> <CEAC> <EFBFBD> <EFBFBD> ԭʼ <D4AD> <CABC> <EFBFBD> <EFBFBD> --> data.array<61> <79> <EFBFBD> <EFBFBD>
/// @param size ԭʼ <D4AD> <CABC> <EFBFBD> ݸ<EFBFBD> <DDB8> <EFBFBD> --> data.maxlength<74> <68> <EFBFBD> <EFBFBD>
void cnn_run ( )
{
float maxvalue = 0.0 ; //<2F> <> <EFBFBD> <EFBFBD> ֵ
float meanvalue = 0.0 ; //ƽ <> <C6BD> ֵ
float std_devvalue = 0.0 ; //<2F> <> <EFBFBD> <D7BC>
int index = 0 ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˸ <EFBFBD> ɶ<EFBFBD> ģ<EFBFBD>
float * Matrix_data = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * 100 * 100 ) ; //<2F> <> <EFBFBD> ɵ<EFBFBD> 100*100<30> ľ<EFBFBD> <C4BE> <EFBFBD> <F3B1A3B4> <EFBFBD> <EFBFBD> <EFBFBD>
printf ( " CNNģ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> У <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \r \n Data<EFBFBD> <EFBFBD> <EFBFBD> ݼ<EFBFBD> Ϊ<EFBFBD> <EFBFBD> %s \r \n " , data . dname ) ;
DEBUG_PRINTF ( " data[%d]: %f \r \n " , 0 , data . array [ 0 ] ) ;
DEBUG_PRINTF ( " data[%d]: %f \r \n " , 1 , data . array [ 1 ] ) ;
DEBUG_PRINTF ( " data[%d]: %f \r \n " , 2 , data . array [ 2 ] ) ;
DEBUG_PRINTF ( " data[%d]: %f \r \n " , 299 , data . array [ 299 ] ) ;
DEBUG_PRINTF ( " data[%d]: %f \r \n " , 300 , data . array [ 300 ] ) ;
DEBUG_PRINTF ( " data[%d]: %f \r \n " , 301 , data . array [ 301 ] ) ;
DEBUG_PRINTF ( " data[%d]: %f \r \n " , 1249997 , data . array [ 1249997 ] ) ;
DEBUG_PRINTF ( " data[%d]: %f \r \n " , 1249998 , data . array [ 1249998 ] ) ;
DEBUG_PRINTF ( " data[%d]: %f \r \n " , 1249999 , data . array [ 1249999 ] ) ;
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
calculate_statistics ( data . array , data . maxlength , & maxvalue , & meanvalue , & std_devvalue ) ;
/*<2A> ж<EFBFBD> <D0B6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƿ<C7B7> <F1B3ACB9> <EFBFBD> ֵ*/
int x = check_threshold ( data . array , data . maxlength , & meanvalue , & std_devvalue ) ;
if ( x = = 1 ) {
printf ( " Start \r \n " ) ;
//pre <20> <> ʼ Ԥ<CABC> <D4A4> <EFBFBD> <EFBFBD>
/*<2A> <> <EFBFBD> ɾ<EFBFBD> <C9BE> <EFBFBD> */
generateMatrix ( data . array , maxvalue , data . maxlength , Matrix_data ) ;
float * CNN_data = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * 100 * 100 ) ;
/*<2A> <> ά<EFBFBD> <CEAC> <EFBFBD> <EFBFBD> תһ ά<D2BB> <CEAC> <EFBFBD> 飬<EFBFBD> Ա<EFBFBD> <D4B1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
for ( int i = 0 ; i < 100 ; i + + ) {
for ( int j = 0 ; j < 100 ; j + + ) {
CNN_data [ 9999 - index + + ] = Matrix_data [ i * 100 + j ] ;
}
}
DEBUG_PRINTF ( " <EFBFBD> <EFBFBD> ʼ <EFBFBD> <EFBFBD> һ <EFBFBD> 㣡\r \n " ) ;
//1 <20> <> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Դ<EFBFBD> <D4B4> <EFBFBD> <EFBFBD> */
float * Full_output1 = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * 102 * 102 ) ;
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
Full ( CNN_data , 100 , Full_output1 ) ;
float * * Convolution_result1_before = ( float * * ) allocate2DArray ( 32 , 100 * 100 , sizeof ( float ) ) ;
float * * Convolution_result1_relu = ( float * * ) allocate2DArray ( 32 , 100 * 100 , sizeof ( float ) ) ;
float * * Convolution_result1 = ( float * * ) allocate2DArray ( 32 , 100 * 100 , sizeof ( float ) ) ;
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
for ( int i = 0 ; i < 32 ; i + + ) {
/*<2A> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> ˣ<EFBFBD> <CBA3> <EFBFBD> û<EFBFBD> Ż<EFBFBD> <C5BB> <EFBFBD> */
float conv1_weight_new [ 9 ] = {
conv1_weight . array [ i * 9 + 0 ] , conv1_weight . array [ i * 9 + 1 ] ,
conv1_weight . array [ i * 9 + 2 ] , conv1_weight . array [ i * 9 + 3 ] ,
conv1_weight . array [ i * 9 + 4 ] , conv1_weight . array [ i * 9 + 5 ] ,
conv1_weight . array [ i * 9 + 6 ] , conv1_weight . array [ i * 9 + 7 ] ,
conv1_weight . array [ i * 9 + 8 ] } ;
Convolution ( Full_output1 , 102 , conv1_weight_new , 3 , Convolution_result1_before [ i ] ) ;
}
/*<2A> <> <EFBFBD> <EFBFBD> ƫ<EFBFBD> <C6AB> */
for ( int i = 0 ; i < 32 ; i + + ) {
AddBias ( Convolution_result1_before [ i ] , 100 * 100 , conv1_bias . array [ i ] , Convolution_result1_relu [ i ] ) ;
}
/*<2A> <> ReLU<4C> <55> <EFBFBD> <EFBFBD> */
for ( int i = 0 ; i < 32 ; i + + ) {
ReLU1 ( Convolution_result1_relu [ i ] , 100 * 100 , Convolution_result1 [ i ] ) ;
}
/*<2A> ػ<EFBFBD> <D8BB> <EFBFBD> <EFBFBD> <EFBFBD> */
float * * Pooling_result1 = ( float * * ) allocate2DArray ( 32 , 50 * 50 , sizeof ( float ) ) ;
for ( int i = 0 ; i < 32 ; i + + ) {
Pooling ( Convolution_result1 [ i ] , 100 , 2 , 2 , Pooling_result1 [ i ] ) ;
}
DEBUG_PRINTF ( " <EFBFBD> <EFBFBD> һ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϣ<EFBFBD> \r \n " ) ;
//2 <20> ڶ<EFBFBD> <DAB6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/*<2A> ͷ<EFBFBD> <CDB7> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Դ*/
myfree ( SRAMEX , Full_output1 ) ;
free2DArray ( Convolution_result1_relu , 32 ) ;
free2DArray ( Convolution_result1_before , 32 ) ;
free2DArray ( Convolution_result1 , 32 ) ;
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
float * * Full_output2 = ( float * * ) allocate2DArray ( 32 , 52 * 52 , sizeof ( float ) ) ;
for ( int i = 0 ; i < 32 ; i + + ) {
Full ( Pooling_result1 [ i ] , 50 , Full_output2 [ i ] ) ;
}
/*<2A> <> <EFBFBD> 뱾<EFBFBD> <EBB1BE> <EFBFBD> <EFBFBD> Դ*/
float * * Convolution_result_temp_2 = ( float * * ) allocate2DArray ( 32 , 50 * 50 , sizeof ( float ) ) ;
float * * Convolution_result2_before = ( float * * ) allocate2DArray ( 64 , 50 * 50 , sizeof ( float ) ) ;
float * * Convolution_result2_relu = ( float * * ) allocate2DArray ( 64 , 50 * 50 , sizeof ( float ) ) ;
float * * Convolution_result2 = ( float * * ) allocate2DArray ( 64 , 50 * 50 , sizeof ( float ) ) ;
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
for ( int i = 0 ; i < 64 ; i + + ) {
for ( int j = 0 ; j < 32 ; j + + ) {
/*<2A> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
float conv2_weight_new [ 9 ] = {
conv2_weight . array [ i * 32 * 9 + 9 * j + 0 ] , conv2_weight . array [ i * 32 * 9 + 9 * j + 1 ] ,
conv2_weight . array [ i * 32 * 9 + 9 * j + 2 ] , conv2_weight . array [ i * 32 * 9 + 9 * j + 3 ] ,
conv2_weight . array [ i * 32 * 9 + 9 * j + 4 ] , conv2_weight . array [ i * 32 * 9 + 9 * j + 5 ] ,
conv2_weight . array [ i * 32 * 9 + 9 * j + 6 ] , conv2_weight . array [ i * 32 * 9 + 9 * j + 7 ] ,
conv2_weight . array [ i * 32 * 9 + 9 * j + 8 ]
} ;
Convolution ( Full_output2 [ j ] , 52 , conv2_weight_new , 3 , Convolution_result_temp_2 [ j ] ) ;
}
/*ÿһ <C3BF> <D2BB> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <CDBC> <EFBFBD> ϲ <EFBFBD> */
Combine ( Convolution_result_temp_2 , 32 , 50 , Convolution_result2_before [ i ] ) ;
}
/*<2A> <> <EFBFBD> <EFBFBD> ƫ<EFBFBD> <C6AB> */
for ( int i = 0 ; i < 64 ; i + + ) {
AddBias ( Convolution_result2_before [ i ] , 50 * 50 , conv2_bias . array [ i ] , Convolution_result2_relu [ i ] ) ;
}
/*<2A> <> <EFBFBD> <EFBFBD> ReLU<4C> <55> <EFBFBD> <EFBFBD> */
for ( int i = 0 ; i < 64 ; i + + ) {
ReLU1 ( Convolution_result2_relu [ i ] , 50 * 50 , Convolution_result2 [ i ] ) ;
}
/*<2A> ػ<EFBFBD> <D8BB> <EFBFBD> <EFBFBD> <EFBFBD> */
float * * Pooling_result2 = ( float * * ) allocate2DArray ( 64 , 25 * 25 , sizeof ( float ) ) ;
for ( int i = 0 ; i < 64 ; i + + ) {
Pooling ( Convolution_result2 [ i ] , 50 , 2 , 2 , Pooling_result2 [ i ] ) ;
}
DEBUG_PRINTF ( " <EFBFBD> ڶ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϣ<EFBFBD> \r \n " ) ;
//3 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/*<2A> ͷ<EFBFBD> <CDB7> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Դ*/
free2DArray ( Full_output2 , 32 ) ;
free2DArray ( Pooling_result1 , 32 ) ;
free2DArray ( Convolution_result_temp_2 , 32 ) ;
free2DArray ( Convolution_result2_relu , 64 ) ;
free2DArray ( Convolution_result2_before , 64 ) ;
free2DArray ( Convolution_result2 , 64 ) ;
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
float * * Full_output3 = ( float * * ) allocate2DArray ( 64 , 27 * 27 , sizeof ( float ) ) ;
for ( int i = 0 ; i < 64 ; i + + ) {
Full ( Pooling_result2 [ i ] , 25 , Full_output3 [ i ] ) ;
}
/*<2A> <> <EFBFBD> 뱾<EFBFBD> <EBB1BE> <EFBFBD> <EFBFBD> Դ*/
float * * Convolution_result_temp_3 = ( float * * ) allocate2DArray ( 64 , 25 * 25 , sizeof ( float ) ) ;
float * * Convolution_result3_before = ( float * * ) allocate2DArray ( 128 , 25 * 25 , sizeof ( float ) ) ;
float * * Convolution_result3_relu = ( float * * ) allocate2DArray ( 128 , 25 * 25 , sizeof ( float ) ) ;
float * * Convolution_result3 = ( float * * ) allocate2DArray ( 128 , 25 * 25 , sizeof ( float ) ) ;
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
for ( int i = 0 ; i < 128 ; i + + ) {
for ( int j = 0 ; j < 64 ; j + + ) {
float conv3_weight_new [ 9 ] = {
conv3_weight . array [ i * 64 * 9 + 9 * j + 0 ] , conv3_weight . array [ i * 64 * 9 + 9 * j + 1 ] ,
conv3_weight . array [ i * 64 * 9 + 9 * j + 2 ] , conv3_weight . array [ i * 64 * 9 + 9 * j + 3 ] ,
conv3_weight . array [ i * 64 * 9 + 9 * j + 4 ] , conv3_weight . array [ i * 64 * 9 + 9 * j + 5 ] ,
conv3_weight . array [ i * 64 * 9 + 9 * j + 6 ] , conv3_weight . array [ i * 64 * 9 + 9 * j + 7 ] ,
conv3_weight . array [ i * 64 * 9 + 9 * j + 8 ]
} ;
Convolution ( Full_output3 [ j ] , 27 , conv3_weight_new , 3 , Convolution_result_temp_3 [ j ] ) ;
}
/*<2A> <> ͼ<EFBFBD> <CDBC> <EFBFBD> ϲ <EFBFBD> */
Combine ( Convolution_result_temp_3 , 64 , 25 , Convolution_result3_before [ i ] ) ;
}
/*<2A> <> <EFBFBD> <EFBFBD> ƫ<EFBFBD> <C6AB> */
for ( int i = 0 ; i < 128 ; i + + ) {
AddBias ( Convolution_result3_before [ i ] , 25 * 25 , conv3_bias . array [ i ] , Convolution_result3_relu [ i ] ) ;
}
/*ReLU<4C> <55> <EFBFBD> <EFBFBD> */
for ( int i = 0 ; i < 128 ; i + + ) {
ReLU1 ( Convolution_result3_relu [ i ] , 25 * 25 , Convolution_result3 [ i ] ) ;
}
/*<2A> ػ<EFBFBD> <D8BB> <EFBFBD> <EFBFBD> <EFBFBD> */
float * * Pooling_result3 = ( float * * ) allocate2DArray ( 128 , 12 * 12 , sizeof ( float ) ) ;
for ( int i = 0 ; i < 128 ; i + + ) {
Pooling ( Convolution_result3_before [ i ] , 25 , 2 , 2 , Pooling_result3 [ i ] ) ;
}
/*<2A> ػ<EFBFBD> <D8BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> չ<EFBFBD> <D5B9> <EFBFBD> <EFBFBD> һ ά<D2BB> <CEAC> <EFBFBD> <EFBFBD> */
float * xi = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * 128 * 12 * 12 ) ;
Flatten2D ( Pooling_result3 , 128 , 12 , xi ) ;
DEBUG_PRINTF ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϣ<EFBFBD> \r \n " ) ;
//4 <20> <> һ <EFBFBD> <D2BB> <EFBFBD> Ӳ<EFBFBD>
/*<2A> ͷ<EFBFBD> <CDB7> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Դ*/
free2DArray ( Full_output3 , 64 ) ;
free2DArray ( Pooling_result2 , 64 ) ;
free2DArray ( Convolution_result_temp_3 , 64 ) ;
free2DArray ( Convolution_result3_relu , 128 ) ;
free2DArray ( Convolution_result3_before , 128 ) ;
free2DArray ( Convolution_result3 , 128 ) ;
/*<2A> <> <EFBFBD> Ӳ<EFBFBD> <D3B2> <EFBFBD> <EFBFBD> <EFBFBD> */
//float yi[128] = {0};
DEBUG_PRINTF ( " <EFBFBD> <EFBFBD> ʼ <EFBFBD> <EFBFBD> <EFBFBD> IJ㣡\r \n " ) ;
float * yi = ( float * ) mymalloc ( SRAMEX , 128 * sizeof ( float ) ) ;
memset ( yi , 0 , 128 * sizeof ( float ) ) ;
for ( int i = 0 ; i < 128 ; i + + ) {
float sum = 0 ;
//float fc1_weight_new[128*12*12];
float * fc1_weight_new = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * 128 * 12 * 12 ) ;
/*<2A> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
memcpy ( fc1_weight_new , & fc1_weight . array [ i * 128 * 12 * 12 ] , 128 * 12 * 12 * sizeof ( float ) ) ;
sum = ConnectedLayer ( xi , 128 * 12 * 12 , fc1_weight_new , fc1_bias . array [ i ] ) ;
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ReLU<4C> <55> <EFBFBD> <EFBFBD> */
yi [ i ] = ReLU2 ( sum ) ;
myfree ( SRAMEX , fc1_weight_new ) ;
}
DEBUG_PRINTF ( " <EFBFBD> <EFBFBD> <EFBFBD> IJ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϣ<EFBFBD> \r \n " ) ;
//5 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ӳ<EFBFBD>
/*<2A> ͷ<EFBFBD> <CDB7> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Դ*/
free2DArray ( Pooling_result3 , 128 ) ;
/*<2A> <> <EFBFBD> Ӳ<EFBFBD> <D3B2> <EFBFBD> <EFBFBD> <EFBFBD> */
float zi [ 7 ] = { 0 } ;
// float *zi = (float *)mymalloc(SRAMEX, 7 * sizeof(float));
// memset(zi, 0, 7 * sizeof(float));
for ( int i = 0 ; i < 7 ; i + + ) {
//float fc2_weight_new[128];
float * fc2_weight_new = ( float * ) mymalloc ( SRAMEX , sizeof ( float ) * 128 ) ;
/*<2A> <> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
memcpy ( fc2_weight_new , & fc2_weight . array [ i * 128 ] , 128 * sizeof ( float ) ) ;
/*<2A> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ReLU<4C> <55> <EFBFBD> <EFBFBD> */
zi [ i ] = ConnectedLayer ( yi , 128 , fc2_weight_new , fc2_bias . array [ i ] ) ;
myfree ( SRAMEX , fc2_weight_new ) ;
}
DEBUG_PRINTF ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϣ<EFBFBD> \r \n " ) ;
//end <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
float result [ 7 ] ;
int max_probability_idx = calculate_probabilities ( zi , result , 7 ) ;
PrintfResArray ( zi , 7 , 7 ) ;
PrintfResArray ( result , 7 , 7 ) ;
printf ( " %f, Label %d \t " , result [ max_probability_idx - 1 ] * 100 , max_probability_idx ) ;
myfree ( SRAMEX , xi ) ;
myfree ( SRAMEX , yi ) ;
myfree ( SRAMEX , CNN_data ) ;
myfree ( SRAMEX , Full_output1 ) ;
}
else printf ( " No \r \n " ) ; /*<2A> <> <EFBFBD> <EFBFBD> û<EFBFBD> ŵ<EFBFBD> <C5B5> <EFBFBD> ӡ<EFBFBD> <D3A1> No<4E> <6F> */
printf ( " maxvalue is:%f \t " , maxvalue ) ;
printf ( " meanvalue is:%f \t " , meanvalue ) ;
printf ( " std_devvalue is:%f \r \n " , std_devvalue ) ;
myfree ( SRAMEX , Matrix_data ) ;
isrun = 0 ;
}