
    i                     P   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
mZ  ej                  d        ej                   ed ej                                       G d dej                         Zd	 Zd
 ZddZ ej*                         d        Zd Zedk(  r e        yy)    N)
DataLoader)datasets
transforms) AnurupyenaDepthwiseSeparableConv*      c                   $     e Zd Z fdZd Z xZS )CIFAR10AnurupyenaNetc                     t         |           t        j                  t        j                  ddddd      t        j
                  d      t        j                  d            | _        t        j                  t        dd      t        j
                  d      t        j                  d      t        dd	      t        j
                  d	      t        j                  d      t        j                  d
      t        j                  d      t        d	d      t        j
                  d      t        j                  d      t        dd      t        j
                  d      t        j                  d      t        j                  d
      t        j                  d      t        dd      t        j
                  d      t        j                  d      t        j                  d
      t        j                  d            | _        t        j                  t        j                         t        j                  dd      t        j                  d      t        j                  d      t        j                  dd            | _        y )N          F)kernel_sizepaddingbiasT)inplace@   `      g?      皙?   333333?i   g333333?
   )super__init__nn
SequentialConv2dBatchNorm2dReLUstemr   	MaxPool2d	Dropout2dfeaturesFlattenLinearDropout
classifier)self	__class__s    ex03_cifar10.pyr   zCIFAR10AnurupyenaNet.__init__   s   MMIIaAEBNN2GGD!
	
 ,R4NN2GGD!,R4NN2GGD!LLOLL,R5NN3GGD!,S#6NN3GGD!LLOLL,S#6NN3GGD!LLOLL+
. --JJLIIk3'GGD!JJtIIc2
    c                 h    | j                  |      }| j                  |      }| j                  |      S N)r#   r&   r*   )r+   inputsoutputss      r-   forwardzCIFAR10AnurupyenaNet.forward7   s-    ))F#--(w''r.   )__name__
__module____qualname__r   r3   __classcell__)r,   s   @r-   r
   r
      s    $
L(r.   r
   c                 v   t        dd      j                  |       j                         }t        j                  dddd|       }t        j
                         5  t        d      D ]
  } ||        | j                  dk(  rt        j                  j                          t        j                         }d}t        |      D ]
  } ||        | j                  dk(  rt        j                  j                          d d d        t        j                         z
  dz  z  }t        d	|d
d       y # 1 sw Y   7xY w)Nr   r   r   )devicer   cudad   i  z&Anurupyena depthwise separable layer: z.2fz ms)r   toevaltorchrandninference_moderangetyper:   synchronizetimeperf_counterprint)r9   layersample_startruns
elapsed_mss          r-   benchmark_anurupyena_layerrM   =   s   ,R477?DDFE[[BBv6F				 %r 	A&M	;;& JJ""$!!#t 	A&M	;;& JJ""$% ##%-5<J	2:c2B#
FG% %s   B!D//D8c           	      d   t        j                  t        j                  dd      t        j                         t        j                         t        j
                  dd      g      }t        j                  t        j                         t        j
                  dd      g      }t        j                  |dd|      }t        j                  |dd|      }t        || dd	t        j                  j                         
      }t        || dd	t        j                  j                         
      }||fS )Nr   r   )r   )gHPs?gec]?g~jt?)gV-?g^I+?g(?T)roottraindownload	transformFr   )
batch_sizeshufflenum_workers
pin_memory)r   Compose
RandomCropRandomHorizontalFlipToTensor	Normalizer   CIFAR10r   r>   r:   is_available)rS   	data_roottrain_transformtest_transformtrain_datasettest_datasettrain_loadertest_loaders           r-   make_loadersre   R   s    ((!!"a0++-!  !9;ST		
O  ''!  !9;ST	
N $$)4$ZijM##%$ZhiL::**,L ::**,K $$r.   c                    | j                          d}d}d}|D ]  \  }	}
|	j                  |d      }	|
j                  |d      }
|j                  d        | |	      } |||
      }|j                          |j	                          ||j	                          |
j                  d      }||j                         |z  z  }||j                  d      |
k(  j                         j                         z  }||z  } ||z  ||z  fS )N        r   Tnon_blocking)set_to_noner   dim)	rP   r<   	zero_gradbackwardstepsizeitemargmaxsum)modelloader	optimizer	criterionr9   	scheduler
total_losstotal_correcttotal_samplesimageslabelslogitslossrS   s                 r-   train_one_epochr   v   s	   	KKMJMM  $6565-v( NN[[^
diikJ..
&--A-.&8==?DDFF#$" %}}'DDDr.   c                    | j                          d}d}d}|D ]  \  }}|j                  |d      }|j                  |d      } | |      }	 ||	|      }
|j                  d      }||
j                         |z  z  }||	j	                  d      |k(  j                         j                         z  }||z  } ||z  ||z  fS )Nrg   r   Trh   r   rk   )r=   r<   rp   rq   rr   rs   )rt   ru   rw   r9   ry   rz   r{   r|   r}   r~   r   rS   s               r-   evaluater      s    	JJLJMM  
$6565v([[^
diikJ..
&--A-.&8==?DDFF#
$ %}}'DDDr.   c                     t        j                  d      } | j                  dt        d       | j                  dt        d       | j                  dt        d	       | j                  d
t        d       | j                  dt
        d       | j                  dt
        t        j                  j                         rdnd       | j                         }t        j                  |j                        }t        |j                  |j                        \  }}t               j                  |      }t!        j"                  d      }t        j$                  j'                  |j)                         |j*                  |j,                        }t        j$                  j.                  j1                  ||j*                  |j2                  t5        |      ddd      }t7        |       t9        d|j2                  dz         D ]E  }	t;        ||||||      \  }
}t=        ||||      \  }}t?        d|	dd|
dd|dd|dd |d
       G y )!NzACIFAR-10 model using Anurupyena depthwise separable convolutions.)descriptionz--epochs   )rB   defaultz--batch-sizer   z--lrg~jth?z--weight-decaygMb@?z--data-rootz./dataz--devicer:   cpur   )label_smoothing)lrweight_decayr   g      $@g      Y@)max_lrepochssteps_per_epoch	pct_start
div_factorfinal_div_factorr   zepoch 02dz | train loss z.4fz | train acc z.4%z | test loss z | test acc ) argparseArgumentParseradd_argumentintfloatstrr>   r:   r]   
parse_argsr9   re   rS   r^   r
   r<   r   CrossEntropyLossoptimAdamW
parametersr   r   lr_scheduler
OneCycleLRr   lenrM   rA   r   r   rF   )parserargsr9   rc   rd   rt   rw   rv   rx   epoch
train_loss	train_acc	test_losstest_accs                 r-   mainr      s	   $$1tuF

b9
S#>
UD9
(udC
CB



@W@W@Yf_deD\\$++&F ,T__dnn ML+ "%%f-E##C8I!!%"2"2"4tO`O`!aI((33ww{{L) 4 I v&q$++/* 
 /|YPY[acl m
I&uk9fM	8U3K  $S)yo F"3|HS>C	

r.   __main__r0   )r   rD   r>   torch.nnr   torch.utils.datar   torchvisionr   r   ex03r   manual_seedset_num_threadsminget_num_threadsModuler
   rM   re   r   r@   r   r   r4    r.   r-   <module>r      s        ' , 1   "    c!2U2245 6*(299 *(ZH*!%HE4 E E*#
L zF r.   