a
    Tqe7                     @   sT  d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z
 ejejeZedspejeZqXeejvreje ddlmZ dd Zdd	 Zd
d Zdd ZdddZedkrPddlmZ ddlmZ e Zddge_ de_!de_"de_#de_$e Z%ej&'e%( dZ)ee)eZ*e+ej#D ]Z,e-e,e*.  e*/  q2dS )aR  
# -*- coding: utf-8 -*-
-----------------------------------------------------------------------------------
# Author: Nguyen Mau Dung
# DoC: 2020.08.09
# email: nguyenmaudung93.kstn@gmail.com
-----------------------------------------------------------------------------------
# Description: utils functions that use for training process
    N)LambdaLRsfa)OneCyclePolicyc                 C   s   t |dr dd |j D }ndd | D }| jdkrVtjj|| j| jdd}n.| jdkrxtjj	|| j| j
d	}nd
sJ d|S )z*Create optimizer for training process
    modulec                 S   s   g | ]}|j r|qS  requires_grad.0paramr   r   H/home/opencvuniv/work/pranav/ADAS_2_LIDAR/SFA3D/sfa/utils/train_utils.py
<listcomp>!       z$create_optimizer.<locals>.<listcomp>c                 S   s   g | ]}|j r|qS r   r   r	   r   r   r   r   #   r   sgdT)lrmomentumnesterovadam)r   weight_decayFzUnknown optimizer type)hasattrr   
parametersZoptimizer_typetorchoptimSGDr   r   Adamr   )configsmodelZtrain_params	optimizerr   r   r   create_optimizer   s    


r   c                    s    j dkr" fdd}t| |}nN j dkrF fdd}t| |d}n* j dkrlt|  j jd	d
gdd}ntt| | j j j d |S )z3Create learning rate scheduler for training process
multi_stepc                    s0   |  j d k rd}n|  j d k r(d}nd}|S )Nr         ?   皙?g{Gz?)steps)ifactorr   r   r   multi_step_scheduler3   s    z1create_lr_scheduler.<locals>.multi_step_schedulercosinc                    s*   dt | t j  j  d d d d S )Nr!      r    g?r"   )mathcospi
num_epochs)xr&   r   r   <lambda>A   r   z%create_lr_scheduler.<locals>.<lambda>)	lr_lambda	one_cycleg333333?gffffff?g?)Zmomentum_rngZphase_ratio)save_dirlr_type)r3   r   r   r   r-   
ValueErrorplot_lr_schedulerlogs_dir)r   r   r'   lr_schedulerlfr   r&   r   create_lr_scheduler/   s    



r9   c                 C   sH   t | dr| j }n|  }||t| t| d}||fS )z,Get the information to save with checkpointsr   )epochr   r   r7   )r   r   
state_dictcopydeepcopy)r   r   r7   r:   r   model_state_dictutils_state_dictr   r   r   get_saved_stateN   s    
r@   c                 C   sV   t j| d||}t j| d||}t|| t|| td| dS )zSSave checkpoint every epoch only is best model or after every checkpoint_freq epochzModel_{}_epoch_{}.pthzUtils_{}_epoch_{}.pthzsave a checkpoint at {}N)ospathjoinformatr   saveprint)checkpoints_dirsaved_fnr>   r?   r:   Zmodel_save_pathZutils_save_pathr   r   r   save_checkpoint^   s
    rI   ,   c                 C   s   t  | t  | } }g }t|D ] }|  || jd d  q"tj|ddd td td t	  t
d| td t  tjtj|d|dd	 d S )
Nr   r   z.-LR)labelr:   z	LR_{}.png   )dpi)r<   rangestepappendparam_groupspltplotxlabelylabelgridxlimylimtight_layoutsavefigrA   rB   rC   rD   )r   	schedulerr-   r2   r3   y_r   r   r   r5   i   s    


r5   __main__)EasyDict)resnet18      r1   z../../logs/2   g;Onb?g-C6*?)rJ   rK   rK   )0__doc__r<   rA   r*   sysr   Ztorch.optim.lr_schedulerr   matplotlib.pyplotpyplotrT   rB   dirnamerealpath__file__src_direndswithrR   Zutils.lr_schedulerr   r   r9   r@   rI   r5   __name__Zeasydictra   ZedictZtorchvision.modelsrb   r   r#   r3   r6   r-   r   netr   r   r   r   r]   rP   r$   rF   get_lrrQ   r   r   r   r   <module>   sB   






