a
    þdæ  ã                   @   sl   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 ddlmZ e
 ¡ G d	d
„ d
eƒƒZdS )é    N)ÚOrderedDict)Úbuild_network)Ú
build_loss)Úget_root_logger)ÚMODEL_REGISTRYé   )ÚVideoRecurrentModelc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚVideoRecurrentGANModelc                 C   sÔ  | j d }| dd¡| _| jdkr¢tƒ }| d| j› ¡ t| j d ƒ | j¡| _| j d  dd ¡}|d urŽ|  	| j|| j d  dd	¡d
¡ n
|  
d¡ | j ¡  t| j d ƒ| _|  | j¡| _|  | j¡ | j d  dd ¡}|d ur| j d  dd¡}|  	| j|| j d  dd	¡|¡ | j ¡  | j ¡  | d¡rRt|d ƒ | j¡| _nd | _| d¡r|t|d ƒ | j¡| _nd | _| d¡r¤t|d ƒ | j¡| _| dd¡| _| dd¡| _|  ¡  |  ¡  d S )NÚtrainÚ	ema_decayr   z+Use Exponential Moving Average with decay: Z	network_gÚpathZpretrain_network_gZstrict_load_gTÚ
params_emaZ	network_dZpretrain_network_dZparam_key_dÚparamsZstrict_load_dZ	pixel_optZperceptual_optZgan_optÚnet_d_itersr   Únet_d_init_iters)ÚoptÚgetr   r   Úinfor   ÚtoZdeviceÚ	net_g_emaZload_networkÚ	model_emaÚevalÚnet_dZmodel_to_deviceZprint_networkÚnet_gr
   r   Úcri_pixÚcri_perceptualÚcri_ganr   r   Úsetup_optimizersZsetup_schedulers)ÚselfÚ	train_optÚloggerZ	load_pathÚ	param_key© r"   úq/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/models/video_recurrent_gan_model.pyÚinit_training_settings   s@    

"


 

z-VideoRecurrentGANModel.init_training_settingsc                 C   sî   | j d }|d rng }g }| j ¡ D ]&\}}d|v r@| |¡ q$| |¡ q$||d dœ||d d dœg}n
| j ¡ }|d  d¡}| j||fi |d ¤Ž| _| j | j¡ |d	  d¡}| j|| j	 ¡ fi |d	 ¤Ž| _
| j | j
¡ d S )
Nr
   Zfix_flowÚspynetZlr_flow)r   ÚlrZoptim_gr&   ÚtypeZoptim_d)r   r   Únamed_parametersÚappendÚ
parametersÚpopZget_optimizerÚoptimizer_gZ
optimizersr   Úoptimizer_d)r   r   Znormal_paramsZflow_paramsÚnameÚparamZoptim_paramsZ
optim_typer"   r"   r#   r   D   s,    
þ
þû
 z'VideoRecurrentGANModel.setup_optimizersc              	   C   s¨  t ƒ }| j ¡ D ]
}d|_q| jrŽ|dkrn| d| j› d¡ | j ¡ D ]"\}}d|v s`d|v rH| d¡ qHn || jkrŽ| 	d¡ | j d¡ | j
 ¡  |  | j¡| _| j ¡ \}}}}}	d	}
tƒ }|| j d	krº|| jkrº| jr|  | j| j¡}|
|7 }
||d
< | jrp|  | j d|||	¡| j d|||	¡¡\}}|d urV|
|7 }
||d< |d urp|
|7 }
||d< |  | j d|||	¡¡}| j|ddd}|
|7 }
||d< |
 ¡  | j
 ¡  | j ¡ D ]}d|_qÄ| j ¡  |  | j d|||	¡¡}| j|ddd}||d< t | ¡ ¡|d< | ¡  |  | j d|||	¡ ¡ ¡}| j|ddd}||d< t | ¡ ¡|d< | ¡  | j ¡  |  |¡| _| jd	kr¤| j | jd d S )NFr   z+Fix flow network and feature extractor for z iters.r%   ZedvrzTrain all the parameters.Tr   Úl_g_pixéÿÿÿÿÚ
l_g_percepÚ	l_g_style)Zis_discÚl_g_ganÚl_d_realZ
out_d_realÚl_d_fakeZ
out_d_fake)Zdecay)!r   r   r*   Zrequires_gradZfix_flow_iterr   r   r(   Zrequires_grad_Úwarningr,   Z	zero_gradZlqÚoutputÚsizer   r   r   r   Úgtr   Úviewr   ZbackwardÚstepr-   ÚtorchÚmeanÚdetachZreduce_loss_dictZlog_dictr   r   )r   Úcurrent_iterr    Úpr.   r/   Ú_ÚcÚhÚwZ	l_g_totalZ	loss_dictr0   r2   r3   Zfake_g_predr4   Zreal_d_predr5   Zfake_d_predr6   r"   r"   r#   Úoptimize_parameterse   sj    


,





z*VideoRecurrentGANModel.optimize_parametersc                 C   sZ   | j dkr*| j| j| jgd|ddgd n|  | jd|¡ |  | jd|¡ |  ||¡ d S )Nr   r   r   r   )r!   r   )r   Zsave_networkr   r   r   Zsave_training_state)r   Úepochr@   r"   r"   r#   Úsave®   s
    
 zVideoRecurrentGANModel.saveN)Ú__name__Ú
__module__Ú__qualname__r$   r   rF   rH   r"   r"   r"   r#   r	      s   6!Ir	   )r=   Úcollectionsr   Zbasicsr.archsr   Zbasicsr.lossesr   Zbasicsr.utilsr   Zbasicsr.utils.registryr   Zvideo_recurrent_modelr   Úregisterr	   r"   r"   r"   r#   Ú<module>   s   