U
    d                     @   sD   d dl mZmZ d dlmZ d dlmZ d dlZG dd deZdS )    )brew	workspace)ModelHelper)
caffe2_pb2Nc                       sb  e Zd ZdZdS fdd	ZdTdd	Zd
d Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Z d@dA Z!dBdC Z"e#dDdE Z$dFdG Z%e#dHdI Z&e#dJdK Z'dLdM Z(e#dNdO Z)e#dUdQdRZ*  Z+S )VCNNModelHelperzA helper model so we can write CNN models more easily, without having to
    manually define parameter initializations and operators separately.
    NCHWNTFc	           
         s   t d |||d}	|r"||	d< tt| j||d kr:dn||||	d || _|| _|| _|| _| jdkr| jdkrt	d| j d S )	Na  [====DEPRECATE WARNING====]: you are creating an object from CNNModelHelper class which will be deprecated soon. Please use ModelHelper object with brew module. For more information, please refer to caffe2.ai and python/brew.py, python/brew_test.py for more information.)order	use_cudnncudnn_exhaustive_searchws_nbytes_limitZCNN)skip_sparse_optimnameinit_paramsparam_modelZ	arg_scopeZNHWCr   z+Cannot understand the CNN storage order %s.)
loggingwarningsuperr   __init__r   r	   r
   r   
ValueError)
selfr   r   r	   r
   r   r   r   r   Zcnn_arg_scope	__class__ 5/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/cnn.pyr      s0    	
zCNNModelHelper.__init__c                 K   s   t j| ||f| j|d|S )N)r   use_gpu_transform)r   Zimage_inputr   )r   blob_inblob_outr   kwargsr   r   r   
ImageInput8   s    zCNNModelHelper.ImageInputc                 K   s   t j| ||f|S N)r   Zvideo_inputr   r   r   r   r   r   r   
VideoInputB   s    zCNNModelHelper.VideoInputc                 K   s   | j j||f| d S r   )netPadImager    r   r   r   r#   J   s    zCNNModelHelper.PadImagec                 O   s(   t j| f|| j| j| j| jd|S N)r	   r   r
   r   )r   Zconv_ndr	   r   r
   r   r   argsr   r   r   r   ConvNdN   s    zCNNModelHelper.ConvNdc                 O   s(   t j| f|| j| j| j| jd|S r$   )r   convr	   r   r
   r   r%   r   r   r   ConvY   s    zCNNModelHelper.Convc                 O   s(   t j| f|| j| j| j| jd|S r$   )r   Zconv_transposer	   r   r
   r   r%   r   r   r   ConvTransposed   s    zCNNModelHelper.ConvTransposec                 O   s(   t j| f|| j| j| j| jd|S r$   )r   Z
group_convr	   r   r
   r   r%   r   r   r   	GroupConvo   s    zCNNModelHelper.GroupConvc                 O   s(   t j| f|| j| j| j| jd|S r$   )r   Zgroup_conv_deprecatedr	   r   r
   r   r%   r   r   r   GroupConv_Deprecatedz   s    z#CNNModelHelper.GroupConv_Deprecatedc                 O   s   t j| f||S r   )r   Zfcr%   r   r   r   FC   s    zCNNModelHelper.FCc                 O   s   t j| f||S r   )r   Z	packed_fcr%   r   r   r   PackedFC   s    zCNNModelHelper.PackedFCc                 O   s   t j| f||S r   )r   Zfc_pruner%   r   r   r   FC_Prune   s    zCNNModelHelper.FC_Prunec                 O   s   t j| f||S r   )r   Z	fc_decompr%   r   r   r   	FC_Decomp   s    zCNNModelHelper.FC_Decompc                 O   s   t j| f||S r   )r   Z	fc_sparser%   r   r   r   	FC_Sparse   s    zCNNModelHelper.FC_Sparsec                 O   s    t j| f|| j| jd|S N)r   r	   )r   Zdropoutr   r	   r%   r   r   r   Dropout   s     zCNNModelHelper.Dropoutc                 O   s    t j| f|| j| jd|S r2   )r   Zlrnr   r	   r%   r   r   r   LRN   s     zCNNModelHelper.LRNc                 O   s   t j| f|d| ji|S Nr	   )r   Zsoftmaxr	   r%   r   r   r   Softmax   s    zCNNModelHelper.Softmaxc                 O   s   t j| f|d| ji|S Nr   )r   Z
spatial_bnr   r%   r   r   r   	SpatialBN   s    zCNNModelHelper.SpatialBNc                 O   s   t j| f|d| ji|S r7   )r   Z
spatial_gnr   r%   r   r   r   	SpatialGN   s    zCNNModelHelper.SpatialGNc                 O   s   t j| f|d| ji|S r7   )r   Zinstance_normr   r%   r   r   r   InstanceNorm   s    zCNNModelHelper.InstanceNormc                 O   s    t j| f|| j| jd|S r2   )r   Zrelur   r	   r%   r   r   r   Relu   s     zCNNModelHelper.Reluc                 O   s   t j| f||S r   )r   Zprelur%   r   r   r   PRelu   s    zCNNModelHelper.PReluc                 O   s   t j| f|d| ji|S r7   )r   concatr   r%   r   r   r   Concat   s    zCNNModelHelper.Concatc                 O   s   t d | j||S )z=The old depth concat function - we should move to use concat.z.DepthConcat is deprecated. use Concat instead.)printr>   r%   r   r   r   DepthConcat   s    zCNNModelHelper.DepthConcatc                 O   s   t j| f||S r   )r   sumr%   r   r   r   Sum   s    zCNNModelHelper.Sumc                 O   s   t j| f|d| ji|S r5   )r   Z	transposer	   r%   r   r   r   	Transpose   s    zCNNModelHelper.Transposec                 O   s   t j| f||S r   )r   iterr%   r   r   r   Iter   s    zCNNModelHelper.Iterc                 O   s   t j| f||S r   )r   Zaccuracyr%   r   r   r   Accuracy   s    zCNNModelHelper.Accuracyc                 O   s    t j| f|| j| jd|S N)r	   r   )r   Zmax_poolr	   r   r%   r   r   r   MaxPool   s     zCNNModelHelper.MaxPoolc                 O   s   t j| f|d| ji|S r7   )r   Zmax_pool_with_indexr   r%   r   r   r   MaxPoolWithIndex   s    zCNNModelHelper.MaxPoolWithIndexc                 O   s    t j| f|| j| jd|S rG   )r   Zaverage_poolr	   r   r%   r   r   r   AveragePool   s     zCNNModelHelper.AveragePoolc                 C   s   di fS )NZ
XavierFillr   r   r   r   r   
XavierInit   s    zCNNModelHelper.XavierInitc                 C   s   dt |dfS )NConstantFill)value)dict)r   rN   r   r   r   ConstantInit   s    zCNNModelHelper.ConstantInitc                 C   s   di fS )NZMSRAFillr   rK   r   r   r   MSRAInit   s    zCNNModelHelper.MSRAInitc                 C   s   di fS )NrM   r   rK   r   r   r   ZeroInit   s    zCNNModelHelper.ZeroInitc                 C   s   t | |S r   )r   Zadd_weight_decay)r   Zweight_decayr   r   r   AddWeightDecay   s    zCNNModelHelper.AddWeightDecayc                 C   s   t  }t j|_|S r   )r   DeviceOptionCPUdevice_type)r   device_optionr   r   r   rU      s    zCNNModelHelper.CPUr   c                 C   s   t  }tj|_||_|S r   )r   rT   r   ZGpuDeviceTyperV   Z	device_id)r   Zgpu_idrW   r   r   r   GPU   s    zCNNModelHelper.GPU)r   NTFNTFN)F)r   ),__name__
__module____qualname____doc__r   r   r!   r#   r'   r)   r*   r+   r,   r-   r.   r/   r0   r1   r3   r4   r6   r8   r9   r:   r;   r<   r>   r@   rB   rC   rE   rF   rH   rI   rJ   propertyrL   rP   rQ   rR   rS   rU   rX   __classcell__r   r   r   r   r      sf            %





r   )	Zcaffe2.pythonr   r   Zcaffe2.python.model_helperr   Zcaffe2.protor   r   r   r   r   r   r   <module>   s   