B
    #=6\[                 @   st   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mZ d dlm	Z	 d dl
mZ d dlZG d	d
 d
e	ZdS )    )absolute_import)division)print_function)unicode_literals)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__ 4/tmp/pip-install-l3r2oljg/torch/caffe2/python/cnn.pyr      s(    
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 )N)netPadImage)r   r   r   r    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 )N)r   r   r   r   )r   convr   r   r   r   )r   r%   r    r   r   r   ConvY   s    zCNNModelHelper.Convc             O   s(   t j| f|| j| j| j| jd|S )N)r   r   r   r   )r   Zconv_transposer   r   r   r   )r   r%   r    r   r   r   ConvTransposed   s    zCNNModelHelper.ConvTransposec             O   s(   t j| f|| j| j| j| jd|S )N)r   r   r   r   )r   Z
group_convr   r   r   r   )r   r%   r    r   r   r   	GroupConvo   s    zCNNModelHelper.GroupConvc             O   s(   t j| f|| j| j| j| jd|S )N)r   r   r   r   )r   Zgroup_conv_deprecatedr   r   r   r   )r   r%   r    r   r   r   GroupConv_Deprecatedz   s    z#CNNModelHelper.GroupConv_Deprecatedc             O   s   t j| f||S )N)r   Zfc)r   r%   r    r   r   r   FC   s    zCNNModelHelper.FCc             O   s   t j| f||S )N)r   Z	packed_fc)r   r%   r    r   r   r   PackedFC   s    zCNNModelHelper.PackedFCc             O   s   t j| f||S )N)r   Zfc_prune)r   r%   r    r   r   r   FC_Prune   s    zCNNModelHelper.FC_Prunec             O   s   t j| f||S )N)r   Z	fc_decomp)r   r%   r    r   r   r   	FC_Decomp   s    zCNNModelHelper.FC_Decompc             O   s   t j| f||S )N)r   Z	fc_sparse)r   r%   r    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   r   r   Dropout   s    zCNNModelHelper.Dropoutc             O   s    t j| f|| j| jd|S )N)r   r   )r   Zlrnr   r   )r   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   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   r   r   	SpatialBN   s    zCNNModelHelper.SpatialBNc             O   s   t j| f|d| ji|S )Nr   )r   Z
spatial_gnr   )r   r%   r    r   r   r   	SpatialGN   s    zCNNModelHelper.SpatialGNc             O   s   t j| f|d| ji|S )Nr   )r   Zinstance_normr   )r   r%   r    r   r   r   InstanceNorm   s    zCNNModelHelper.InstanceNormc             O   s    t j| f|| j| jd|S )N)r   r   )r   Zrelur   r   )r   r%   r    r   r   r   Relu   s    zCNNModelHelper.Reluc             O   s   t j| f||S )N)r   Zprelu)r   r%   r    r   r   r   PRelu   s    zCNNModelHelper.PReluc             O   s   t j| f|d| ji|S )Nr   )r   concatr   )r   r%   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   r   r   DepthConcat   s    zCNNModelHelper.DepthConcatc             O   s   t j| f||S )N)r   sum)r   r%   r    r   r   r   Sum   s    zCNNModelHelper.Sumc             O   s   t j| f|d| ji|S )Nr   )r   Z	transposer   )r   r%   r    r   r   r   	Transpose   s    zCNNModelHelper.Transposec             O   s   t j| f||S )N)r   iter)r   r%   r    r   r   r   Iter   s    zCNNModelHelper.Iterc             O   s   t j| f||S )N)r   Zaccuracy)r   r%   r    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   r   r   MaxPool   s    zCNNModelHelper.MaxPoolc             O   s   t j| f|d| ji|S )Nr   )r   Zmax_pool_with_indexr   )r   r%   r    r   r   r   MaxPoolWithIndex   s    zCNNModelHelper.MaxPoolWithIndexc             O   s    t j| f|| j| jd|S )N)r   r   )r   Zaverage_poolr   r   )r   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   rH   r   r   r   ConstantInit   s    zCNNModelHelper.ConstantInitc             C   s   di fS )NZMSRAFillr   )r   r   r   r   MSRAInit   s    zCNNModelHelper.MSRAInitc             C   s   di fS )NrG   r   )r   r   r   r   ZeroInit   s    zCNNModelHelper.ZeroInitc             C   s   t | |S )N)r   Zadd_weight_decay)r   Zweight_decayr   r   r   AddWeightDecay   s    zCNNModelHelper.AddWeightDecayc             C   s   t  }t j|_|S )N)r	   DeviceOptionCPUdevice_type)r   device_optionr   r   r   rO      s    zCNNModelHelper.CPUr   c             C   s   t  }tj|_||_|S )N)r	   rN   r   ZGpuDeviceTyperP   Z	device_id)r   Zgpu_idrQ   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.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r:   r<   r>   r?   rA   rB   rC   rD   rE   propertyrF   rJ   rK   rL   rM   rO   rR   __classcell__r   r   )r   r   r
      sX       !

r
   )
__future__r   r   r   r   Zcaffe2.pythonr   r   Zcaffe2.python.model_helperr   Zcaffe2.protor	   r   r
   r   r   r   r   <module>   s   