U
    ‰d '  ã                   @   sF   d dl Z d dlmZmZmZ d dlmZ d dlZG dd„ de j	ƒZ
dS )é    N)Ú	workspaceÚbrewÚmodel_helper)ÚGradientClippingc                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚGradientClippingTestc           
         s  t jdd}|j d¡}tj||dddd}tj||ddd	d}|j |d
¡}|j |dgd¡}|j |d¡}| 	|g¡‰ ‡ fdd„dD ƒ}t
dddd}	|	|j|d t dtj dd¡ tj¡¡ t dtj dd	¡ tj¡¡ t |j¡ t |j¡ |  t|j ¡ jƒd¡ d S )NÚtest©ÚnameÚdataÚfc1é   é   ©Zdim_inZdim_outÚfc2é   ÚsigmÚlabelÚsqÚlossc                    s   i | ]}|ˆ | “qS © r   ©Ú.0Úkey©Zgrad_mapr   úQ/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/modeling/gradient_clipping_test.pyÚ
<dictcomp>+   s      zGGradientClippingTest.test_gradient_clipping_by_norm.<locals>.<dictcomp>©Úfc1_wÚfc2_wÚby_normÚl2_normçš™™™™™¹?©Úgrad_clip_methodÚclip_norm_typeÚclip_thresholdr   é
   é   ©r   ÚModelHelperÚnetÚAddExternalInputr   ÚfcÚSigmoidÚSquaredL2DistanceÚSumElementsÚAddGradientOperatorsr   r   ÚFeedBlobÚnpÚrandomÚrandÚastypeÚfloat32Ú
RunNetOnceÚparam_init_netÚassertEqualÚlenÚProtoÚop©
ÚselfÚmodelr
   r   r   r   r   r   Úgrad_map_for_paramÚnet_modifierr   r   r   Útest_gradient_clipping_by_norm   s(    ýz3GradientClippingTest.test_gradient_clipping_by_normc           
         s  t jdd}|j d¡}tj||dddd}tj||ddd	d}|j |d
¡}|j |dgd¡}|j |d¡}| 	|g¡‰ ‡ fdd„dD ƒ}t
dddd}	|	|j|d t dtj dd¡ tj¡¡ t dtj dd	¡ tj¡¡ t |j¡ t |j¡ |  t|j ¡ jƒd¡ d S )Nr   r   r
   r   r   r   r   r   r   r   r   r   r   c                    s   i | ]}|ˆ | “qS r   r   r   r   r   r   r   L   s      zOGradientClippingTest.test_gradient_clipping_by_norm_l1_norm.<locals>.<dictcomp>r   r   Zl1_normr!   r"   r   r&   é   r(   r=   r   r   r   Ú&test_gradient_clipping_by_norm_l1_norm>   s(    ýz;GradientClippingTest.test_gradient_clipping_by_norm_l1_normc           
         s  t jdd}|j d¡}tj||dddd}tj||ddd	d}|j |d
¡}|j |dgd¡}|j |d¡}| 	|g¡‰ ‡ fdd„dD ƒ}t
ddddd}	|	|j|d t dtj dd¡ tj¡¡ t dtj dd	¡ tj¡¡ t |j¡ t |j¡ |  t|j ¡ jƒd¡ d S )Nr   r   r
   r   r   r   r   r   r   r   r   r   r   c                    s   i | ]}|ˆ | “qS r   r   r   r   r   r   r   m   s      zXGradientClippingTest.test_gradient_clipping_by_norm_using_param_norm.<locals>.<dictcomp>r   r   r    r!   T)r#   r$   r%   Úuse_parameter_normr   r&   é   r(   r=   r   r   r   Ú/test_gradient_clipping_by_norm_using_param_norm_   s*    üzDGradientClippingTest.test_gradient_clipping_by_norm_using_param_normc           
         s  t jdd}|j d¡}tj||dddd}tj||ddd	d}|j |d
¡}|j |dgd¡}|j |d¡}| 	|g¡‰ ‡ fdd„dD ƒ}t
dddddd}	|	|j|d t dtj dd¡ tj¡¡ t dtj dd	¡ tj¡¡ t |j¡ t |j¡ |  t|j ¡ jƒd¡ d S )Nr   r   r
   r   r   r   r   r   r   r   r   r   r   c                    s   i | ]}|ˆ | “qS r   r   r   r   r   r   r      s      zZGradientClippingTest.test_gradient_clipping_by_norm_compute_norm_ratio.<locals>.<dictcomp>r   r   r    r!   T)r#   r$   r%   rE   Zcompute_norm_ratior   r&   é   r(   r=   r   r   r   Ú1test_gradient_clipping_by_norm_compute_norm_ratio   s,    ûzFGradientClippingTest.test_gradient_clipping_by_norm_compute_norm_ratioc                    sN  t jdd}|j d¡}tj||dddd}tj||ddd	d}|j |d
¡}|j |dgd¡}|j |d¡}| 	|g¡‰ ‡ fdd„dD ƒ}d}	d}
t
d|	|
d}||j|d t dtj dd¡ tj¡¡ t dtj dd	¡ tj¡¡ t |j¡ t |j¡ |  t|j ¡ jƒd¡ t d¡}|  t |¡|	¡ |  t |¡|
¡ d S )Nr   r   r
   r   r   r   r   r   r   r   r   r   r   c                    s   i | ]}|ˆ | “qS r   r   r   r   r   r   r   ²   s      zHGradientClippingTest.test_gradient_clipping_by_value.<locals>.<dictcomp>r   g:Œ0âŽyE>r   Zby_value)r#   Úclip_maxÚclip_minr   r&   é   Ú
fc1_w_grad)r   r)   r*   r+   r   r,   r-   r.   r/   r0   r   r   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   Z	FetchBlobZassertLessEqualZamaxZassertGreaterEqualZamin)r>   r?   r
   r   r   r   r   r   r@   rJ   rK   rA   rM   r   r   r   Útest_gradient_clipping_by_value¤   s2    ý
z4GradientClippingTest.test_gradient_clipping_by_valuec           
         s  t jdd}|j d¡}tj||dddd}tj||ddd	d}|j |d
¡}|j |dgd¡}|j |d¡}| 	|g¡‰ ‡ fdd„dD ƒ}t
ddddgd d}	|	|j|d t dtj dd¡ tj¡¡ t dtj dd	¡ tj¡¡ t |j¡ t |j¡ |  t|j ¡ jƒd¡ d S )Nr   r   r
   r   r   r   r   r   r   r   r   r   r   c                    s   i | ]}|ˆ | “qS r   r   r   r   r   r   r   Ù   s      zWGradientClippingTest.test_gradient_clipping_by_norm_including_blobs.<locals>.<dictcomp>r   r   r    r!   r   ©r#   r$   r%   Zblobs_to_includeZblobs_to_excluder   r&   é   r(   r=   r   r   r   Ú.test_gradient_clipping_by_norm_including_blobsË   s,    ûzCGradientClippingTest.test_gradient_clipping_by_norm_including_blobsc           
         s   t jdd}|j d¡}tj||dddd}tj||ddd	d}|j |d
¡}|j |dgd¡}|j |d¡}| 	|g¡‰ ‡ fdd„dD ƒ}t
dddd ddgd}	|	|j|d t dtj dd¡ tj¡¡ t dtj dd	¡ tj¡¡ t |j¡ t |j¡ |  t|j ¡ jƒd¡ d S )Nr   r   r
   r   r   r   r   r   r   r   r   r   r   c                    s   i | ]}|ˆ | “qS r   r   r   r   r   r   r   ü   s      zWGradientClippingTest.test_gradient_clipping_by_norm_excluding_blobs.<locals>.<dictcomp>r   r   r    r!   r   r   rO   r   r&   é   r(   r=   r   r   r   Ú.test_gradient_clipping_by_norm_excluding_blobsî   s,    ûzCGradientClippingTest.test_gradient_clipping_by_norm_excluding_blobsN)
Ú__name__Ú
__module__Ú__qualname__rB   rD   rG   rI   rN   rQ   rS   r   r   r   r   r      s   !!"#'#r   )ZunittestZcaffe2.pythonr   r   r   Z(caffe2.python.modeling.gradient_clippingr   Znumpyr2   ZTestCaser   r   r   r   r   Ú<module>   s   