
    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 )MNISTAnurupyenaNetc                    t         |           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        j                  t        j                         t        j                  dd	      t        j                  d      t        j                  d      t        j                  d	d            | _        y )N       T)inplace@      g?`      g?i  g?
   )super__init__nn
Sequentialr   BatchNorm2dReLU	MaxPool2d	Dropout2dfeaturesFlattenLinearDropout
classifier)self	__class__s    ex03_mnist.pyr   zMNISTAnurupyenaNet.__init__   s#   ,Q3NN2GGD!,R4NN2GGD!LLOLL,R4NN2GGD!,R5NN3GGD!LLOLL!
$ --JJLIIk3'GGD!JJtIIc2
    c                 F    | j                  |      }| j                  |      S N)r   r    )r!   inputsoutputss      r#   forwardzMNISTAnurupyenaNet.forward-   s    --'w''r$   )__name__
__module____qualname__r   r)   __classcell__)r"   s   @r#   r
   r
      s    
8(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)N   r   r      )devicer   cudad   i  z&Anurupyena depthwise separable layer: z.2fz ms)r   toevaltorchrandninference_moderangetyper2   synchronizetimeperf_counterprint)r1   layersample_startruns
elapsed_mss          r#   benchmark_anurupyena_layerrE   2   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                    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 )N)g_)Ǻ?)gGr?T)roottraindownload	transformFr   )
batch_sizeshufflenum_workers
pin_memory)
r   ComposeToTensor	Normalizer   MNISTr   r6   r2   is_available)rK   	data_rootrJ   train_datasettest_datasettrain_loadertest_loaders          r#   make_loadersrY   G   s    ""!  I6	
I NN	XabM>>yXabL::**,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)	rH   r4   	zero_gradbackwardstepsizeitemargmaxsum)modelloader	optimizer	criterionr1   	scheduler
total_losstotal_correcttotal_samplesimageslabelslogitslossrK   s                 r#   train_one_epochrt   c   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 )Nr[   r   Tr\   r   r_   )r5   r4   rd   re   rf   rg   )rh   ri   rk   r1   rm   rn   ro   rp   rq   rr   rs   rK   s               r#   evaluaterv   }   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"                         }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 )Nz>MNIST model using Anurupyena depthwise separable convolutions.)descriptionz--epochs   )r:   defaultz--batch-sizer   z--lrg~jth?z--weight-decayg-C6?z--data-rootz./dataz--devicer2   cpu)lrweight_decayg333333?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strr6   r2   rS   
parse_argsr1   rY   rK   rT   r
   r4   r   CrossEntropyLossoptimAdamW
parametersr|   r}   lr_scheduler
OneCycleLRr   lenrE   r9   rt   rv   r>   )parserargsr1   rW   rX   rh   rk   rj   rl   epoch
train_loss	train_acc	test_losstest_accs                 r#   mainr      s   $$1qrF

a8
S#>
UD9
(udC
CB



@W@W@Yf_deD\\$++&F ,T__dnn ML+ ##F+E##%I!!%"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__r&   )r   r<   r6   torch.nnr   torch.utils.datar   torchvisionr   r   ex03r   manual_seedset_num_threadsminget_num_threadsModuler
   rE   rY   rt   r8   rv   r   r*    r$   r#   <module>r      s        ' , 1   "    c!2U2245 6( (DH*%8E4 E E*#
L zF r$   